我正在开发一个应用程序,我需要能够组合用户绘制的两个重叠的任意形状。这将是两种形状上的联盟操作。结果形状将是两个重叠形状的轮廓。
形状以顺时针方式存储为一系列点。
理想情况下,我想要一个算法,它将采用两个Point(x,y)数组并返回一个结果形状的单个数组。
我一直在Boolean operations on polygons上阅读维基百科,其中提到了Sweep line algorithm,但我无法将此与我的目标联系起来,唉,我不是数学家。
我正在使用ActionScript 3开发应用程序,但我熟悉C#,Java,我可以选择使用C和C ++。
答案 0 :(得分:5)
正确实现布尔运算并非易事;幸运的是,有些库已经实现了这一功能。
您使用的是哪种语言?如果是C ++,请查看CGAL计算几何算法库。
答案 1 :(得分:3)
给出两个点(A和B)列表
- A中每一行的[1]与B中的一条线相交
-.- [2]如果没有(更多)线相交,则没有重叠
-.- [3]如果(A)中的线与B中的直线相交则
-.- .- [4]将交点添加到输出中
-.- .- [5]从A开始的下一行相交B
-.- .- .- [6]如果没有,将其添加到输出(它在B内)goto 5
-.-。-.- [7]如果是这样,将交叉点添加到输出并切换列表A& B转到2
另见Intersection Point Of Two Lines。我不会写代码抱歉:)
答案 2 :(得分:3)
另见GPC。
答案 3 :(得分:2)
this algorithm会为你效力吗?
答案 4 :(得分:1)
怎么样:
我认为如果你继续沿着当前的任何形状缠绕,寻找交叉点,那应该做你想要的。我认为应该应对凹形......
我确信,一旦你掌握了基础知识,就可以添加很多优化。
答案 5 :(得分:1)
似乎还有一个javascript api:
https://github.com/bjornharrtell/jsts/
似乎实现了jts标准并且有几个不同的实现:
http://tsusiatsoftware.net/jts/jts-links.html#ports
所有这些人都应该能够进行联合等等:
http://tsusiatsoftware.net/jts/JTSUser/contents.html
但是csg.js是IMO最令人印象深刻的项目