使用贝塞尔曲线进行圆近似

时间:2010-06-22 20:19:05

标签: math graphics bezier openjdk renderer

我有2个关于贝塞尔曲线的问题,并使用它们来近似圆圈的部分。

  1. 给定单位圆弧(1,0) - >(cos(a),sin(a))其中0 < a&lt; pi / 2,结果如何 通过求解由要求B(1/3)=(cos(a / 3),sin(a / 3))强加的方程,在该弧的良好近似中找到贝塞尔曲线的控制点p1,p2 和B(2/3)=(cos(2a / 3),sin(2a / 3))。 (换句话说,要求 贝塞尔曲线穿过圆弧中的两个均匀间隔点。

  2. 如果我们有一个仿射变换A,它会转动圆弧 椭圆弧将变换的控制点Ap0,Ap1,Ap2,Ap3定义 对椭圆弧的良好贝塞尔近似?

  3. p0和p3当然是曲线的起点和终点:(1,0)和(cos(a),sin(a))。

    谢谢

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:1)

你的问题基本上问“这是半圆形/椭圆弧的良好近似值”。

您可能想要尝试计算B_y(a) - sin(a)(当然,将(-1,0)的方程参数设置为[{1}},并且a的值为B(a)),在图表实用程序(例如Wolfram Alpha)上绘制图形,并查看差异的大小,以及它是否适合您的目的。

如果您想要更精确和非直观的答案,您可以计算

Integral (from 0 to K) [B_y(a) - sin(a)]^2 da / 2

其中K是a的值,其中两条参数化曲线最终都在(-1,0)

这个积分与标准偏差的某个度量相关/比例(稍微),并且可以很好地用作数值分析。如果它符合您所需的准确度,那么您就是好的。

如果您的转换基本上是线性的,那么您提到圆形与椭圆的仿射变换的第二个问题将给出与原始误差成比例的误差。如果没有,您可以尝试使用转换的Jacobian Determinant来查看错误的变化情况。

我还找到了一个很好的Analysis of Semicircle-Bezier Approximations作者找到了一个非常性感的近似值:

Bezier Semicircle

鉴于:

xValueInset = Diameter * 0.05
yValueOffset = radius * 4.0 / 3.0

P0 = (0,0)
P1 = (xValueInset, yValueOffset)
P2 = (Diameter - xValueInset, yValueOffset)
P3 = (Diameter, 0)

P1和P2是你的控制点。请注意,这近似于半圆:

B(a) = [ (d/2)*cos(a)+d/2 , (d/2)*sin(a) ]