【发布时间】:2021-03-20 21:57:09
【问题描述】:
考虑图片:
鉴于黑色的“不规则线”段,我希望在它们周围有绿色边界。
我的解决方法:
请注意,我需要捕捉凹度。因此凸包算法将不起作用。我使用了一些插值来绘制由覆盖的红色条纹表示的直线段。然后我尝试运行扫描算法。如果有帮助,这些条纹大致平行。
也就是说,它们的航向位于某个小区间内。
对于一些小的 x,在 { angle alpha - x , angle alpha +x } union { angle alpha - x + 180 , angle alpha +x+ 180 } 中的标题 H
但是,需要保证绿色边界不与任何红线相交。
所以,我天真的尝试是:
- 从所有行的最左侧顶点开始。
- 选择连接到顶点的线。 (如果顶点较多,则取最顶部和最底部)
- 使用这条线来“划分”平面。 (或两行或两个“分隔线”,如果有 2 个顶点)
- 选择下一个最左侧未访问的顶点。
- 查看顶点是位于顶部分界线上方还是底部分界线下方。
- 如果高于顶部分隔线,则将其添加到名为“顶部链”的集合中,如果低于底部分隔线,则添加到底部链。
但这会遇到问题。
问题
为了确定新选择的点是在分界线的顶部还是底部,我使用向量积方法。但是考虑一下:
想象你在绿色广场。您的分界线现在是黑线,指向左侧的矢量,如箭头所示。
在此阶段,您将其与在蓝线上显示下一个要选取的顶点的绿色向量进行比较。用于测量 -Pi 到 Pi 之间角度的矢量方法将认为这是一个负值。因此,这一点虽然是必要的,但不会被采纳。
如果你反转矢量的方向,则不会拾取洋红色线。
问题
如何有效地解决这个问题?我正在使用 D,所以如果有一个 D 库能够做到这一点,那么奖励。
【问题讨论】:
-
你说你需要捕捉凹度,但标题是关于绘制一个非凹形状。这些不兼容,那是什么?
-
好的。那样的话,你具体的绿线是怎么确定的呢?它不是覆盖所有线条的最小面积形状。事实上,我不认为存在 最小面积形状,因为原始线条并未完全包围任何区域。在允许凹度的情况下,我认为您可以找到面积任意接近零的多面体,覆盖所有线。
-
英国海岸有多长?
-
覆盖黑色线段的最小凹面形状将完全包裹所有黑色线段,并且在每个不重叠的黑色线段之间具有零面积连接。
-
This is what the minimal area result looks like。它可能不是您想要的,因为它看起来不像您的图像。你需要定义一些额外的约束来做到这一点,比如周长的上限或直线边的数量。
标签: algorithm graphics d computational-geometry