数据类:
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