AS3 算法,菱形分8份三角形,检测点在哪个个三角形中

原创 2012年03月30日 14:04:27

今天,由于公事,研究了一下,算法:


简单的三角形类:

package
{
	import flash.display.Sprite;
	import flash.geom.Point;

	/**
	 * 三角形
	 * @author Jave.Lin
	 */	
	public class Triangle extends Sprite
	{
		private var _p1:Point;
		private var _p2:Point;
		private var _p3:Point;
		private var _c:uint;
		
		public function get p1():Point{return _p1;}
		public function get p2():Point{return _p2;}
		public function get p3():Point{return _p3;}
		public function get c():uint{return _c;}
		
		public function set p1(value:Point):void
		{
			if(value.x!=_p1.x && value.y!=_p1.y)
			{
				_p1=value;
				redraw();
			}
		}
		public function set p2(value:Point):void
		{
			if(value.x!=_p2.x && value.y!=_p2.y)
			{
				_p2=value;
				redraw();
			}
		}
		public function set p3(value:Point):void
		{
			if(value.x!=_p3.x && value.y!=_p3.y)
			{
				_p3=value;
				redraw();
			}
		}
		
		public function Triangle($p1:Point,$p2:Point,$p3:Point,$c:uint=0xff0000)
		{
			super();
			setPointsRedraw($p1,$p2,$p3,$c);
		}
		
		public function setPointsRedraw($p1:Point,$p2:Point,$p3:Point,$c:uint=0xff0000):void
		{
			_p1=$p1;
			_p2=$p2;
			_p3=$p3;
			_c=$c;
			redraw();
		}
		
		private function redraw():void
		{
			// clear
			this.graphics.clear();
			// begine and set style
			this.graphics.beginFill(_c,0.5);
			this.graphics.lineStyle(1,_c,0.5);
			// start position
			this.graphics.moveTo(_p1.x,_p1.y);
			
			// draw lines
			this.graphics.lineTo(_p2.x,_p2.y);
			this.graphics.lineTo(_p3.x,_p3.y);
			this.graphics.lineTo(_p1.x,_p1.y);
			
			// end draw
			this.graphics.endFill();
		}
	}
}

菱形类:

package
{
	import flash.display.Sprite;
	/**
	 * 菱形类
	 * @author Jave.Lin
	 */
	public class Diamond extends Sprite
	{
		protected var _xR:Number;
		protected var _yR:Number;
		
		public function get xR():Number{return _xR;}
		public function set xR(value:Number):void
		{
			if(value!=_xR)
			{
				_xR=value;
				redraw();
			}
		}
		
		public function get yR():Number{return _yR;}
		public function set yR(value:Number):void
		{
			if(value!=_yR)
			{
				_yR=value;
				redraw();
			}
		}
		
		public function Diamond($xR:Number,$yR:Number)
		{
			setXYRAndRedraw($xR,$yR);
		}
		
		public function setXYRAndRedraw($xR:Number,$yR:Number):void
		{
			_xR=$xR;
			_yR=$yR;
			redraw();
		}
		
		private function redraw():void
		{
			// clear
			this.graphics.clear();
			// begine and set style
			this.graphics.beginFill(0xff0000,0.5);
			this.graphics.lineStyle(1,0xff0000,0.5);
			// start position
			this.graphics.moveTo(_xR,0);
			
			// draw lines
			this.graphics.lineTo(0,_yR);
			this.graphics.lineTo(-_xR,0);
			this.graphics.lineTo(0,-_yR);
			this.graphics.lineTo(_xR,0);
			
			// end draw
			this.graphics.endFill();
		}
	}
}

菱形扩展类:

