平滑多个二次贝塞尔曲线的好算法是什么?

5
我有一个矢量绘图应用程序,用户可以使用多个二次贝塞尔曲线绘制线条。例如,一条曲线可能有5个点 - 点0-2为一个二次贝塞尔曲线,点2-4形成另一个曲线。如果第一个贝塞尔曲线末端的斜率不等于第二个贝塞尔曲线开头的斜率,则该曲线不平滑。
我想包括一个“平滑”按钮,用户可以点击以自动平滑线条。与使斜率完全匹配相比,我希望保持原始和平滑曲线之间的MSE总体较小。然而,100%的准确性并不是必要的,因为它是一个绘图程序 - 速度更重要。是否有任何好的算法可以做到这一点?我似乎找不到任何相关的参考资料。

可能是贝塞尔曲线绘制路径的重复问题 - High Performance Mark
3
这个答案并不适用。那些解决方案更多是用于将贝塞尔曲线拟合到一组原始点上。我正在寻求对已有曲线进行平滑处理的方法。 - Charles L.
我修改了答案以最好地匹配您所描述的内容。 - AturSams
1个回答

5

如果您想保持线条的整体形状并使拐角变圆,可以:

在每个拐角周围创建新点:

例如,在您描述的情况下,有一个拐角在P2处。

我们可以使用任何epsilon < 0.5来实现这个目的,让我们使用0.1,所以我们有P1.9、P2.1。

P1.9.x = (9 * P2.x + P1.x)/10
P1.9.y = (9 * P2.y + P1.y)/10

P2.1.x = (9 * P2.x + P3.x)/10
P2.1.y = (9 * P2.y + P3.y)/10

你可以这样做:
Bezier(P0, P1, P1.9);
Bezier(P1.9, P2, P2.1);
Bezier(P2.1, P3, P4);

不要这样做:

Bezier(P0, P1, P2);
Bezier(P2, P3, P4);

我希望这个新的回答能够帮到您...否则我想看到一个描述您拥有的线条类型和您想要看到的结果的图像。(这将有助于过滤掉与标准不符的答案)

旧的回答: 用户为每个贝塞尔曲线输入3个点?

如果您想要制作平滑的线条,可以按以下步骤进行:

1.创建新的插值点:

p0.5[x] = (p0[x] + p1[x]) / 2;
p0.5[y] = (p0[y] + p1[y]) / 2;

1. 对于p1.5、p2.5等,同样进行上述操作,其中p(N.5)使用p(N)和p(N+1)。

2. 不要绘制:

Bezier(p0, p1, p2);
Bezier(p2, p3, p4);

绘图
Line(p0, 0.5);
Bezier(p0.5, p1, p1.5);
Bezier(p1.5, p2, p2.5);
Bezier(p2.5, p3, p3.5);
Line(p3.5, p4);

我希望这篇文章易于理解并有所帮助。


是的,Bezier(p0, p1, p2)处的斜率由line(p1,p2)决定,而Bezier(p2, p3 ,p4)处的斜率由line(p2,p3)决定。为了使斜率连续,p2必须为p1t + p3(1-t)。选择t=0.5非常简单和自然。 - fchen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接