本站首页    管理页面    写新日志    退出

公告

You are all my reasons! 

桃李花林又一在

淫荡一日同风起,风骚直上九万里

仙子凌波微步罗衫飘忽十步一回头

我的最爱:网游,程序,文学

QQ:89636669


我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:一维空间
日志总数:163
评论数量:248
留言数量:33
访问次数:649706
建立时间:2007年10月24日




 [算法]判断点是否在多边形内的算法

dskongenius 发表于 2007/12/20 1:08:09

判断点是否在多边形内的算法如下。以点P为端点,向左方作射线L,由于多边形是有界的,所以射线L的左端一定在多边形外,考虑沿着L从无穷远处开始自左向右移动,遇到和多边形的第一个交点的时候,进入到了多边形的内部,遇到第二个交点的时候,离开了多边形,……所以很容易看出当L和多边形的交点数目C是奇数的时候,P在多边形内,是偶数的话P在多边形外。但是有些特殊情况要加以考虑。如果L和多边形的顶点相交,有些情况下交点只能计算一个,有些情况下交点不应被计算(你自己画个图就明白了);如果L和多边形的一条边重合,这条边应该被忽略不计。为了统一起见,我们在计算射线L和多边形的交点的时候,1。对于多边形的水平边不作考虑;2。对于多边形的顶点和L相交的情况,如果该顶点是其所属的边上纵坐标较大的顶点,则计数,否则忽略;3。对于P在多边形边上的情形,直接可判断P属于多边行。由此得出算法的伪代码如下:1. count ← 0;2. 以P为端点,作从右向左的射线L;  3, for 多边形的每条边s4.   do if P在边s上  5.          then return true;6.      if s不是水平的7.          then if s的一个端点在L上且该端点是s两端点中纵坐标较大的端点9.                  then count ← count+110.              else if s和L相交11.                 then count ← count+1;12. if count mod 2 = 1 13.   then return true14.   else return false;其中做射线L的方法是:设P'的纵坐标和P相同,横坐标为正无穷大(很大的一个正数),则P和P'就确定了射线L。这个算法的复杂度为O(n)。其中判断点是否在线段上的算法如下:设点为Q,线段为P1 P2 ,判断点Q在该线段上的依据是:( Q - P1 ) × ( P2 - P1 ) = 0  且 Q 在以 P1,P2为对角顶点的矩形内,其中矢量叉积定义为:P × Q = x1*y2 - x2*y1 得到的是一个标量。矢量减法就是x,y坐标分别相减,得到的还是一个矢量。判断线段是否相交的算法如下。我们分两步确定两条线段是否相交:1.     快速排斥试验设以线段 P1P2 为对角线的矩形为R, 设以线段 Q1Q2 为对角线的矩形为T,如果R和T不相交,显然两线段不会相交;2.     跨立试验如果两线段相交,则两线段必然相互跨立对方,如图1所示。在图1中,P1P2跨立Q1Q2 ,则矢量 ( P1 - Q1 ) 和( P2 - Q1 )位于矢量( Q2 - Q1 ) 的两侧,即( P1 - Q1 ) × ( Q2 - Q1 )  *  ( P2 - Q1 ) × ( Q2 - Q1 )  <  0        上式可改写成        ( P1 - Q1 ) × ( Q2 - Q1 )  *  ( Q2 - Q1 ) × ( P2 - Q1 )  >  0        当      ( P1 - Q1 ) × ( Q2 - Q1 ) = 0 时,说明         ( P1 - Q1 ) 和 ( Q2 - Q1 )共线,但是因为已经通过快速排斥试验,所以 P1 一定在线段 Q1Q2上;同理,( Q2 - Q1 ) ×( P2 - Q1 )  = 0 说明 P2 一定在线段 Q1Q2上。        所以判断P1P2跨立Q1Q2的依据是:        ( P1 - Q1 ) × ( Q2 - Q1 )  *  ( Q2 - Q1 ) × ( P2 - Q1 )  ≥  0        同理判断Q1Q2跨立P1P2的依据是:( Q1 - P1 ) × ( P2 - P1 )  *  ( P2 - P1 ) × ( Q2 - P1 )  ≥  0至此已经完全解决判断线段是否相交的问题。


阅读全文(2368) | 回复(0) | 编辑 | 精华

 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.185 second(s), page refreshed 144773239 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号