Sean.Pu的专栏

--问题有很多种,解决问题的方法更多 (提供开放性博客迁移服务:http://www.blogmove.cn)

原创 数学之美--不规则多边形相交计算(1)收藏

新一篇:  数学之美--不规则多边形重叠计算(2) | 旧一篇: 自博评说

数学之美--不规则多边形相交计算

前言

       我决定写一些技术类的文章,想了半天都不知道从何入手,从编程语言方面来看C#,Java,C++以及python等我的基本功很差;如果从应用角度来完成某些的话,虽然工作流是我的长项,但是如果需要完整来描述工作流的话,我又要死掉无数的脑细胞.无果

       最后在看Googleblog的时候突发奇想:我也可以来写写数学之美”,虽然我的大学数学学的并不好,但本文涉及的数学知识基本都是高中的.我也不排斥各位对于本文的问题有更好的解决方案.

       Ok,let’s go!

问题

       时光回溯到20044,我刚进入X公司不久,公司当时已经开始做广东某地区国土局的MIS.对方提出了一个要求:他们给出两组坐标,这两组坐标分别代表两个采矿区,他们要求我们提供一个计算功能可以算出这两个物理矿区是否有重叠.

       说的简单点就是:

1.        已知两个不规则多边形;

2.        计算出两个多边形是否相交;

3.        给出算法.

用下面的图来表示一下:

           

效果1表示1”2”两个图并没有相交

     

效果2”表示由于1”的右平移和2”相交并且有重叠的区域.

当然还有效果31’放大后完全容纳2’效果41’2’完全一样,产生重合”,但是在这里我们不考虑那么多.

X公司不是专门做GIS,没有专业的工具可用.也没有人做过GIS,在我接手之前已经有几个人花了无数的时间去解决这个问题,都没有成功.

这些人的学历都比我高,包括X公司当时的副总经理原来是教大学数学的.所以我才会在自己的blog回复某个评论时说本科生和研究生未必不能来做编码”,因为这么多年来我看过很多本科生,研究生,甚至博士的编码都不合格.

当时把这个问题交给我或许他们都是在尝试运气,只不过他们的运气确实比较好.

我暂时写到这里,把这个问题放三天,看看各位同学对于两个不规则多边形是否相交有好的解决方法和思路!

一方面真诚的欢迎大家提出自己的思路,另一方面也看看CSDNer的水平,呵呵.

PS:1,不能使用专业的GIS系统来解决这个问题;2,解决问题的方法不能超过大学水平.

          (本文不涉及商业机密,所以发表本文不涉及职业道德和相关保密条例)

发表于 @ 2006年08月12日 23:52:00|评论(loading...)|编辑

新一篇:  数学之美--不规则多边形重叠计算(2) | 旧一篇: 自博评说

评论

#Sean.Pu 发表于2006-08-13 18:23:00  IP: 61.141.91.*
to vistor_rotisiv : the pay i get more 3times than construction workers
#visitor_rotisiv 发表于2006-08-13 17:21:00  IP: 140.247.103.*
isn't it a standard computational geometry problem? Don't know what's the value for that. Maybe that's the reason you earn not much more than construction workers.
#Sean.Pu 发表于2006-08-13 18:43:00  IP: 61.141.91.*
if someone have solution,thanks for tell me
#恋花蝶 发表于2006-08-15 11:10:00  IP: 218.107.55.*
问题很复杂,但解决方案却可以非常简单。
从学术角度上来说,当然得把多边形分解成若干个三角形,然后再逐个匹对,这是一个复杂度很高的算法。忽略分解为三解形的算法的复杂度,单是匹配的复杂度就算死人了,假设有M个多边形,每一个多边形平均可以分解为N个三角形,那匹配的复杂度就是M的N次方,指数嘿嘿,算死了。
所以,从应用角度上来讲,不应该使用这样的算法。因为我们有多边形所有点的坐标,那么我们可以求得一个包含所有多边形的最小包容矩形(定为名table),我们把这个最小包容矩形分块,比如分成20×20块或者100×100块,当然,这里的块数越大越好,越大意味着越精确,计算量也越大,看实际需要啦。分好后把一个一个把多边形也分块并映射到这个table上的格子中去,如果这个格子没有被映射过,则置一个标志位为True,然后被映射过,那就是相交啦。
多边形分解为三角形是很复杂的算法,而且那个匹配算法的复杂度也是非常高的,使用table算法可以去掉分解三角形,而且匹配的复杂度也降到线性级别,不知道楼主的算法是怎么样的呢?
#Sean.Pu 发表于2006-08-15 11:42:00  IP: 58.60.185.*
非常感谢“恋花蝶”的回复和发表自己的想法,但是非常遗憾的是你把这个问题复杂化了。我最初也同你一样。我后来找到的解决问题的方法非常之简单。
等我今天晚上同美女吃完饭再来完成第二部分
#Sean.Pu 发表于2006-08-15 15:24:00  IP: 58.60.185.*
to nile blakc:我最初也是这么想的,基本算法也是同这个查不多,不过还是有些理论差距,呵呵
#Sean.Pu 发表于2006-08-15 15:45:00  IP: 58.60.185.*
不能说差距,应该说差异。这种线段相交有个重合的问题需要解决
#nile black 发表于2006-08-15 14:00:00  IP: 220.184.141.*
忘了不知道叫什么算法来着,好像可以把问题转化成求边的交点就可以判断,是否有边的相交,
对于两条线断相交的算法,也是采用边相交的方法,对于独立的算法可以执行。
也可以把两者综合起来得到更优化的解法
对于最坏的不优化的情况下 10 边的 只要 10*10
#Peter 发表于2006-08-15 18:11:00  IP: 61.48.50.*
求出图一中多边形内部所有坐标。
再将图二顶点坐标依次比较,若有相同则重叠。
#恋花蝶 发表于2006-08-15 18:10:00  IP: 218.107.55.*
首先:虽然用线段相交的方法比三角形相交的方法快速一些,但仍然是一个M的N次的指数级算法,如果每个多边形的线段很多比如100条,然后有100个这样的多边形,那就要判断100的100次方次,稍有数学常识的人都知道这超出了计算机的能力了~ 我提出的算法是可以解决这样的一个级别的问题的,甚至更大也可以,应该这是一个线性复杂度的算法。

其次:用线段的算法没有扩展性,如果客户要求得到相交的多边形的交集的面积呢?显然用线段相交的判断方法是没有可能得到的,只好重新设计一个算法。不要说客户不会提出这样的需求,你的题目叫《数学之美》就不能给出太烂的方法。而我提出的算法却可以很容易得到交集的面积而不必做大必大改动。
#Sean.Pu 发表于2006-08-15 22:29:00  IP: 58.60.217.*
to 恋花蝶:其实这个题目的答案和线段比较很类似,但是他有一种很巧妙的思路在里面.正是这种思路让我用了"数学之美"这个哗众取宠的题目
#Sean.Pu 发表于2006-08-16 09:33:00  IP: 58.60.185.*
昨天晚上吃饭太晚,没有完成第二部分
#phoenixsh 发表于2006-08-16 11:02:00  IP: 218.80.169.*
楼主是不是要从第一个图形的内部向第二个图形的顶点引线段,然后看这些线段中是否有和第一个图形的边不相交的?不过这个点不能随便取的,比如,它到自己的顶点的连线就不能切割自己的边,在某些情况下这种点是不存在的(考虑C形图形),除非楼主的“多边形”还有额外的限制。

我认为nile black已经给出正确的算法,其复杂度并不是M^N,而是O(m*n)。
#nile black 发表于2006-08-16 11:10:00  IP: 220.184.141.*
Sean.Pu 发表于2006-08-15 15:45:00 IP: 58.60.185.*
不能说差距,应该说差异。这种线段相交有个重合的问题需要解决
>>
实际上不止是重合的问题,还有包含的问题。

恋花蝶 发表于2006-08-15 18:10:00 IP: 218.107.55.*
首先:虽然用线段相交的方法比三角形相交的方法快速一些,但仍然是一个M的N次的指数级算法,如果每个多边形的线段很多比如100条,然后有100个这样的多边形,那就要判断100的100次方次,稍有数学常识的人都知道这超出了计算机的能力了~我提出的算法是可以解决这样的一个级别的问题的,甚至更大也可以,应该这是一个线性复杂度的算法。

其次:用线段的算法没有扩展性,如果客户要求得到相交的多边形的交集的面积呢?显然用线段相交的判断方法是没有可能得到的,只好重新设计一个算法。不要说客户不会提出这样的需求,你的题目叫《数学之美》就不能给出太烂的方法。而我提出的算法却可以很容易得到交集的面积而不必做大必大改动。
>>
对于这样的问题,假如有大量的图形需要碰撞检测的话,显然不能直接用这个方法,可能是需要通过一些中心检测法,最大包容边界检测,相交检测,再面积检测之类的,一步一步地求精的。


#Sean.Pu 发表于2006-08-16 12:07:00  IP: 58.60.185.*
to phoenixsh:nile的想法没错,呵呵,但是如果算线段相交的话有些问题考虑的比较多,打个比方,可能出现线段A和线段B的部分重合然后再和线段C相交于顶点.出现这种情况的话就必须多一个补充算法
#Sean.Pu 发表于2006-08-16 12:09:00  IP: 58.60.185.*
to nile black:就是因为包含问题,所以我没有采用线段相交的算法
#阿呆 发表于2006-08-16 17:41:00  IP: 192.168.0.*
好高深,学习中........
#大花猫 发表于2006-08-17 08:37:00  IP: 218.108.31.*
我做过求两个多边形的交点的算法。原理很晦涩,但代码很简洁。

你的多边形有凹下去的情况,我想也不会难道哪里去?
#phoenixsh 发表于2006-08-17 09:25:00  IP: 218.80.169.*
to 大花猫: 使用线段相交法求交点。这些交点和\或各自的相应顶点就围成多边形相交区域,然后就可以计算面积了。
#大花猫 发表于2006-08-17 08:44:00  IP: 218.108.31.*
哦,想起来了。偶前不久作java图形平台的时候,做了个求两条折线交点的程序。应该可以解决这个问题。

原理很简单,首先写一个求直线段和直线段交点的方法(必须在两线段上才算交点)。

然后调用上述方法计算折线的各组成线段跟另一条的组成线段的所有交点。
#Sean.Pu 发表于2006-08-17 10:26:00  IP: 58.60.185.*
to xueming:你说的方法我想了一下认为可行,不过我也考虑过同样的一个问题,由于真实数据的区域是非常大,计算机处理起来俺怕会死机. :)

