【问题标题】:Polygon clipping: How to clip both polygons down middle?多边形裁剪:如何在中间裁剪两个多边形?
【发布时间】:2020-12-05 22:23:16
【问题描述】:

我已经看到了几种“多边形裁剪”的实现,它们允许您从另一个多边形中“减去”一个多边形,但我正在寻找一些不同的东西。

如何通过从每个多边形中减去一个偶数来剪裁两个多边形,使它们不再重叠?

例如在下图中,粉色和红色的多边形是重叠的。我想将它们沿红线切开,这样它们就不再重叠了。

我用手在十字路口的中心画了红线。它应该与任一侧的 [intersection] 多边形的边缘等距。我相信这也意味着左右两半的面积相等。

多边形不一定是凸的。它们是用户绘制的,因此它们可以是凹形的,但不会有孔。从技术上讲,它们可以自相交,但我可能应该找到另一种算法来清理或丢弃那些。

我希望这已经足够清楚了。这个算法有名字吗?如果它在 JS 中有一个实现,那就更好了。


到目前为止我的最佳想法是:

  1. 计算两个多边形的交集,使用其中之一
    1. 马丁内斯-鲁埃达-费托
    2. 萨瑟兰-霍奇曼
    3. Weiler-Atherton 裁剪算法
    4. Vatti 裁剪算法
  2. 计算“中心线”(还没有弄清楚)
  3. 再次使用多边形剪裁从每个多边形中剪掉一半

【问题讨论】:

  • @mrmcgreg 不确定我可以在这里申请 voronoi。
  • 您的问题似乎与中轴变换有关,尽管后者不一定由线段组成。
  • @YvesDaoust 啊哈!谢谢你给我一个搜索词。这看起来很相关:stackoverflow.com/a/52796778/65387 我认为它比这更复杂,因为中轴需要连接到两个多边形相交的点。
  • 是的,你的问题很难。 (标准的多边形裁剪已经很麻烦了。)

标签: javascript algorithm polygon computational-geometry


【解决方案1】:

让我们以您提出的最佳想法为基础,我假设您找到了多边形的所有顶点。

首先使用公式计算多边形的表面积calculate this using only the vertices。现在我们假设可以只使用两条线生成分隔线,如果你们两个多边形都是凸的,我相信这是一个合理的假设(需要证明,可能使用中值定理)。

所以我们称中间的点(创建两条线)a := (x_a, x_b),现在创建两个多边形 - 一个只有一半的点(在你的情况下,所有点都在红线右侧,@ 987654323@),第二个是 a 和交点在两个多边形中的其余点。

我们知道这些多边形的总面积等于预先计算的总和,所以我们有 1 个带有 2 个参数的方程 (x_a, x_b),解决这个问题将创建一条中间点可以存在的直线。

现在在这条线上选择一个随机点(在交叉多边形内部:)),你就完成了。

编辑:
如果多边形不是凸的,您可以将它分类到各个部分,这样它就会成为并应用每个部分的算法。
这个算法也没有我知道的名称或实现。

祝你好运

【讨论】:

  • 我不认为两条线段就足够了,即使对于凸多边形(我的输入不限于凸多边形)。对于我绘制的示例,不要认为两条线段是正确的;我认为它大致相当于交叉点多边形周边的点数。我的红线顶部附近应该有一个小弯。
  • 我认为很容易证明在您的情况下两条线段就足够了并且有一个解决方案,只需说如果中间点非常靠近左侧,那么该区域就不是向左平衡,如果您再次将中间点向右移动 - 不平衡,但这次向右移动。所以在这两个中间点之间的某处,我们知道存在一个平衡的中间点。另外关于非凸多边形我做了一个编辑,如果不清楚,我可能会添加一张图片。除非我当然想念你的问题。
【解决方案2】:

与我之前的答案完全不同的方向(我错过了It should be equidistant to the edges of the [intersection] polygon on either side 部分 - 抱歉)。

让我们看看交叉多边形的右侧部分与交叉多边形的左侧部分具有相同数量的顶点的情况(并假设凸 - 如果不是凸求解每个凸多边形)。在这种情况下,在每两个对应的顶点之间画一条线,即示例中的两个顶部和两个底部,并从顶部交叉点到您绘制的线的中间画一条线。可以证明它解决了问题。

现在介绍推广解决方案的技巧 - 只需在要使每边的顶点数相等的任何位置添加虚拟顶点即可。

我在这里使用了很多“顶部”和“底部”,但实际上你只需要线条永不相交,从你开始的地方选择你想要选择的任何方法。

再一次,
祝你好运

【讨论】:

  • 我还没有删除以前的答案,因为如果此解决方案也失败了,您可能仍会使用它的变体。
  • 即使你可以像这样配对顶点,我认为你不能在它们之间画一条直线。我认为您必须查看两个相邻的边缘并从中间延伸一条直线。然后也许你可以在另一侧向下相同,这两条线将相交,除非两条线恰好平行...... like this 但你必须将该圆从一个多边形移动到另一个,这将绘制中间的一条线。这个算法有一个名字,但我不记得名字了
猜你喜欢
  • 2017-10-28
  • 1970-01-01
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
相关资源
最近更新 更多