首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是平滑多条二次bezier曲线的好算法?

什么是平滑多条二次bezier曲线的好算法?
EN

Stack Overflow用户
提问于 2012-03-23 10:58:46
回答 1查看 2.7K关注 0票数 4

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

我想包括一个“平滑”按钮,用户可以点击它来自动平滑线条。我希望保持原始曲线和平滑曲线之间的整体均方误差较小,而不是使坡度完美匹配。然而,100%的准确性并不是必须的,因为它是一个绘图程序-速度更重要。有没有好的算法可以做到这一点?我似乎找不到这方面的任何参考资料。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-27 07:03:20

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

例如,在您描述的情况下,在P2将有一个角落

我们可以使用任何小于0.5的epsilon,让我们使用0.1,所以我们有P1.9,P2.1。

代码语言:javascript
复制
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

你可以这样做:

代码语言:javascript
复制
Bezier(P0, P1, P1.9);
Bezier(P1.9, P2, P2.1);
Bezier(P2.1, P3, P4);

而不是做:

代码语言:javascript
复制
Bezier(P0, P1, P2);
Bezier(P2, P3, P4);

我希望这个新的答案能有所帮助..否则,我希望看到一个图像,描述您所拥有的线条的类型,以及您希望看到的结果。(这将有助于过滤出不符合条件的答案)

老答案:用户为每条bezier曲线输入3个点?

如果你想画一条流畅的线条,你可以这样做:

1.创建新的插值点:

代码语言:javascript
复制
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.代替绘图:

代码语言:javascript
复制
Bezier(p0, p1, p2);
Bezier(p2, p3, p4);

代码语言:javascript
复制
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);

我希望这是容易理解和有帮助的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9833594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档