网上查了下,有办法是说连接目标点与各顶点,然后算夹角,加起来为360度,则在内部,否则在外部,但是这种办法对凹形不对。
1) 我自己想了个办法:
直接沿这个目标点画一条垂直线,跟各边形成的所有交点,都在目标点的同一侧,则在图形外,如果不在同一侧(凹形左旋转90度,不在同一侧)则继续画一根水平线,如果跟各边形成的所有交点,都在目标点的同一侧,则在图形外。
2) 还有个办法:
先设定图外一个点X,然后将测定点P和X之间连线PX,如果PX跟图的交点是偶数个(0,2,4,...)则测定点P在图外;如果交点是奇数个(1,3,5,...),则测定点P在图内。
也可以反过来做,就是先设定图内有一个点X,不过计算交点数量就要反过来,偶数说明测定点P在图内,奇数才是图外。
这样就把命题改变为:检查PX跟该多边形所有边线的总交点数量。线段和线段的交点,是可以用公式计算的。
代码:
http://stackoverflow.com/questions/8721406/how-to-determine-if-a-point-is-inside-a-2d-convex-polygon
/**
* 验证测试点是否在图形内
*/
private function validateRoom(roomNodes:ArrayCollection,nowPosition:Point):Boolean{
var points:Array = new Array();
for each(var node:Node in roomNodes){
points.push(node.location);
}
var i:int;
var j:int;
var result:Boolean = false;
for (i = 0, j = points.length - 1; i < points.length; j = i++) {
if ((points[i].y > nowPosition.y) != (points[j].y > nowPosition.y) &&
(nowPosition.x < (points[j].x - points[i].x) * (nowPosition.y - points[i].y) / (points[j].y-points[i].y) + points[i].x)) {
result = !result;
}
}
return result;
}