Math B&xE9的绘图部分;通过重复使用基本Bé;齐尔曲线函数?
假设我正在使用一些图形API,它允许我画画 通过指定4个必要的点来绘制bezier曲线: 开始、结束、两个控制点 是否可以重复使用此函数绘制“原始”曲线的x百分比 (通过调整控制点和终点) 还是不可能 不必要的信息,如果有人关心:Math B&xE9的绘图部分;通过重复使用基本Bé;齐尔曲线函数?,math,graphics,drawing,coordinates,Math,Graphics,Drawing,Coordinates,假设我正在使用一些图形API,它允许我画画 通过指定4个必要的点来绘制bezier曲线: 开始、结束、两个控制点 是否可以重复使用此函数绘制“原始”曲线的x百分比 (通过调整控制点和终点) 还是不可能 不必要的信息,如果有人关心: 我需要整件东西画出原作的每n% 贝塞尔曲线 具有不同的颜色和/或线条样式 我正在使用Java的Path2D绘制贝塞尔曲线: 您需要的是。这将允许您将曲线分割为所需的任何分段 然而,由于您只处理三次曲线,我想建议一个更易于使用的公式,它将为您提供一个从t0到t1的段
- 我需要整件东西画出原作的每n%
贝塞尔曲线 具有不同的颜色和/或线条样式 - 我正在使用Java的Path2D绘制贝塞尔曲线:
- 您需要的是。这将允许您将曲线分割为所需的任何分段
然而,由于您只处理三次曲线,我想建议一个更易于使用的公式,它将为您提供一个从
t0
到t1
的段,其中0到,我刚才包括了一些计算三次曲线部分控制点的公式。当u=1时− t、 三次贝塞尔曲线描述为
B(t)=u3p1+3u2tp2+3ut2p3+t3p4
P1是曲线的起点,P4是曲线的终点。P2和P3是控制点
给定两个参数t0和t1(以及u0=(1− t0),u1=(1− t1),区间[t0,t1]中的曲线部分由新的控制点描述
- Q1=
u0u0u0p1+
(t0u0u0)+
u0t0u0+
u0u0t0)P2+
(t0t0u0+
u0T0+
t0u0t0)P3+
T0T0 T0 P4
- 问题2=
u0u0u1 P1+
(t0u0u1+
u0t0u1+
u0u0t1)P2+
(t0t0u1+
U0T1+
t0u0t1)P3+
T0T1 P4
- 第三季度=
u0u1u1 P1+
(t0u1u1)+
u0t1u1+
u0u1t1)P2+
(t0t1u1+
u0t1t1+
t0u1t1)P3+
t0t1t1 P4
- 第四季度=
u1u1u1 P1+
(t1u1u1)+
u1t1u1+
u1u1t1)P2+
(T1U1+
U1T1+
t1u1t1)P3+
T1P4
请注意,在括号中的表达式中,至少有一些项相等,可以组合。我没有这样做,因为我相信这里所述的公式会使模式更清晰。您只需在x和y方向独立执行这些计算,即可计算新的控制点
请注意,t参数范围的给定百分比通常不会对应于相同的长度百分比。因此,您很可能需要对曲线进行积分,以将路径长度转换回参数。或者使用一些近似值。+1一些注释明确指出a点和d点是原始曲线上定义新部分曲线范围的点将很有帮助。此外,b点和c点是新定义的控制点(即,仅与原始控制点松散相关)。@Bob Cross:注意。出于好奇,点b位于点a处曲线的切线上,点c位于点d处曲线的切线上。事实上,a=p(t0),b=a+p'(t0)/3,c=d-p'(t1)/3和d=p(t1),其中p(t)是t处曲线上的点,p'(t)是t处曲线的一阶导数。@Naaff,你的曲线只使用二阶多项式,因此它无法准确描述三阶曲线(即三次贝塞尔曲线)上的点。在尝试在此基础上构建时注意到了这一点。@MvG,你说得对。我无意中省略了线性插值步骤(当与二次方程相结合时,它相当于一个立方)。谢谢,我已经解决了上面的问题。对于那些感兴趣的人,这里是对上面方程的几何解释:Qa=(qxa,qya)和Qb=(qxb,qyb)位于由前三个立方控制点形成的二次曲线上。类似地,Qc=(qxc,qyc)和Qd=(qxd,qyd)位于由最后三个立方控制点形成的二次曲线上。(xa,ya)和(xb,yb)在Qa和Qc之间的直线上,而(xc,yc)和(xd,yd)在Qb和Qd之间的直线上。有一种以恒定速度绘制曲线的简单方法:
Path2D p = new GeneralPath();
p.moveTo(x1, y1);
p.curveTo(bx1, by1, bx2, by2, x2, y2);
g2.draw(p);
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