了解如何使用最少数量的矢量线填充多边形

时间:2011-09-04 11:04:11

标签: algorithm vector-graphics shortest-path flood-fill

假设我有一个带孔的矢量多边形。我需要通过绘制连接的段来填充它。当然,由于有洞,我无法用一条连续的折线填充它:我有时需要中断我的路径,然后移动到一个被跳过的区域并在那里开始另一条折线。

我的目标是找到填充整个多边形所需的一组折线。如果我能找到最小集合(也就是说,我可以用最少的中断数填充多边形的方式),那就更好了。

奖金问题:我怎么能为部分密度填充做到这一点?说,我不想以100%的密度填充,但我想要50%(这将需要填充线,假设它们彼此平行并且具有单个单位宽度,放置在两个单位的距离处)。

我在这里找不到类似的问题,尽管有许多与洪水填充算法有关。

任何想法或指示?

更新:来自Wikipedia的这张照片显示了一条良好的低潮泛滥路径。我相信我可以使用位图来做到这一点。但是我有一个矢量多边形。我应该光栅化吗?

Path example

1 个答案:

答案 0 :(得分:1)

我假设线条之间的距离是1个单位。 粗略的实现,无法保证找到最小折线数,是:

  1. 从一组空的折线开始。
  2. 确定多边形的minx和maxx。
  3. 将x从xmin循环到xmax,步长为1.线L是x处的垂直线。
    • 将垂直线L与您的多边形相交(快速算法,易于查找)。这将为您提供一组段:{(x,y1) - (x,y2)}。
    • 对于所有折线和所有线段,合并线段+折线的末端(请参阅下面的注释1)。合并线段和折线时,在折线末端添加一个小拉伸(将其连接到线段)和线段本身。对于无法使用该段合并的所有段,请在全局集中添加新折线。
  4. 最后,如果可能,尝试再次合并折线(结束在一起)。
  5. 将新段合并到现有折线的最佳算法应该很容易找到(y上的散列),或者强力算法就足够了:

    1. 如果你的多边形没有数以万计的洞,每行扫描的新段数不应该太高,
    2. 每一步的全局折线数量不应太大,
    3. 您只与每条折线的末端段进行比较,而不是整个折线的结束段。
    4. 添加了注释(1):为了覆盖多边形具有接近垂直边缘的情况,合并过程不应只查看y-delta,而是允许合并(如果任何两个y范围)重叠(表示折线y-范围重叠段y-范围的结束)。