两个任意简单多边形相交判断问题

caodayong 2010-01-31 07:21:00
两个任意简单多边形的相交判断问题,我试了下论坛里的大部分算法(有可能有的我没看到),基本上都能给出反例,大家有没有什么好些的算法思路,交流一下,谢谢
...全文
1658 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
czy912000 2011-06-24
  • 打赏
  • 举报
回复
用第二类曲线积分与格林公式计算多边形面积,如果面积等于两个多边形各自的面积之和,则没有相交,如果小于,则相交。
xuededajia 2011-05-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xingzhe2001 的回复:]
你说得简单多边形是什么概念?凸体?凹体?球?
[/Quote]
要是包含关系呢?~也不相交啊~~也有点在另一个面内啊~~
CoolCodingMan 2010-02-20
  • 打赏
  • 举报
回复
顺便说一句,CGAL做的不好不等于NFP本身不好,CGAL的其实不是计算真正的NFP。 你查查几个国外主要期刊的论文,虽然不能从理论上被证明那些方法很完美,但是实际应用中基本上能处理各种很复杂的情形。当然,如果不适合运用nfp的场合就没必要去强求了。
CoolCodingMan 2010-02-20
  • 打赏
  • 举报
回复
NFP算法主要复杂在计算NFP这个多边形上,而对于后续的判交过程来说,几乎找不到更快的办法,我已经说过了NFP适合运用的场合。关于多边形判交的几种办法基本上是有定论的(至少在目前的研究阶段),所以没有必要再讨论了。
caodayong 2010-02-20
  • 打赏
  • 举报
回复
回复37楼:
如果NFP能正常求出的话,判交问题就转为点在多边形内的判断问题,自然简单了许多,但是我说的是NFP本身的求解过程是非常麻烦的,这样的话,对整体过程的时间消耗也是非常大的。
多边形判交是非常有必要讨论的,因为现在无论是三角剖分,凸剖分还是NFP的方法,涉及的计算量都比较大。
---------------------------------------------------
回复38楼:
我看了一些NFP求解的论文了,而且,也正在研究一个NFP求解的简化算法。
---------------------------------------------------
谢谢讨论,请大家继续
caodayong 2010-02-20
  • 打赏
  • 举报
回复
回复31楼:
“马赛克递归细分”是什么?
---------------------------------------------------
回复32楼:
你这个是有反例的,我想做到完美!
---------------------------------------------------
回复33楼:
NFP是肯定可以的,也是目前做此类问题的比较主流的思路了,但是NFP本身的形成是很复杂的,这也是为什么NFP出来这么多年,却一直让三角剖分思路占实际应用主体的原因。有个“计算几何库”CGAL,里面的源码我看了一下,它的NFP求解也分了好几个版本,但是两个凸多边形的比较好弄,而涉及到凹的时候,甚至于涉及到有“洞”在某个多边形的时候,CGAL也没完全做成完善的NFP求解。另外,用NFP在判交问题上,同样也存在时间复杂度高的问题。对于大规模的量的判交过程,这就会带来太多的时间消耗了。
---------------------------------------------------
---------------------------------------------------
---------------------------------------------------
---------------------------------------------------
caodayong 2010-02-20
  • 打赏
  • 举报
回复
---------------------------------------------------
回复18楼:
这个在我的定义里不算相交!
---------------------------------------------------
回复19楼:
你的说法,我个人认为是正确的,但是,如何在编程中定量的取这个部分边还有商榷之处。
---------------------------------------------------
回复24楼:
这个只是我整体工作的一块,所以,在整个程序中有显示测试部分的。
---------------------------------------------------
回复25楼:
是有凹的,其实,后期工作还会做到弧状的,呵呵,现在只是在弄简单多边形。
---------------------------------------------------
回复26楼:
你的这个想法有些剖分的思想,但是剖分本身的算法复杂性是比较高的,也就是说,速度上会有很大的影响,但是是可行的思路。
---------------------------------------------------
回复27楼:
这个明显不对了,反例:长方形A然后旋转它90度,形成十字架形式。
---------------------------------------------------
回复28楼:
两个边相交有“内交”和端点交的说法,希望你能在细细考虑一下;另:三角剖分肯定是可以的,这个是传统做法了,时间复杂度比较高。如果是大规模的判断的话,速度上会慢下来。
---------------------------------------------------
回复29楼:
见对28楼的回复
caodayong 2010-02-20
  • 打赏
  • 举报
