您当前的位置: 首页 >  Jave.Lin 算法

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

Jave.Lin 发布时间:2012-03-30 14:04:27 ,浏览量:4

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

简单的三角形类:

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.=new Vector.();
		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 && tempA=Math.PI/2 && tempA=(Math.PI/2+_angle2) && tempA=-Math.PI && tempA=(-Math.PI+_angle1) && tempA=-Math.PI/2 && tempA=-_angle1 && tempA=0 && tempA=_angle1 && tempA=num1Right && tempA=num2Right && tempA=num4Left && tempA=num4Right && tempA=num5Right && tempA=num6Right && tempA            
关注
打赏
1688896170
查看更多评论
0.2279s