to 大花猫:线段相交+射线法解决全部问题(不用区分凹凸),面积计算问题我当时也考虑过,但是没有深入下去
#大花猫 发表于2006-08-17 08:59:00  IP: 218.108.31.*
“两个不规则多边形是否相交”的问题很容易解决。我再想怎么计算相交区域的面积,这个在Gis中是用得着的
#xueming 发表于2006-08-17 09:47:00  IP: 222.210.224.*
我来说两句。从应用的角度来说,这个问题也许可以直接利用windows API,两个API函数CreatePolygonRgn,CombineRgn根据CombineRgn的结果可以判断出两Polygon是否相交。我没有试过这种方法的效率,不过实际工作中可以试一试。如果可行的话岂不是节约无数天思考的时间。当然这只是从完成工程效率的角度来考虑,和本文探讨算法无关。
#狗尾巴 发表于2006-08-17 09:51:00  IP: 61.149.30.*
问题并不难吧?楼主看看这样行不行?
//-----------------------------------------
思路

两个多边形相交时分问两种情况:

1.两个多边形的所有边都没有相交(指的是线段,不是直线),但是一个多边形在两一个多边形里面(一个大的完全包着一个小的)

2.两个多边形的边有相交(指的是线段,不是直线)
//-----------------------------------------
你需要先写两个函数来用