回复
感谢大家的热烈讨论:
---------------------------------------------------
回复1楼:
是判断两个简单多边形是否相交
---------------------------------------------------
回复3楼:
这个是不可以的,反例:A是一个正方形,B是一个旋转了45度的正方形,且以A的对角线为边的。
---------------------------------------------------
回复5楼:
如若有某边上的一些点在另一个里面,的确可以判断相交问题,但是,编程实现的时候如何取这些点呢?
---------------------------------------------------
回复6楼:
图形的线之间有相交,分为端点彼此相交或者非端点相交,而若是端点相交的话,你的说法会出现反例的。
---------------------------------------------------
回复7楼:
你的这个想法有些剖分的思想,但是剖分本身的算法复杂性是比较高的,也就是说,速度上会有很大的影响,但是是可行的思路。
---------------------------------------------------
回复9楼:
是平面上的简单多边形,包括凹的。
---------------------------------------------------
回复10楼:
“如果两个多边形相交,应该至少有一个的顶点在另一个多边形内”这个说法是错误的,反例:长方形A然后旋转它90度,形成十字架形式。
至于“多边形的话可以枚举2个图形的边,判断是否有交点”,就涉及到两个边是端点相交还是非端点相交,反例很容易给出。
---------------------------------------------------
回复16楼:
感谢,我会去找下看看!
iwantnon 2010-02-12
  • 打赏
  • 举报
回复
感觉不能用点与多边形位置关系或者线段相交这些方法,
感觉应该用马赛克递归细分。
CoolCodingMan 2010-02-12
  • 打赏
  • 举报
回复
解答如下:
1. 通用算法。原理还是测试线段相交,但是为了加速整个过程,不必对两个多边形的每个线段两两测试是否相交。 可用包容矩形是否相交来加速整个过程。
步骤大致如下:
测试包容矩形是否相交,如相交,记录下来相交的矩形大小和位置,对于两个多边形中和相交矩形相交或在此相交矩形内的线段两两测试是否相交。
对于多边形不相交但是互相包容的情况需要附加测试多边形内的一点是否在另一多边形内。 如果接触也算相交的话,不必一定用多边形内一点,只需任一顶点即可。
2. NFP算法即no-fit polygon 算法,此算法需做预处理,适合多个和大量的计算相交和多边形之间距离的场合。此算法效率极高,比通用算法快几倍至上百上千倍(取决于多边形的顶点数和具体形状,当然预处理的时间不能算上)。但是求解非凸多边形的NFP算法非常复杂。基本上它把多边形位置关系判断转化为点和多边形的位置关系判断。

以上两种办法理论上均无漏洞,只要正确理解,肯定能得正解。
iwantnon 2010-02-12
  • 打赏
  • 举报
回复
写了一个交互测试程序,就是按“判断是否有某个多边形的顶点在另一个之内以及两多边形是否有相交边”来做的,虽然可能不是最好方法,但工作良好:

程序见:
http://wantnon.spaces.live.com/blog/cns!22376C1C5B93C0AD!487.entry?&_c02_vws=1
jeersoft 2010-02-05
  • 打赏
  • 举报
回复
这是一个曾经遇到过的问题。
解题思路如下:
1、将两个多边形转化为多个3角形
2、判断3角形是否相交即可。

关于如何分离任意多边形为三角形列表,思路大概如下:
1.假设任意多边形ABCDEF,记录每个点的位置信息
2.假设以A点为起始点,它可以连接C点或E点组成三角形ABC或AFE,判断组成三角形是否有效按照如下方式:
A、假设连接AE线,那么需要判断AEF三角形是否有效,以AE线为轴心线,除AE点在该线上,其它点都在同
一侧,那么AE连接为失败
B、如果AE线某一侧有一个点,其他点都在另外一侧,则需要如下判断:
除了AF和FE线段(注意是线段),还剩余线段BC和CD(跟A点和E点相连的线段除外),判断连接的AE
线段是否与BC和CD线段相交(是线段相交,这个算法不会的话,我就没有办法了。呵呵),
如果相交,则失败
如果不想交,则成功连接AFE三角形。
成功之后需要分离三角形AFE,那么剩下多边形ABCDE。重复执行分析,直到分离最后的三角形。

