algorithm - 将相邻的梯形合并为一个多边形

标签 algorithm language-agnostic computational-geometry

3 trapezoid and a polygon

给定 2 或 3 个梯形(橙色)。每个梯形至少有一条边与另一个梯形相邻,形成一个简单的多边形。

矩形表示为四个点的列表,从最左上角开始顺时针方向,例如

[
  {x: 0,  y: 0},
  {x: 50, y: 0}, 
  {x: 75, y: 30},
  {x: 60, y: 30}
]

任务是制作一个多边形(绿色),表示为点列表:

[
  {x: 0,  y: 0},
  {x: 50, y: 0}, 
  {x: 75, y: 30},
  {x: 60, y: 30},
  {x: 60, y: 170}
  …
  {x: 0, y: 0}
]

最佳答案

由于梯形上的所有点都按顺时针顺序排列,因此让我们将这些点视为有向边集或“弧”(连续点之间的箭头,环绕)。

我们要排除的弧就是多边形内部的弧,都是成对出现的。 IE。如果 [a,b,c,d] 是一个梯形,而 [d,c,x,y] 是另一个梯形,那么我的多边形应该是 [a,b,c,x,y,d],这排除了对弧 (c,d) 和 (d,c)。

您可以在线性时间内找到要排除的弧(通过散列或邻接矩阵)。然后找到你的多边形只是将剩余的弧按顺序拼接在一起的问题。

假设我们正在将点映射到它们的邻居。在我上面的例子中,这看起来像: a->(b), b->(c), c->(d,x), d->(a,c), x->(y), y->(d)

排除一对不良弧线(两个方向上的 c 到 d)后,我们有: a->(b)、b->(c)、c->(x)、d->(a)、x->(y)、y->(d),根据需要。

关于algorithm - 将相邻的梯形合并为一个多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19871670/

相关文章:

language-agnostic - 软件评论 : Open Source Software

algorithm - 使用 voronoi 寻路

php - 如何在自己的数据库中管理 facebook 帖子以便更好地操作?

javascript - 在 Javascript 中实现线性搜索算法

language-agnostic - 如何在笛卡尔坐标中绘制n边正多边形?

algorithm - 按重叠或缺失对一维线进行分组

c# - 计算 3D 网格的体积

python - 给定二维空间中的一组边界框,将它们分组到行中

r - R 中的迭代,for 循环的奇怪结果

c++ - 了解冒泡排序(算法)