gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:12:26 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

我希望这很容易理解并有所帮助。

关于algorithm - 什么是平滑多个二次贝塞尔曲线的好算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9833594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com