我正在编写代码,使它近似于Bézier curve的四分之一椭圆。

现在,我在绘制此曲线的各个部分时遇到了麻烦。
我需要一些帮助来选择控制点。

最初,我将控制点的距离与曲线起点的距离之比设为0.51。

编辑:

pseudo code
import cairo [...]
ctx.moveto(0,y1)
ctx.curveto(0,y1/2,x1/2,0,x1,0)

这将导致从(0,y1)到(x1,0)的近似椭圆曲线,椭圆中心在(x1,y1)。

注意扫过的参数 Angular 是pi/2
如果假设我希望将其绘制成更像虚线图案的部分,那我该怎么做?例如,从t = pi/6t = pi/3?如何选择控制点?

最佳答案

要使用单个立方弧近似圆四分之一,通常要做的是使中点恰好在圆上,并使用切线的起始和终止方向。

这在任何合理的度量标准上都不是正式的“最佳”近似值,但很容易计算……例如,一个四分之一圈的幻数是0.5522847498。有关详细信息,请参见this page

相反,要绘制椭圆弧,您可以拉伸(stretch)圆弧的控制点(再一次,在数学上不能将其视为“最佳近似”)。

通用角盒

在此定义下,一般 Angular 最佳弧度(即贝塞尔曲线的中点在弧线的中间)可以使用以下方法来计算...

1.对称三次方贝塞尔弧的最大高度为3/4 H,其中H是控制点的高度

考虑到如何使用De Casteljau算法或my answer about explicit computation of a bezier curve计算贝塞尔三次方的中点,这一点应该很清楚;另请参见下图:
y_mid = ((0+H)/2 + (H+H)/2) / 2 = 3/4 H
2.圆形线中心的 Angular 是底部的 Angular 两倍

请参见任何基本几何体文本以获取证明。

最后命名L到极点之间的距离,S对称贝塞尔曲线的(未知)控制臂,2*alpha圆的 Angular 近似,我们可以计算出

3. S = L(2/3)(1-cosα)/(sinα** 2)

这是根据上述方程式和一些计算得出的;请参见下图以获取描述。

关于c++ - 绘制贝塞尔曲线的截面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6244272/

10-11 04:08