package
{
	import flash.geom.Point;
	import flash.utils.getTimer;

	/**
	 * 菱形的一个扩展类
	 * @author Jave.Lin
	 */	
	public class DiamondExt extends Diamond
	{
		private var _triangles:Vector.<Triangle>=new Vector.<Triangle>();
		private var _angle1:Number;
		private var _angle2:Number;
		
		public function DiamondExt($xR:Number, $yR:Number)
		{
			super($xR, $yR);
			generateTriangle();
		}
		
		private function generateTriangle():void
		{
//			_angle1=Math.abs(Math.tan(_yR/_xR));//有误差?
			_angle1=Math.abs(Math.atan2((-_yR-0),((0-(-_xR)))));
			if(_angle1>(Math.PI/2))_angle1-=(Math.PI/2);
			
			_angle2=Math.PI/2-_angle1;
			
			_triangles[0]=new Triangle(
				new Point(0,0),new Point(_xR,0),new Point(_xR/2,_yR/2));
			_triangles[1]=new Triangle(
				new Point(0,0),new Point(_xR/2,_yR/2),new Point(0,_yR));
			_triangles[2]=new Triangle(
				new Point(0,0),new Point(0,_yR),new Point(-(_xR/2),_yR/2));
			_triangles[3]=new Triangle(
				new Point(0,0),new Point(-(_xR/2),_yR/2),new Point(-_xR,0));
			_triangles[4]=new Triangle(
				new Point(0,0),new Point(-_xR,0),new Point(-(_xR/2),-(_yR/2)));
			_triangles[5]=new Triangle(
				new Point(0,0),new Point(0,-_yR),new Point(-(_xR/2),-(_yR/2)));
			_triangles[6]=new Triangle(
				new Point(0,0),new Point(_xR/2,-(_yR/2)),new Point(0,-_yR));
			_triangles[7]=new Triangle(
				new Point(0,0),new Point(_xR,0),new Point(_xR/2,-(_yR/2)));
				
			for (var i:int = 0; i < _triangles.length; i++) 
			{
				addChild(_triangles[i]);
			}
		}
		
		public function checkPointAndLightTheTriangle(point:Point):void
		{
			var tempA:Number=Math.atan2(point.y,point.x);
			
			resetTriangles();
			if(tempA>=0 && tempA<_angle1)
			{
				_triangles[0].alpha=0.5;
			}
			else if(tempA>=_angle1 && tempA<(_angle1+_angle2))
			{
				_triangles[1].alpha=0.5;
			}
			else if(tempA>=Math.PI/2 && tempA<(Math.PI/2+_angle2))
			{
				_triangles[2].alpha=0.5;
			}
			else if(tempA>=(Math.PI/2+_angle2) && tempA<Math.PI)
			{
				_triangles[3].alpha=0.5;
			}
			else if(tempA>=-Math.PI && tempA<(-Math.PI+_angle1))
			{
				_triangles[4].alpha=0.5;
			}
			else if(tempA>=(-Math.PI+_angle1) && tempA<-Math.PI/2)
			{
				_triangles[5].alpha=0.5;
			}
			else if(tempA>=-Math.PI/2 && tempA<-_angle1)
			{
				_triangles[6].alpha=0.5;
			}
			else if(tempA>=-_angle1 && tempA<0)
			{
				_triangles[7].alpha=0.5;
			}
		}
		
		public function testLargeNumSummaryPerformancea(point:Point,num:int=100000):void
		{
			var num1Right:Number=_angle1+_angle2;
			var num2Right:Number=Math.PI/2+_angle2;
			var num3Right:Number=Math.PI;
			var num4Left:Number=-Math.PI;
			var num4Right:Number=-Math.PI+_angle1;
			var num5Right:Number=-Math.PI/2;
			var num6Right:Number=-_angle1;
			
			var startTime:int=getTimer();
			var triangleNum:int=0;
			var tempA:Number=Math.atan2(point.y,point.x);
			
			for (var i:int = 0; i < num; i++) 
			{
				if(tempA>=0 && tempA<_angle1)
				{
					triangleNum=0;
				}
				else if(tempA>=_angle1 && tempA<num1Right)
				{
					triangleNum=1;
				}
				else if(tempA>=num1Right && tempA<num2Right)
				{
					triangleNum=2;
				}
				else if(tempA>=num2Right && tempA<num3Right)
				{
					triangleNum=3;
				}
				else if(tempA>=num4Left && tempA<num4Right)
				{
					triangleNum=4;
				}
				else if(tempA>=num4Right && tempA<num5Right)
				{
					triangleNum=5;
				}
				else if(tempA>=num5Right && tempA<num6Right)
				{
					triangleNum=6;
				}
				else if(tempA>=num6Right && tempA<0)
				{
					triangleNum=7;
				}
			}
			
			var endTime:int=getTimer();
			
			trace("run "+num+" times elpasedTime:"+(endTime-startTime));
			// run 1000000 times elpasedTime : 26 ms 左右
		}
		
		public function resetTriangles():void
		{
			for (var i:int = 0; i < _triangles.length; i++) 
			{
				_triangles[i].alpha=1;
			}
		}
	}
}

应用示例:

