Math B&xE9的绘图部分;通过重复使用基本Bé;齐尔曲线函数?

Math B&xE9的绘图部分;通过重复使用基本Bé;齐尔曲线函数?,math,graphics,drawing,coordinates,Math,Graphics,Drawing,Coordinates,假设我正在使用一些图形API,它允许我画画 通过指定4个必要的点来绘制bezier曲线: 开始、结束、两个控制点 是否可以重复使用此函数绘制“原始”曲线的x百分比 (通过调整控制点和终点) 还是不可能 不必要的信息,如果有人关心: 我需要整件东西画出原作的每n% 贝塞尔曲线 具有不同的颜色和/或线条样式 我正在使用Java的Path2D绘制贝塞尔曲线: 您需要的是。这将允许您将曲线分割为所需的任何分段 然而,由于您只处理三次曲线,我想建议一个更易于使用的公式,它将为您提供一个从t0到t1的段

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

是否可以重复使用此函数绘制“原始”曲线的x百分比 (通过调整控制点和终点)

还是不可能

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

  • 我需要整件东西画出原作的每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