绘制贝塞尔曲线的部分段落
我在写代码,想把一个四分之一的椭圆近似成一个贝塞尔曲线。
现在我已经完成了这个工作,但在绘制这条曲线的某些部分时遇到了麻烦。 我需要一些帮助来选择控制点。
最开始,我把控制点到曲线起点的距离比例设定为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)这个位置。
注意,这里参数角度的范围是pi/2
。
如果我想把它画成更像虚线的样子,那我该怎么做呢?比如说,从t = pi/6
到t = pi/3
?我该如何选择控制点呢?
3 个回答
这个链接对贝塞尔曲线有很好的解释。它讲解了基本的数学原理,并提供了示例代码。
贝塞尔曲线通常是通过一种叫做参数方程的方式来实现的,你可以在每个样本点之间画直线段。如果你是这样画的话,步长会影响曲线的平滑程度。
我觉得你应该使用整个曲线的控制点。一个方法是找出贝塞尔曲线的参数方程版本——可以参考这个链接:如何找到定义贝塞尔曲线的数学函数。
接下来,弄清楚在参数方程中,0 <= t <= 1
的哪个部分对应于由角度p1/6 <= ө <= pi/3
定义的区间,然后把这个范围的值代入进去。
有一些方法可以计算沿着某些类型的参数化曲线的每一个点,这在这里是适用的,应该能让你绘制虚线图案变得相对简单和快速。
要用一个立方曲线来近似一个圆的四分之一,通常的做法是让曲线的中间点正好在圆上,并且使用切线的起始和结束方向。
虽然这并不是在任何合理的标准下“最佳”的近似,但计算起来非常简单……比如,圆的四分之一的魔法数字是 0.5522847498
。想了解更多细节,可以查看这个页面。
如果要画一个椭圆的弧线,你只需拉伸圆弧的控制点(同样,这也不算是数学上“最佳的近似”)。
一般角度的情况
根据这个定义(也就是贝塞尔曲线的中间点在弧线的中间),我们可以用以下方法计算出一个一般角度的最佳弧线……
1. 对称立方贝塞尔弧线的最大高度是 3/4 H,其中 H 是控制点的高度
考虑到贝塞尔立方曲线的中间点是如何通过德卡斯特利亚算法计算出来的,这一点应该很清楚;你也可以参考我关于贝塞尔曲线显式计算的回答,还有下面的图片:
y_mid = ((0+H)/2 + (H+H)/2) / 2 = 3/4 H
2. 圆弦的中心角是底边角的两倍
想要证明这一点,可以参考任何基础几何书籍。
最后,设 L
为两端之间的距离,S
为对称贝塞尔的(未知)控制臂,2*alpha
为要近似的圆的角度,我们可以计算出:
3. S = L (2/3) (1-cos(alpha)) / (sin(alpha)**2)
这个公式是从上面的方程和一些计算得出的;可以参考下面的图片了解更详细的描述。