package
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	
	public class DiamondTest extends Sprite
	{
		private var _diamond:Diamond;
		private var _triangle:Triangle;
		private var _diamondExt:DiamondExt;
		
		public function DiamondTest()
		{
			super();
			
			_diamond=new Diamond(50,25);
			addChild(_diamond);
			
			_diamond.x=200;
			_diamond.y=200;
			
			_diamond.addEventListener(MouseEvent.MOUSE_OVER,onDiamondOverHandler);
			_diamond.addEventListener(MouseEvent.MOUSE_OUT,onDiamondOutHandler);
			
			_triangle=new Triangle(new Point(0,0),new Point(25,-25),new Point(-25,-25),0x00ffff);
			addChild(_triangle);
			
			_triangle.x=50;
			_triangle.y=200;
			
			_diamondExt=new DiamondExt(50,25);
			addChild(_diamondExt);
			
			_diamondExt.x=400;
			_diamondExt.y=200;
			
			_diamondExt.addEventListener(MouseEvent.MOUSE_MOVE,onDiamondExtMoveHandler);
			_diamondExt.addEventListener(MouseEvent.MOUSE_OUT,onDiamondExtOutHandler);
		}
		
		private function onDiamondExtOutHandler(e:MouseEvent):void
		{
			_diamondExt.resetTriangles();
		}
		
		private function onDiamondExtMoveHandler(e:MouseEvent):void
		{
			_diamondExt.checkPointAndLightTheTriangle(new Point(mouseX-_diamondExt.x,mouseY-_diamondExt.y));
			_diamondExt.testLargeNumSummaryPerformancea(new Point(mouseX-_diamondExt.x,mouseY-_diamondExt.y));//,1000000);
		}
		
		private function onDiamondOverHandler(e:MouseEvent):void
		{
			trace("over");
		}
		
		private function onDiamondOutHandler(e:MouseEvent):void
		{
			trace("out");
		}
	}
}


设计前草稿图:



运行效果,用鼠标经过带有三角形的菱形,分别移动不同的三角形位置上,即可看到效果。

可以把这个扩展的菱形,长度弄大一些。

显示全图


版权声明:本文为博主原创文章,未经博主允许不得转载。

用JavaScript打印三角形、菱形、空心菱形

1、打印三角形 document.writeln("打印三角形"); for(var i=0;ii;j--){ document.w...
  • lokeyluoqi
  • lokeyluoqi
  • 2015年04月13日 11:25
  • 3342

Java用 * 打印图形-菱形、空心菱形、三角形等

Java用 * 打印图形-菱形、空心菱形、三角形等 输出菱形 输出下半边菱形 输出一侧菱形 输出空心菱形 输出上部分菱形 输出下部分菱形 输出三角形 输出靠右的三角形 输出靠左的三角形 输出九九乘法表...
  • Peng_Hong_fu
  • Peng_Hong_fu
  • 2016年10月18日 11:34
  • 16926

python 打印菱形、三角形、矩形

Python 打印等腰直角三角形 Python打印等边三角形 Python打印菱形 Python打印实心正方形 Python打印空心正方形...
  • FloraCHY
  • FloraCHY
  • 2017年04月20日 15:50
  • 5272

java 打印三角形,菱形的方法

public class MatrixPrint {      public static void main(String[]args){ MatrixPrint.printIsosceles...
  • seacean2000
  • seacean2000
  • 2013年06月21日 13:27
  • 2185

C#程序设计--控制台程序输出上下三角形和菱形

信息采集: 单纯用*号输出上下三角形和菱形,需要用到嵌套循环结构: 代码如下(本人新手,若有错误,请高手指点): using System; using System.Collections.G...
  • wto753135
  • wto753135
  • 2013年07月18日 14:07
  • 2789

php 用for循环做,金字塔,菱形,空三角

  • lqs745920569
  • lqs745920569
  • 2015年06月30日 01:46
  • 4373

Python判断三角形

#Copyright (c)2017, 东北大学软件学院学生 # All rightsreserved #文件名称:a.py # 作 者:孔云 #问题描述:编写程序,从键盘输入三条边...
  • u012369559
  • u012369559
  • 2017年09月13日 15:57
  • 1031

使用java代码打印三角形、平行四边形、菱形

/* 双重循环: 外循环控制:行 内层循环控制:列 */ //最最重要的是记住:外层循环控制行,内存循环控制列。同时要了解循环的一个执行流程 public class ForFor{ ...
  • zhongxu_yuan
  • zhongxu_yuan
  • 2016年08月15日 13:19
  • 3575

AS3 三角形填充

private var bmd:BitmapData = new BitmapData(800,600, false, 0); private var bmp:Bitmap = new Bitma...
  • kakaxi2222
  • kakaxi2222
  • 2016年02月26日 17:22
  • 252

浅谈纯CSS绘制圆形、椭圆形、菱形、三角形

利用border属性: 以下三角为例,把左、右、下边框设置为透明色或与背景色相同的颜色,推荐透明色,这样拓展性更好。 #triangle { width: 0; ...
  • zhouziyu2011
  • zhouziyu2011
  • 2017年03月01日 17:30
  • 721
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:AS3 算法,菱形分8份三角形,检测点在哪个个三角形中
举报原因:
原因补充:

(最多只允许输入30个字)