寻找三次贝塞尔曲线控制点的算法(实现细节)

Algorithm for finding control points of cubic bezier (implementation details)

我在谷歌上搜索了很多,但我发现的所有算法都使用方程来寻找控制点。我认为有更简单的解决方案可以做到这一点,并在 ExtJS 源代码中找到了一些实现:http://docs-devel.sencha.com/extjs/4.1.2/source/Draw.html#Ext-draw-Draw-method-getAnchors。它使用最近的线点之间的角度来检测控制点和一些 hacks。

谁能定义一下这是什么搜索控制点的算法?我被困在 PI 和角度的操纵中。可能有更详细和更清晰的解释,或者这种解决问题的方式的共同想法?

Catmull-Rom 拟合:代码尝试根据点 X-1 和 X+1 的位置找到通过点 X 的合适切线,这样切线平行于直线 (X -1)--(X+1),然后调整屈服的控制点,以确保 "incoming" 和 "outgoing" 切线产生美观的曲线。

  1. 有积分
  2. 假设正切等于 (p-1)--(p+1)
  3. 通常看起来很糟糕
  4. 稍微缩放控制点以更好地拟合

从技术上讲,您执行第 4 步的方式不再是 Catmull-Rom,因为一旦设置了切线,真正的 Catmull-Rom 样条就会停止。如果您确实需要第 4 步,通常的方法是根据投影距离缩放点:如果您将点 X 投影到直线 (X-1)--(X+1) 上,它很少会正好在线的中间,但与点 X-1 的距离为 v%,与点 X+1 的距离为 (100-v)%,因此您相应地缩放找到的切线。