什么是平滑多个二次贝塞尔曲线的好算法?
Posted
技术标签:
【中文标题】什么是平滑多个二次贝塞尔曲线的好算法?【英文标题】:What is a good algorithm to smooth multiple quadratic bezier curves? 【发布时间】:2012-03-23 02:58:45 【问题描述】:我有一个矢量绘图应用程序,用户可以在其中使用多条二次贝塞尔曲线绘制线条。例如,一条曲线可能有 5 个点 - 二次贝塞尔曲线的点 0-2,点 2-4 形成另一个点。如果第一条贝塞尔曲线末端的斜率不等于第二条贝塞尔曲线起点的斜率,则曲线不平滑。
我想包含一个“平滑”按钮,用户可以点击它来自动平滑线条。我想保持原始曲线和平滑曲线之间的整体 MSE 较小,而不是使斜率完美匹配。然而,100% 的准确度不是必需的,因为它是一个绘图程序——速度更重要。有没有好的算法可以做到这一点?我似乎找不到任何参考资料。
【问题讨论】:
Drawing path by Bezier curves的可能重复 答案并不适用。这些解决方案更多地用于将贝塞尔曲线拟合到一组原始点。我正在寻找平滑已经存在的曲线。 我修改了答案以最符合您的描述。 【参考方案1】:如果您想保持线条的整体形状并使拐角变圆,您可以: 在每个角落创建新点:
例如,在您描述的情况下,P2 会有一个角
为此,我们可以使用任何小于 0.5 的 epsilon 让我们使用 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);
我希望这很容易理解并有所帮助。
【讨论】:
是的,Bezier(p0, p1, p2) 处的斜率由 line(p1,p2) 确定,而 Bezier(p2, p3 ,p4) 处的斜率由 line(p2, p3)。为了使斜率连续,p2 必须为 p1*t + p3*(1-t)。选择 t=0.5 非常简单自然。以上是关于什么是平滑多个二次贝塞尔曲线的好算法?的主要内容,如果未能解决你的问题,请参考以下文章