如何判断一个点是否在不规则图形内部?

网上查了下,有办法是说连接目标点与各顶点,然后算夹角,加起来为360度,则在内部,否则在外部,但是这种办法对凹形不对。

 

1) 我自己想了个办法:

     直接沿这个目标点画一条垂直线,跟各边形成的所有交点,都在目标点的同一侧,则在图形外,如果不在同一侧(凹形左旋转90度,不在同一侧)则继续画一根水平线,如果跟各边形成的所有交点,都在目标点的同一侧,则在图形外。

 

2) 还有个办法:

先设定图外一个点X,然后将测定点P和X之间连线PX,如果PX跟图的交点是偶数个(0,2,4,...)则测定点P在图外;如果交点是奇数个(1,3,5,...),则测定点P在图内。

也可以反过来做,就是先设定图内有一个点X,不过计算交点数量就要反过来,偶数说明测定点P在图内,奇数才是图外。



这样就把命题改变为:检查PX跟该多边形所有边线的总交点数量。线段和线段的交点,是可以用公式计算的。

参见我发布的帖子:http://topic.csdn.net/u/20120925/15/cf7d156e-be45-462b-932d-92f7ee61d400.html?seed=1889105761&r=79756354#r_79756354

 

代码:

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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
判断一个点是否不规则图形内,可以使用射线法和包围盒法相结合的方法。 具体做法如下: 1. 首先根据所有的坐标,计算得到一个包围盒,即最小矩形框,该包围盒的左上角坐标为`(x_min, y_min)`,右下角坐标为`(x_max, y_max)`。 2. 判断是否在包围盒内,如果不在,直接返回False。 3. 对于包围盒内的,向右射出一条射线,并计算该射线与不规则图形的边相交的次数。 4. 如果相交的次数为奇数,说明不规则图形内部;如果相交的次数为偶数,说明不规则图形外部。 需要注意的是,如果射线与不规则图形的边重合或者与顶重合,也需要计算在内,因为这也表示相交次数增加了。 以下是一个示例代码: ```python def is_point_in_irregular_polygon(x, y, points): # 计算包围盒 x_min = min([p[0] for p in points]) x_max = max([p[0] for p in points]) y_min = min([p[1] for p in points]) y_max = max([p[1] for p in points]) # 判断是否在包围盒内 if x < x_min or x > x_max or y < y_min or y > y_max: return False # 计算交数量 num_intersections = 0 for i in range(len(points)): x1, y1 = points[i] x2, y2 = points[(i + 1) % len(points)] if ((y1 <= y < y2) or (y2 <= y < y1)) and (x < max(x1, x2)): # 计算交的 x 坐标 x_inter = (y - y1) * (x2 - x1) / (y2 - y1) + x1 if (x_inter == x): # 如果交和顶重合,也需要计算在内 return True if (x_inter > x): # 如果交在右侧,计数加一 num_intersections += 1 # 判断数量的奇偶性 return (num_intersections % 2 == 1) ``` 这个示例代码只适用于简单的不规则多边形,如果是复杂的不规则图形,需要使用更复杂的算法,例如扫描线算法等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值