1.求两个直线交点的函数hit,参数是(a_x1,a_y1,a_x2,a_y2,b_x1,b_y1,b_x2,b_y2),如果有交点返回true,否则返回false

2.有同一直线上的三点A,B,C,求A在直线上是否处于B,C之间的函数isIn,参数是(A_x,A_y,B_x,B_y,C_x,C_y),如果在返回true,否则返回false
//-----------------------------------------
你只需要把两个多边形所有的边检测一下看看是否相交
如果有相交是2的情况.
如果没有全部没有相交,你在两个多边形里各去一个点,看看这个点在不在另一个多边形里(取两个点是因为你不知道那个是大的),如果发生一个点在另一个多边形里的情况则是1的情况.

代码大概这样
假如你的两组多边形是坐标a[][]和b[][]
坐标数组结构是这样比如a[][]={{x1,y1,x2,y2},{...}}

int cjc[]={0,0};

for(int i=0;i<a.length;i++)
{
  for(int j=0;j<b.length;j++)
{
boolean isHit=hit(a[i][0],a[i][1],a[i][2],a[i][3],b[j][0],b[j][1],b[j][2],b[j][3]);//如果有交点,这个函数会把交点写在数组cjc中
if(isHit)
{
if(isIn(cjc[0],cjc[1],a[i][0],a[i][1],a[i][2],a[i][3]) &&
isIn(cjc[0],cjc[1],b[j][0],b[j][1],b[j][2],b[j][3]) )
{
//如果能运行到这里就是相交了
break;
}
}
}
}
//-----------------------------------------
这两个函数都不难写,要是实在需要我可以帮你写
我的QQ是124798013,我是程序员,大家交个朋友,加我啊
#狗尾巴 发表于2006-08-17 09:54:00  IP: 61.149.30.*
不好意思,这个CSDN的编辑栏我不是很会用,代码都乱了,楼主把代码规范一下再看吧.
#狗尾巴 发表于2006-08-17 09:57:00  IP: 61.149.30.*
我可能没写清楚a[][]和b[][]是两个多边形的"边线段坐标" a.length和b.length分别是两个多边形的边数
#pp 发表于2006-08-17 11:20:00  IP: 61.187.64.*
大家可以去看一下两个开源的计划:JTS和CGAL。另外有一个GEOS是JTS的C++版本。这些算法在GIS的应用中已经非常完善了。
#宁柯 发表于2006-08-17 11:42:00  IP: 218.19.3.*
您说得这个,我现在的工作内容当中也有涉及,当然我所作的不仅仅是求是否有相交这么简单了;

