【问题标题】:Vector image editing by dragging a polygon as a brush通过拖动多边形作为画笔进行矢量图像编辑
【发布时间】:2017-09-19 22:41:58
【问题描述】:

目标是通过像多边形画笔一样在屏幕上拖动鼠标来进行简单的矢量图像编辑,创建画笔的Minkowski sum 和鼠标的路径。新多边形将从任何先前存在的不同颜色的多边形中减去,并与任何现有的相同颜色的多边形合并。

计划是将每次鼠标移动作为从鼠标先前位置到当前位置的线段,计算该线段上的 Minkowski 和,然后使用Weiler–Atherton clipping algorithm 更新现有多边形以包含该 Minkowski总和。

由于 Weiler–Atherton 似乎在每次鼠标移动时运行都会导致 UI 延迟,我们计划通过将其放入另一个线程来延迟该步骤,该线程可以花时间赶上最新的鼠标移动,或者保存所有 Weiler–Atherton 计算直到绘图完成,然后在保存时作为批量操作执行。我们担心这可能会导致大量重叠多边形的积累,以至于 UI 会延迟渲染所有多边形所需的时间。

问题是:上面的计划是 Inkscape 和其他严肃的矢量图形编辑软件执行此操作的方式吗?这似乎是一个疯狂的计划,无论是算法的复杂性还是计算复杂性。专家会怎么做?

正在考虑的另一个选项:使用简单的光栅操作进行绘画,然后将光栅转换为矢量图像作为最后一步。从光栅到矢量的转换似乎并不比 Weiler-Atherton 简单,并且最终输出的质量可能会受到影响,但它会是更好的选择吗?

【问题讨论】:

  • 为每次鼠标移动运行这些算法似乎不太可能导致性能问题。计算机游戏引擎每帧运行大量的计算几何内容。

标签: algorithm computational-geometry vector-graphics


【解决方案1】:

当用户按住鼠标按钮并绘图时,您可以记住所有鼠标移动的线段,并同时将画笔*线 Minkowski 和渲染为屏幕分辨率位图。

在用户释放按钮之前,您可以使用位图绘制屏幕。那时您可以计算所有线段 Minkowski 和的并集,并将生成的形状添加到您的绘图中。

要同时计算这么多形状的并集,最好采用某种扫描线算法。您应该能够在 O(N log N) 或线性时间内完成这项工作,这不会造成任何明显的延迟。

【讨论】:

  • 您的意思是基于 Bentley-Ottmann 算法,还是您有其他算法?
  • 是的,类似的方法对于许多短段非常有效,并且在实践中可能是一个不错的选择。我会根据需要添加从鼠标线段生成多边形段的优化。
【解决方案2】:

IMO Weiler-Atherton 的瓶颈是检测交叉口,当通过蛮力应用时需要 O(N²) 操作。剩下的处理就是重新组织顶点和交点之间的链接,应该限制在O(N),甚至O(NI),其中NI表示交点的数量。

在这种特殊情况下,您可能可以通过网格或边界框层次结构来加快交叉点的搜索速度。 (请注意,网格化与 Matt 使用辅助位图渲染的想法相似。)

除非你真的有十亿边,否则我不会担心运行时间。

【讨论】:

    【解决方案3】:

    如果您想像专业矢量图形软件那样使用任意笔刷形状(包括笔刷形状可以对速度或手写笔压力做出反应等功能),那么它可能会非常麻烦。

    我正在试验“Ahn, Kim, Lim - 2D 弯曲对象的近似一般扫描边界”中描述的方法。它似乎可以处理很多我期望从专业绘图应用程序中获得的情况——尤其是刷子形状在扫动时可以是动态的细节;自适应生成所需分辨率的边界曲线;二维曲线的可变宽度偏移;等等。

    如果您不需要通用方法,您似乎可以简化此方法。但我想在这里添加它作为参考。


    PS:我正在寻找一个 非付费 链接以包含在答案中,然后出现了 - Looking for an efficient algorithm to find the boundary of a swept 2d shape。看起来与您尝试做的非常相似:)。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 2011-12-16
    • 2013-11-11
    相关资源
    最近更新 更多