绘制贝塞尔曲线的截面

时间:2011-06-05 16:37:31

标签: c++ python bezier

我编写的代码大约是四分之一椭圆到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)。

请注意参数角度扫描为pi/2。 如果我想在更像虚线图案的部分中绘制它,那么我该怎么做呢?例如,从t = pi/6t = pi/3?如何选择控制点?

3 个答案:

答案 0 :(得分:5)

使用单个立方弧来近似圆四分之一通常所做的是使中间点正好在圆上并使用切线的起点和终点方向。

这在任何合理的指标中都不是正式的“最佳”近似值,但很容易计算...例如,圆形四分之一的幻数是0.5522847498。有关详细信息,请参阅this page

要绘制椭圆弧,您可以只拉伸圆弧的控制点(再次不是数学上称为“最佳近似”的东西)。

通用角度案例

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

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

考虑到如何使用De Casteljau算法或my answer about explicit computation of a bezier curve计算贝塞尔曲线的中点,这应该是清楚的。另见下图:

Height of midpoint of a symmetric Bezier cubic arc

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)

这是从上面的等式和一些计算得出的;请参阅下图以获取说明。

Control point distance computation

答案 1 :(得分:1)

我认为你应该使用整条曲线的控制点。一种方法是确定贝塞尔曲线的参数方程版本 - 见How to find the mathematical function defining a bezier curve

接下来,找出参数方程中0 <= t <= 1的哪一部分由角度p1/6 <= ө <= pi/3定义的部分表示,然后通过它运行该范围的值。

有一些方法可以计算出某些参数化定义曲线的每个点,这些曲线在这里是适用的,并且应该使虚线图形的绘制相当直接和快速。

答案 2 :(得分:0)

This Link对Bezier曲线有一个很好的解释。它超越了基本的数学原理,并提供了示例代码。

由于贝塞尔曲线通常使用参数方程实现,因此您只需在每个采样点之间绘制线段。如果以这种方式绘制曲线,步长会影响曲线的平滑度。