只针对您说得这个问题,我的做法简单点说,如下:

求这N个多边形的组成的封闭的最小多边形(为了排除这N个多边形的最大边界的多边形),如果封闭的最小多边形还是这N个多边形本身,那么他们就是没有相交,如果求出的封闭多边形当中,有在超过两个这N个多边形内部的,那就是有相交;或者更简单的可以这样说,求出的最小封闭多边形的数量如果超过N,那么一定有相交;


至于如何求一些随意的多边形所组成的最小和最大的封闭多边形,稍微复杂一些,当然还会用到其他一些基础的几何算法,如果感兴趣,欢迎切磋email/gtalk:beyking@gmail.com
顺便作个广告,Python是个好东东,Python下面的Django框架更是个好东东,欢迎访问我的网站www.china-django.com
#宁柯 发表于2006-08-17 11:48:00  IP: 218.19.3.*
"在我接手之前已经有几个人花了无数的时间去解决这个问题,都没有成功.这些人的学历都比我高,包括X公司当时的副总经理原来是教大学数学的."

太夸张了吧! 哈哈,无数时间是多少时间?
#Sean.Pu 发表于2006-08-17 12:04:00  IP: 58.60.185.*
to 宁柯:素业有专攻,所以非专业人士花费太多时间不能解决问题可以原谅.
to pp:俺事前都申明过了,不能使用gis相关.
#sdfdl 发表于2006-08-17 12:42:00  IP: 222.217.117.*
我……我数学不好………………所以不要打我…………^_^

