【问题标题】:Draw a Concave Shape, given a set of lines给定一组线,画一个凹形
【发布时间】:2021-03-20 21:57:09
【问题描述】:

考虑图片:

鉴于黑色的“不规则线”段,我希望在它们周围有绿色边界。

我的解决方法:

请注意,我需要捕捉凹度。因此凸包算法将不起作用。我使用了一些插值来绘制由覆盖的红色条纹表示的直线段。然后我尝试运行扫描算法。如果有帮助,这些条纹大致平行。

也就是说,它们的航向位于某个小区间内。

对于一些小的 x,在 { angle alpha - x , angle alpha +x } union { angle alpha - x + 180 , angle alpha +x+ 180 } 中的标题 H

但是,需要保证绿色边界不与任何红线相交。

所以,我天真的尝试是:

  1. 从所有行的最左侧顶点开始。
  2. 选择连接到顶点的线。 (如果顶点较多,则取最顶部和最底部)
  3. 使用这条线来“划分”平面。 (或两行或两个“分隔线”,如果有 2 个顶点)
  4. 选择下一个最左侧未访问的顶点。
  5. 查看顶点是位于顶部分界线上方还是底部分界线下方。
  6. 如果高于顶部分隔线,则将其添加到名为“顶部链”的集合中,如果低于底部分隔线,则添加到底部链。

但这会遇到问题。

问题

为了确定新选择的点是在分界线的顶部还是底部,我使用向量积方法。但是考虑一下:

想象你在绿色广场。您的分界线现在是黑线,指向左侧的矢量,如箭头所示。

在此阶段,您将其与在蓝线上显示下一个要选取的顶点的绿色向量进行比较。用于测量 -Pi 到 Pi 之间角度的矢量方法将认为这是一个负值。因此,这一点虽然是必要的,但不会被采纳。

如果你反转矢量的方向,则不会拾取洋红色线。

问题

如何有效地解决这个问题?我正在使用 D,所以如果有一个 D 库能够做到这一点,那么奖励。

【问题讨论】:

  • 你说你需要捕捉凹度,但标题是关于绘制一个非凹形状。这些不兼容,那是什么?
  • 好的。那样的话,你具体的绿线是怎么确定的呢?它不是覆盖所有线条的最小面积形状。事实上,我不认为存在 最小面积形状,因为原始线条并未完全包围任何区域。在允许凹度的情况下,我认为您可以找到面积任意接近零的多面体,覆盖所有线。
  • 英国海岸有多长?
  • 覆盖黑色线段的最小凹面形状将完全包裹所有黑色线段,并且在每个不重叠的黑色线段之间具有零面积连接。
  • This is what the minimal area result looks like。它可能不是您想要的,因为它看起来不像您的图像。你需要定义一些额外的约束来做到这一点,比如周长的上限或直线边的数量。

标签: algorithm graphics d computational-geometry


【解决方案1】:

填充凹面是一种有点武断的操作。看看 Alpha-shapes,凸包的概括。

https://en.wikipedia.org/wiki/Alpha_shape

【讨论】:

    猜你喜欢
    • 2019-12-07
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多