计算两个任意形状的并集

时间:2010-01-26 14:43:20

标签: math geometry boolean-operations

我正在开发一个应用程序,我需要能够组合用户绘制的两个重叠的任意形状。这将是两种形状上的联盟操作。结果形状将是两个重叠形状的轮廓。

形状以顺时针方式存储为一系列点。

理想情况下,我想要一个算法,它将采用两个Point(x,y)数组并返回一个结果形状的单个数组。

我一直在Boolean operations on polygons上阅读维基百科,其中提到了Sweep line algorithm,但我无法将此与我的目标联系起来,唉,我不是数学家。

我正在使用ActionScript 3开发应用程序,但我熟悉C#,Java,我可以选择使用C和C ++。

6 个答案:

答案 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)

怎么样:

  1. 选择两个形状的最左侧点。称之为形状A并使其成为当前形状。
  2. 沿当前形状顺时针旋转到下一个点并检查一条或多条线是否相交。
    • 如果任何线条相交,找到第一个交叉点并将其添加到新形状。切换到另一个形状的缠绕。
    • 如果没有相交的线移动到形状A中的下一个点,并将其添加为新形状中的点。沿着当前的形状继续缠绕。
  3. 重复步骤2.
  4. 我认为如果你继续沿着当前的任何形状缠绕,寻找交叉点,那应该做你想要的。我认为应该应对凹形......

    我确信,一旦你掌握了基础知识,就可以添加很多优化。

答案 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最令人印象深刻的项目

https://github.com/evanw/csg.js