可不可以转化为:在一个容器内,假如区域1+区域2的面积《容器面积,则两者相交?

因为是不带弧度,所以我认为这个面积会运算量应该不大。
#Sean.Pu 发表于2006-08-17 12:48:00  IP: 58.60.185.*
不明白上楼的意思.:)
#BlueHeart 发表于2006-08-17 12:55:00  IP: 192.168.0.*
test
#小学文化 发表于2006-08-17 13:02:00  IP: 222.90.232.*
线段相交是不能考虑的
#BlueHeart 发表于2006-08-17 13:05:00  IP: 192.168.0.*
一个可行的办法(我做过3维相关的项目开发,里边也用到多边形求交问题,希望对搂主有帮助):
1)取出第一个多边形的每一个顶点(多边形的描述就是用顶点,所以很方便),判断其是否在另一个多边形内部(按照计算机图形学上的方法),只要找到一个这样的点,已经说明相交,break。
2)如果第一步测试结果为不相交,则:取第二个多边形的每一个顶点,判断是否在第一个多边形内部(算法同第一步),这一步的原因是,一条边可以穿过一个多边形而端点不在多边形内部。
3)如果1)2)测试结果都不相交,则表明二个多边形不相交。时间复杂度的问题这里就不作分析了。

#BlueHeart 发表于2006-08-17 13:11:00  IP: 192.168.0.*
补充一下:我认为该问题必然要用到线段求交,而线段求交最好运用矢量代数求解(这些东西都可以参考计算机图形学)。
如果楼主觉得该方案可行,我可以再讨论细节问题并帖出我的代码
#小学文化 发表于2006-08-17 13:18:00  IP: 222.90.232.*
我来提供一个算法 供考虑:
对于多边行A,B若相交则必有A上一点Q落于B内部。
反之屹然。
考虑直线方程ax+by+c=0, 对于同一边的点
f(x,y)=ax+by+c 同号。

据此取A内一点计算所有边所在直线的符号。
取B的所有点计算A所有边所在直线的符号,若有1点计算
结果完全相同则必相交。
#得意的春风 发表于2006-08-17 13:26:00  IP:

首先,在我看来,能够解决这个问题,并不是很困难。但是若要“很好”地解决,才可能有点麻烦;
其次,所谓的不规则多边形是不是包括自相交的多边形,多边形的复杂度对算法的复杂度起到很大的影响;

//-------------[ 我的简单想法 ]---------------
若是两个多边形相交,则必然有A多边形的结点在B多边形内;所以,理论上讲,只要对A多边形的所有结点,循环做检测:是否在B多边形内(图形学的现成算法);只要发现有一个这样的点存在,即可判断A与B相交;

简单的优化:生成B的外接矩形框,忽略在矩形框外的A多边形结点;

考虑到问题的特殊性,还有一些优化的余地,不再列举;

//-------------------------------------------

上述方法复杂度为M*N,需要对A做循环遍历;
(M:A中结点循环数量 N:检测A节点是否在B内,也是一次循环过程)
仍然存在一个问题:对于A包含B的拓扑关系,不能处理;
解决的方案:任选B中一个节点,再做1次检测:是否在A内?
true:A交B ;false:A与B相离

ps. 10^2数量级的多边形似乎还不是问题吧;当问题规模达到10^4方以上的时候,好像才具有挑战性

#Sean.Pu 发表于2006-08-17 13:27:00  IP: 58.60.185.*
to BlueHeart:hehe,感谢BlueHeart,点的问题俺已经在数学之美--XXXXXXX(2)中提到了.
to 小学文化:你的方法同blueheart一样,不过一样可以参看
thanks all
#sdfdl 发表于2006-08-17 13:47:00  IP: 222.217.117.*

果然饿晕了就语无伦次带神经错乱……T T

本来是想创造一个"不存在S1区域的容器",然后在里面进行"减去S2区域",再求余下区域面积的运算…………发现到最后还是回到了原点……

