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

时间:2012-03-23 02:58:46

标签: algorithm bezier

我有一个矢量绘图应用程序,用户可以使用多个二次贝塞尔曲线绘制线条。例如,曲线可以有5个点 - 对于二次贝塞尔曲线,点0-2,而点2-4形成另一个。如果第一条贝塞尔曲线的斜率@不等于第二条贝塞尔曲线开始处的斜率,则曲线不平滑。

我想要添加一个“平滑”按钮,用户可以点击该按钮自动平滑线条。我想保持原始和平滑曲线之间的整体MSE较小,而不是使斜率完美匹配。但是,100%的准确度不是必需的,因为它是一个绘图程序 - 速度更重要。有没有可以做到这一点的好算法?我似乎无法找到任何参考资料。

1 个答案:

答案 0 :(得分:4)

如果你想保持线条的整体形状并使角落变圆,你可以: 在每个角落周围创建新点:

例如,在您描述的情况下,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.b对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);

我希望这很容易理解和帮助。