至此,已经将两个多边形分离成两个三角形列表。你需要做的工作就是判断两个列表中的三角形是否有相交。

大家交流一下。
solomonzy 2010-02-05
  • 打赏
  • 举报
回复
先生成TIN三角网,再依次判断是否有相交的三角形
jeersoft 2010-02-05
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 jeersoft 的回复:]
这是一个曾经遇到过的问题。
解题思路如下:
1、将两个多边形转化为多个3角形
2、判断3角形是否相交即可。

关于如何分离任意多边形为三角形列表,思路大概如下:
1.假设任意多边形ABCDEF,记录每个点的位置信息
2.假设以A点为起始点,它可以连接C点或E点组成三角形ABC或AFE,判断组成三角形是否有效按照如下方式:
  A、假设连接AE线,那么需要判断AEF三角形是否有效,以AE线为轴心线,除AE点在该线上,其它点都在同
    一侧,那么AE连接为失败
  B、如果AE线某一侧有一个点,其他点都在另外一侧,则需要如下判断:
    除了AF和FE线段(注意是线段),还剩余线段BC和CD(跟A点和E点相连的线段除外),判断连接的AE
    线段是否与BC和CD线段相交(是线段相交,这个算法不会的话,我就没有办法了。呵呵),
    如果相交,则失败
    如果不想交,则成功连接AFE三角形。
    成功之后需要分离三角形AFE,那么剩下多边形ABCDE。重复执行分析,直到分离最后的三角形。

至此,已经将两个多边形分离成两个三角形列表。你需要做的工作就是判断两个列表中的三角形是否有相交。

大家交流一下。
[/Quote]
可能有朋友提出这样的想法。
干脆分离两个多边形为两个线段列表,判断两个线段列表是否有相交,如果有则多边形相交,如果没有则不想交。
针对以上的思路,是因为忽略了一个特殊的情况,就是其中的一个多边形完全在另外一个多边形之内。用线段法的话,肯定是不想交的。大家可以思考一下。

希望分离三角形的思路有用。

判断两个三角形相交的方法,其实只要判断另外一个三角形的3个点是否在三角形之内即可。点是否在三角形之内是有现成的公式的。明白了么?
zeroieme 2010-02-05
  • 打赏
  • 举报
回复
用判断那个点是否在多边形内的问题的射线方法。
假如A多边形一部分顶点在B多边形内另一部分在B多边形外,就说明多边形相交。
  • 打赏
  • 举报
回复
挺6楼
keeya0416 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 donkey301 的回复:]
引用 3 楼 keeya0416 的回复:
判断一个多边形的边上的点是否有在另一个的多边形内部  不知可以不

这个是不行的,譬如两个正方形,其中一个旋转45度,那么他们相交,但点都不在另一个内。
[/Quote]
能提供个图么,我怎么想也是觉得一个多边形的边上的点有部分在另外一个多边形内部
michael122 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 keeya0416 的回复:]
两多边形相交,必有一个多边形的部分边在另外一个多边形内部,上边有人说这是错的,在下愚昧实在想不出反例,还请提供个图看下
[/Quote]

没错啊
十八道胡同 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 erwin1 的回复:]
引用 6 楼 mayer_mq 的回复:
开拓一下思维嘛,不要局限于判断形状与形状之间。
用线和线之间的关系去看就简单了。

不过如果一个形状在另一个内部的话,就不行了。

所以基本上可以这么写:
if(一个图形在另一个内部){
    重叠。
}else if(图形的线之间有相交){
    重叠。
}else{
    不重叠。
}

看看是否可行。



2个正方形~相切摆放~边有相交~不知道算不算是两图形相交了~
[/Quote]
这个算相交
因为有交点
iwantnon 2010-02-04
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 iwantnon 的回复:]
引用楼主 caodayong 的回复:
两个任意简单多边形的相交判断问题,我试了下论坛里的大部分算法(有可能有的我没看到),基本上都能给出反例,大家有没有什么好些的算法思路,交流一下,谢谢
写出一个能正确判断两个多边形是否相交的程序倒是容易...
[/Quote]
晕,我想当然了。
楼主好像也要求凹多边形,这个。。。就不容易了。
加载更多回复(21)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