目标是通过在屏幕上拖动鼠标来完成简单的矢量图像编辑,就像多边形的画笔一样,创建画笔的Minkowski sum和鼠标的路径。新的多边形将从以前存在的不同颜色的多边形中减去,并与任何现有的相同颜色的多边形合并。
计划是将每个鼠标移动作为从鼠标前一个位置到当前位置的线段,计算该线段上的Minkowski总和,然后使用Weiler–Atherton clipping algorithm更新现有多边形以包含那个Minkowski总和。
由于Weiler-Atherton似乎可能会导致每次鼠标移动时出现UI延迟,我们计划通过将其放入另一个可以花时间赶上最新鼠标移动的线程来延迟该步骤,或者另外保存所有Weiler-Atherton计算直到绘图完成,然后在保存时将其作为批量操作。我们担心这可能会导致大量重叠多边形的积累,以至于UI会被延迟所需的时间。
问题是:上述计划是否与Inkscape和其他严格的矢量图形编辑软件执行此操作的方式相同?这似乎是一个疯狂的计划,无论是算法的棘手程度还是计算的复杂性。专家会做什么?
正在考虑的另一个选项:使用简单的光栅操作进行绘画,然后将光栅转换为矢量图像作为最后一步。从光栅到矢量的转换似乎不比Weiler-Atherton那么棘手,最终输出的质量可能会受到影响,但它可能是更好的选择吗?
答案 0 :(得分:1)
当用户按住鼠标按钮并绘图时,您可以记住所有鼠标移动线段,同时将画笔*线Minkowski总和渲染到屏幕分辨率位图。
您可以使用位图绘制屏幕,直到用户释放按钮。那时你可以计算所有线段Minkowski总和的并集,并将得到的形状添加到你的绘图中。
要同时计算这么多形状的并集,某种扫描线算法最好。您应该能够在O(N log N)或线性时间内完成工作,这不会导致任何明显的延迟。
答案 1 :(得分:1)
IMO Weiler-Atherton的瓶颈是交叉口的检测,当蛮力施加时需要O(N²)操作。其余的处理是顶点和交叉点之间链接的重组,应该限制为O(N),甚至是O(NI),其中NI表示交叉点的数量。
在这种特殊情况下,您可以通过网格化或边界框的层次结构来加速搜索交叉点。 (注意,网格化与Matt使用辅助位图渲染的想法相似。)
除非你真的有十亿边缘,否则我不会害怕运行时间。
答案 2 :(得分:1)
如果你想像专业的矢量图形软件那样做任意刷子形状(包括刷子形状等功能可以对速度或手写笔压力做出反应),不幸的是它可能非常复杂。
我正在尝试“Ahn,Kim,Lim - 2D曲线对象的近似一般扫描边界”中描述的方法。它似乎处理了许多我希望从专业绘图应用程序中获得的情况 - 特别是刷子形状在扫描时可以动态的细节;自适应地生成所需分辨率的边界曲线; 2d曲线的可变宽度偏移;等。
如果您不需要通用方法,似乎可以简化此方法。但我想在此作为参考添加它。
PS:我正在搜索非支付方式的链接以包含在答案中,然后出现了这个问题 - Looking for an efficient algorithm to find the boundary of a swept 2d shape。看起来非常类似于你想要做的事情:)。