检测点是否在三角形内

数据类:

package
{
	import flash.geom.Point;
	/**
	 * 三角形数据类
	 * @author Jave.Lin
	 */
	public class Triangle
	{
		public var p1:Point;
		public var p2:Point;
		public var p3:Point;
		
		public function Triangle($p1:Point,$p2:Point,$p3:Point)
		{
			p1=$p1;
			p2=$p2;
			p3=$p3;
		}
		
		public function checkPointIn(tp:Point):Boolean
		{
			var area:Number=getArea();
			var targetThreeTimesArea:Number=0;
			targetThreeTimesArea+=getAreaByPoints(tp,p1,p2);
			targetThreeTimesArea+=getAreaByPoints(tp,p2,p3);
			targetThreeTimesArea+=getAreaByPoints(tp,p3,p1);
			return targetThreeTimesArea==area||Math.abs(targetThreeTimesArea-area)<0.0001;
		}
		
		public function getArea():Number
		{
			return getAreaByPoints(p1,p2,p3);
		}
		
		public static function getAreaByPoints(p1:Point,p2:Point,p3:Point):Number
		{
			//			方法一
			//			利用两点之间距离公式,求出三角形的三边长a,b,c后,
			//			令p = (a+b+c)/2。再套入以下公式就可以求出三角形的面积S :
			//			S = sqrt(p*(p-a)*(p-b)*(p-c))
			var dx:Number=p1.x-p2.x;
			var dy:Number=p1.y-p2.y;
			var p1Len:Number=Math.sqrt(dx*dx+dy*dy);
			dx=p2.x-p3.x;
			dy=p2.y-p3.y;
			var p2Len:Number=Math.sqrt(dx*dx+dy*dy);
			dx=p3.x-p1.x;
			dy=p3.y-p1.y;
			var p3Len:Number=Math.sqrt(dx*dx+dy*dy);
			
			var p:Number=(p1Len+p2Len+p3Len)/2;
			return Math.sqrt(p*(p-p1Len)*(p-p2Len)*(p-p3Len));
		}
	}
}

形状类:

package
{
	import flash.display.Shape;
	import flash.events.MouseEvent;
	/**
	 * 三角形形状类
	 * @author Jave.Lin
	 */	
	public class TriangleShap extends Shape
	{
		private var _triangleData:Triangle;
		private var _c:uint=0xff0000;
		
		public function get triangleData():Triangle
		{
			return _triangleData;
		}
		
		public function TriangleShap($triangleData:Triangle)
		{
			super();
			_triangleData=$triangleData;
			redraw();
		}
		
		public function setColor($c:uint):void
		{
			_c=$c;
			redraw();
		}
		
		public function redraw():void
		{
			this.graphics.beginFill(_c);
			
			this.graphics.lineStyle(1,0);
			
			this.graphics.moveTo(_triangleData.p1.x,_triangleData.p1.y);
			this.graphics.lineTo(_triangleData.p2.x,_triangleData.p2.y);
			this.graphics.lineTo(_triangleData.p3.x,_triangleData.p3.y);
			this.graphics.lineTo(_triangleData.p1.x,_triangleData.p1.y);
			
			this.graphics.endFill();
		}
	}
}

测试类:

package
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	/**
	 * 测试类
	 * @author Jave.Lin
	 */
	public class TriangleShapTest extends Sprite
	{
		private var _triangleShape:TriangleShap;
		
		public function TriangleShapTest()
		{
			super();
			
			_triangleShape=new TriangleShap(
				new Triangle(
					new Point(200,200),
					new Point(300,200),
					new Point(250,300)));
			_triangleShape.setColor(0x00ff00);
			addChild(_triangleShape);
			
			stage.addEventListener(MouseEvent.CLICK,onClick);
		}
		
		private function onClick(e:MouseEvent):void
		{
			if(_triangleShape.triangleData.checkPointIn(new Point(mouseX,mouseY)))
			{
				_triangleShape.setColor(0xff0000);
			}
			else
			{
				_triangleShape.setColor(0x00ff00);
			}
				
		}
	}
}

鼠标未点中呈绿色:0x00ff00


鼠标点中,呈红色:0xff0000


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值