在没有强力/查找表的情况下查找贝塞尔曲线的阿尔法点

时间:2017-04-09 14:15:28

标签: algorithm bezier

我想要沿曲线参数化(即等距间隔)的弧长。我可以使用de Casteljau和毕达哥拉斯来循环它。当曲线是静态的时,这是有效的,但如果曲线是动态的,则它是生涩的。我也试过了三次多项式,给出了与de Casteljau相同的点数。

有没有办法改变这些函数以在没有循环/数组的情况下有效获得alp-points?近似没问题。

float lerp(float  A, float B, float C) {
  return A*(1-C)+B*C;
}

float bezierPoint_lerp(float A, float B, float C, float D, float T) { 
  return lerp(lerp(lerp(A, B, T), lerp(B, C, T), T), 
              lerp(lerp(B, C, T), lerp(C, D, T), T), T);
}

float bezierPoint_pow(float A, float B, float C, float D, float T) { 
  return A * pow(1-T,3) + 
         B * 3 * pow(1-T,2) * T +
         C * 3 * (1-T) * pow(T,2) + 
         D * pow(T,3);
}

1 个答案:

答案 0 :(得分:0)

一般情况下,您不能象征性地对弧线进行弧度重新参数化,因此您最好的选择是在绘制曲线的同时标记等距离点。在绘制曲线长度之前计算曲线长度,然后在绘制曲线的像素到屏幕时,进行近似距离聚合,当你点击一个坐标为#34;大致相当于前一个坐标的距离" ;,将其标记在自己的列表中。在绘制曲线完成时继续这样做,然后在最后你有一个专门的简短列表,只列出你的" alp"分。