我正在编写代码,使它近似于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/6
到t = 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/