鄙视我吧……找地缝去……
#hu 发表于2006-08-17 13:51:00  IP: 61.144.131.*
>A,B若相交则必有A上一点Q落于B内部。
的确是成立,但不能说Q就是顶点,因为如果A完全包含B,则Q只能在A的内部。
#Sean.Pu 发表于2006-08-17 13:59:00  IP: 58.60.185.*
to sdfdl:大家都在犯错嘛,失败是成功她妈
to hu:A,B相交未必会有顶点Q在A 或者 B内,具体请看另外一篇说明
#hu 发表于2006-08-17 14:01:00  IP: 61.144.131.*
还要考虑顶点重合的情况:

 +————+
 |   /|╲
 |A / | ╲
 | /  |B/
 |/   |/
 +————+
  ╲  /
   ╲/

#Sean.Pu 发表于2006-08-17 14:12:00  IP: 58.60.185.*
to hu:欢迎看"数学之美--不规则多边形重叠计算(2).基本可以解决你说的顶点重合的问题
#aero_boy 发表于2006-08-17 14:13:00  IP: 221.218.129.*
如题图:
if ((图1的最大的X坐标 >= 图2的最小的X坐标) && ( 图1的最大Y坐标 <= 图2的最小Y坐标) ) || ( (图2的最大X坐标 >= 图1的最小X坐标) && ( 图2的最大Y坐标 <= 图1的最小Y坐标 ) )

//有可能有重叠
//逐个判断x1,y1, x2,y2 之间的点是否有属于这两个多边型的
//如果有,就说明有重叠

这是一个几乎不需要什么数学的方法,不如实用不。
#hu 发表于2006-08-17 14:06:00  IP: 61.144.131.*
Sean.pu: 另外一篇说明在哪?我怎么没找着?
#hu 发表于2006-08-17 14:19:00  IP: 61.144.131.*
补充一下:前面我提到的顶点重合问题,不能简单地判断顶点重合就相交了,因为类似下图情况也重合却不相交。用射线法的确可以解决此问题,但不是每个顶点的水平或垂直射线,而应该是每条边所形成的射线。不知楼主是否同意。

 +————+———+
 |    |╲   |
 |A   | ╲  |
 |    | / |
 |    |/  |
 +————+   |
 |╲  /  B  |
 | ╲/      |
 |        |
 +————————+
#Sean.Pu 发表于2006-08-17 14:23:00  IP: 58.60.185.*
to aero_boy:你的这个方法有缺陷.呵呵,如果图1成圆环闭合状包括图2呢?(注意不是包含哈)
#Sean.Pu 发表于2006-08-17 14:26:00  IP: 58.60.185.*
to hu:再次感谢你,呵呵,射线法的K系数是可变的,在有的情况下还是必变的,我举例说了水平是方便理解. :)

