数学 – 通过重用基本的贝塞尔曲线函数来绘制贝塞尔曲线的一部分?

假设我正在使用一些允许我绘制的图形API
贝塞尔曲线通过指定4个必要点:
开始,结束,两个控制点.

我可以重用这个函数来绘制“原始”曲线的百分之几
(通过调整控制点和终点)?

还是不可能?

不必要的信息,有人关心:

>我需要整个事情画出原来的n%
贝塞尔曲线
具有不同的颜色和/或线条风格
>我使用Java的Path2D绘制bezier曲线:

Path2D p = new GeneralPath();
p.moveTo(x1, y1);
p.curveTo(bx1, by1, bx2, by2, x2, y2);
g2.draw(p);
您需要的是 the De Casteljau algorithm.这将允许您将曲线分割成您想要的任何细分.

然而,由于您只处理立方曲线,所以我想建议一个稍微更容易使用的公式,它将给出一个从t0到t1的段,其中0 <= t0 <= t1 <= 1.这里有一些伪代码:

u0 = 1.0 - t0
u1 = 1.0 - t1

qxa =  x1*u0*u0 + bx1*2*t0*u0 + bx2*t0*t0
qxb =  x1*u1*u1 + bx1*2*t1*u1 + bx2*t1*t1
qxc = bx1*u0*u0 + bx2*2*t0*u0 +  x2*t0*t0
qxd = bx1*u1*u1 + bx2*2*t1*u1 +  x2*t1*t1

qya =  y1*u0*u0 + by1*2*t0*u0 + by2*t0*t0
qyb =  y1*u1*u1 + by1*2*t1*u1 + by2*t1*t1
qyc = by1*u0*u0 + by2*2*t0*u0 +  y2*t0*t0
qyd = by1*u1*u1 + by2*2*t1*u1 +  y2*t1*t1

xa = qxa*u0 + qxc*t0
xb = qxa*u1 + qxc*t1
xc = qxb*u0 + qxd*t0
xd = qxb*u1 + qxd*t1

ya = qya*u0 + qyc*t0
yb = qya*u1 + qyc*t1
yc = qyb*u0 + qyd*t0
yd = qyb*u1 + qyd*t1

然后绘制由(xa,ya),(xb,yb),(xc,yc)和(xd,yd)形成的贝塞尔曲线.

注意,t0和t1不是曲线距离的精确百分比,而是曲线参数空间.如果你绝对必须有距离,那么事情会更加困难.尝试这个,看看它是否做你所需要的.

编辑:值得注意的是,如果t0或t1为0或1,这些方程式会简化一些(即,您只想从一边修剪).

此外,关系0 <= t0 <= t1 <= 1不是严格的要求.例如,t0 = 1和t1 = 0可用于向后“曲线”曲线,或者可以使用t0 = 0和t1 = 1.5来延伸曲线超过原始端.但是,如果您尝试将其延伸超过[0,1]范围,则​​曲线可能看起来与您预期的不同. 编辑2:在我原来的答复3年以上,MvG指出了我的方程式的错误.我忘了最后一步(额外的线性插值得到最终的控制点).上面的方程式已被纠正.

相关文章
相关标签/搜索