我想要沿曲线参数化(即等距间隔)的弧长。我可以使用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);
}
答案 0 :(得分:0)
一般情况下,您不能象征性地对弧线进行弧度重新参数化,因此您最好的选择是在绘制曲线的同时标记等距离点。在绘制曲线长度之前计算曲线长度,然后在绘制曲线的像素到屏幕时,进行近似距离聚合,当你点击一个坐标为#34;大致相当于前一个坐标的距离" ;,将其标记在自己的列表中。在绘制曲线完成时继续这样做,然后在最后你有一个专门的简短列表,只列出你的" alp"分。