如何在“升序”立方Bézier曲线中以Δx的间隔有效地对y进行采样?

时间:2016-06-05 09:02:08

标签: algorithm performance math bezier

对于由控制点P0,P1,P2和P3定义的三次Bézier曲线,其公式为

B(t)=(1−t)^3*P0 + 3(1−t)^2t*P1 + 3(1−t)t^2*P2 + t^3*P3

我们可以得到一个对应于任何t∈[0,1]的点。然而,根据我的收集,代数求解任何一个坐标变得非常繁琐和昂贵,至少对于一般的解决方案。

现在,假设我们有一个二维曲线B(t)=(x,y),具有dx / dt>的特定约束。对于所有0≤t≤1的0,即曲线可以向正x方向前进,但从不“向上/向下”或“向后”,是否有一种有效的算法(/代数操作技巧)来排序“样本”曲线的y相对于可以利用这个属性的恒定间隔Δx?

1 个答案:

答案 0 :(得分:0)

我会回答我认为你在问的问题,而不是你实际问的问题,所以如果这不能覆盖它(即使它没有),你会想要更新你的帖子以澄清你真正的意思。

  

现在,假设我们有一个二维曲线B(t)=(x,y),具有dx / dt>的特定约束。对于所有0≤t≤1的0,即曲线可以向正x方向前进,但从不“向上/向下”或“向后”,是否有一种有效的算法(/代数操作技巧)来排序“样本”曲线的y相对于可以利用这个属性的恒定间隔Δx?

贝塞尔曲线是仿射变换不变的,因此任何符合此定义的曲线都可以旋转到不再适合该定义。假设您指的是一些规范形式,您可以通过对其应用旋转/平移来预处理曲线,使得第一个点位于(0,0),最后一个点是某个坐标(> 0,R) (即x坐标大于0,y坐标“任何实数”)。

鉴于此,您的约束意味着第一个控制点(确定t=0处曲线处的切线)必须严格位于(0,0)的右侧。 y坐标是无关紧要的(它只需要是一个实数),x坐标可以是任何大于0的实数(甚至可以像IEEE浮点数允许的那样接近零)

相反,需要类似地接近结束坐标,因此对于任何结束坐标(例如,ey),关联的控制点(确定t=1处的曲线切线)需要严格位于左侧(例如,EY);也就是说,y坐标可以是任何内容,x坐标必须小于ex,但如果没有 ex

完成后,我们现在有一条符合您需求的曲线,使采样保持固定x间隔:您有三种选择。

  1. 在数学上真正做到这一点的方法是重新评估你的曲线,使y成为x的表达,这是非常难以理解的。
  2. 您知道每个点的切线,符合您需求的Cubic Bezier曲线不会振荡,因此您可以计算“下一个x”的猜测,然后使用牛顿方法找到真实值您需要的下一个x值。或者,
  3. 解决这个编程方式:无论如何你都要绘制这条曲线,所以在绘制例程中,为需要绘制到屏幕的曲线点构建LUT:你现在有一个{{ 1}}具有关联x值的值,您只需要进行简单查找。
  4. 显然,除非你需要绝对的科学精确度,否则选项3将成为最佳选择。