PS:你这样画图太辛苦了.
#米虫 发表于2006-08-17 14:58:00  IP: 222.217.117.*
为什么没有人想到用递归呢
#Sean.Pu 发表于2006-08-17 15:02:00  IP: 58.60.185.*
递归?
如何递归?
you are welcome
#owen 发表于2006-08-17 15:24:00  IP: 59.40.78.*
将图1涂成红色,图2涂成蓝色,那么当有颜色等于(红色+蓝色)的时候,表明图1图2相交。这是很简单的描述,不知道有人明白不?嘿嘿
#zyyppp 发表于2006-08-17 15:49:00  IP: 219.141.233.*
这个问题不太困难吧?
我觉得多边形重叠和相交应该是有区别的
如果一个多边形在另一个多边形内部也算有重叠,但不能算相交
如果是判断相交的话,很简单,只要存在来自两个多边形的边相交就是相交,否则就不相交,应该在O(n*m)内可以搞定
如果是判断重叠的话,分两种情况,一种是两个多边形相交,另一种是一个多变形在另一个多边形内部
前一种情况已经说过,应该在O(n*m)内可以搞定
后一种情况就是找是否存在一个多边形的顶点在另一个多边形内部,判断点在多边性内外用射线法或转角法都可以,射线法快一些,不过最终复杂度都是O(n*m)
#tunsanty 发表于2006-08-17 16:13:00  IP: 218.81.54.*
我想纠正你的一些观念。
这个问题属于计算几何的问题,算得上是一个数学的问题,但是和学数学的人是否能知道这个问题的答案没有一点关系,数学的分支很多,专业方向不同,所涉及到的算法也就不同。
这个问题北京理工大学计算机系的周培德老师在他的《计算几何》书中给出了详尽的算法,当然图形学中的扫描线也可以。如果结果不是要求100%精确的话,实际上浮点数运算也不可能100%,所以我觉得有更简单的方法可以判断两个任意多边形(多边形的边可以是圆弧)是否相交,以及相交的面积都可以直接计算出,那就是使用概率的方法,又叫蒙特卡洛方法,就是在某个多边形内产生几百个随机点,然后计算这些随机点落在另一个多边形中的点的个数,得出比值,就可以得出是否相交,而且还可以一步得出相交的面积是多少。
而且这种方法代码量极少。写个点是否在多边形内的算法,大概60-80行代码,概率方法5-10行。总共不到100行
#Sean.Pu 发表于2006-08-17 17:45:00  IP: 58.60.185.*
还想问个问题?你是PPMM否?如果不是的话,俺应该没有骗过你.嘿嘿
#bbt 发表于2006-08-17 17:26:00  IP: 58.49.210.*
Sean.Pu :
你好像我认识的一个骗子啊
:) 不过学了不少东西
#Sean.Pu 发表于2006-08-17 16:50:00  IP: 58.60.185.*
en,我会去买本<计算几何>的书来看,多谢指教.
#Sean.Pu 发表于2006-08-17 17:42:00  IP: 58.60.185.*
俺放了头像,是不是你认识的骗子,你自己知道咯
#Redinux 发表于2006-08-17 19:44:00  IP: 202.198.64.*
我只看了tunsanty的回复,我也想到用图形学中的判断遮挡算法来求交。你也提出了用蒙特卡罗方法,这个方法能用,但是我想说的是,使用蒙特卡罗方法只是把困难转移了,难点被转移到了求一个点是否在一个多边形内,随机产生一个点,判断是否在多边形内,虽然代码可能会少,但是效率不能太高吧。
#天机星 发表于2006-08-17 18:46:00  IP: 82.111.19.*
Given Concave shape A and B. Suppose you have got every edge of A and B(not only a gourp of vertices, otherwise you can't know the exact shape of A and B).
first, iterate very edge of A, check if there is any vertice on B enter inside the A's checking edge (edge has two sides, on is outward one is inward).
if found, check the two edges belonging to the vertice(which is inside A's checking edge) of B. see if there is any edge of the two B's edges(belonging to the B's inside vertice) intersect with the A's checking edge. that means they intersect
#天机星 发表于2006-08-17 18:50:00  IP: 82.111.19.*
sorry, I forgot to tell you to do the same thing with B for A reversely(use very B's edge to check A's vertices)
#Tony Huang 发表于2006-08-18 00:01:00  IP: 58.33.35.*
把问题转化成求多边形b是否有定点在多边形a中即可。
#yym314 发表于2006-08-18 09:22:00  IP: 218.80.195.*
如果只要要判断A和B两个多边形是是否有重叠,可以这样做啊
对于A的每个顶点,判断其是否在B这个多边形内部,如果有一个顶点在B的内部,则A和B有重叠.
至于怎么判断一个点是否在多边形内部内部可以用***法(就是从这个点和多边形外边无限远的另一点之间作一线段,如果这个线段和这个多边形有奇数个交点,则在其内部.如果有偶数个交点,则在其外部)
#Ross 发表于2006-08-18 10:32:00  IP: 211.160.164.*
数学问题而已
#feeling 发表于2006-11-23 12:51:00  IP: 59.63.226.*
首先,获得2个多边形的链表结构.大概是x,y,node.

算法思想:从一个多边型的顶点开始.

1,判断该点是否在另一多边形内,如果在,则判断下一个点,否则;
2,连接下一个接点,并判断该点是否为顶点,如果是,转1,否则;
3,判别交点是否是出点,如果是,转2,否则;
4,转如另一多边形对应的交点继续搜索,直至最后一个结点.

```````````````````````````````````````
事先对结点的处理应该是"并".
中途运用到数据结构的一些东西,可惜我学得不好,sigh``````毕业了怎么办````
#猪意阑珊 发表于2006-11-27 07:42:00  IP: 218.78.234.*
这道题有现成的解答了。

这是ACM/ICPC国际大学生程序设计竞赛1998年的第六题。

建议参照相关书籍
ISBN 7-309-02141-X/T·210
书中是按照Pacal语言的面向过程来写的。

#Magic 发表于2006-11-29 10:06:00  IP: 210.22.79.*
单纯求两个不规则多边形是否相交问题,可以演化成线段交点问题,我现在正在做求出两多边形相交的问题。
我现在已经完成了多边形的加和减,大家可以和我讨论caffelete@163.com
#Magic 发表于2006-11-29 10:07:00  IP: 210.22.79.*
单纯求两个不规则多边形是否相交问题,可以演化成线段交点问题,我现在正在做求出两多边形相交区域的问题。
我现在已经完成了多边形的加和减,大家可以和我讨论caffelete@163.com
#mybaby999 发表于2007-01-04 17:58:48  IP: 221.219.112.*
简单的问题
射线法是最好的

在多边形内相交奇数次,否则偶数次,对于三维同样适用

不过俺现在需要任意复杂度的多边形分解的高速算法(O(N) N为多边形中点的个数)

不知哪位高手有算法,Dancing_Sea@msn.com
#javenwong 发表于2007-07-02 09:55:53  IP: 222.171.29.*
楼主在卖弄, 轻点得瑟啊!~~
#platform 发表于2007-07-02 11:36:36  IP: 124.78.121.*
不否认,不承认.
kaka
#platform 发表于2007-07-24 00:04:43  IP: 124.78.120.*
不否认,不承认.
kaka
#CNXQS 发表于2008-04-27 11:21:14  IP: 121.9.9.*
我看了上面的所有方法,感觉都不好~~
我想楼主这个问题,的解决方法,使用图形学上面的方法做应该比较简单!(当然其实也是数学上的方法)
我大概的思路是:
1.创建2个空白图象片,(采用2个相同的坐标系)
2.然后把任意多边形画在上面,给把多边形内部填充一个颜色,这样,2个坐标系中就只有3种颜色,多边形1内部的颜色c1,,多边形2内部的颜色c2,,外部的颜色c3
3.遍历其中一个多边形内部的所有点的像素的颜色c1,
在第2个坐标系是否为颜色c2,若为c2,则2个多边形有相交.
4.这个方法可以解决2个图形相交,包含的各种关系,还可以的重叠的面积(重叠的像素的总和*放大或缩小的比例)

(问题的复杂度,应该是线性的,但是由于计算机,内部ram的限制,2个多边型的面积比例有最大限制,结合一些同时对2个多边形的坐标进行放大或缩小的算法,来减少比较的像素点,这个应该可以做得比较完美!)

本人本科的,如果这个方法有错,请见量!
qq讨论可以加我:二 8 9 3 7 5 4 二 (没被人偷的话,一直不变,哈哈!)
#CNXQS 发表于2008-04-27 11:27:27  IP: 121.9.9.*
不好意思,见笑了,原来上面的
tunsanty 已经说了这个方法了!
另外楼主的:
难点被转移到了求一个点是否在一个多边形内,
(这个很容易的!)
#platform 发表于2008-05-07 10:48:48  IP: 210.83.228.*
其实,任何数学问题都是在转化的。
点,线,面。
所有的编程都是if ... else ... for ...
#Jackey_shao 发表于2008-08-30 11:47:48  IP: 211.93.29.*
TO platform:一语点醒梦中人呀。呵呵。
to #:终于可以找到这个算法更好的优化方案了,呵呵。基本上是一个线性的复杂度。
发表评论  


登录
Csdn Blog version 3.1a
Copyright © Sean.Pu