如何使用有损近似从计算点确定贝塞尔曲线控制点?

How to determine the bezier control points from calculated points with lossy approximation?

我对计算曲线的贝塞尔控制有疑问。问题如下图所示:

我的红色点在一个有序列表中,包括C和D。我需要找到F和E。问题是不是每个点都必须在曲线上(曲线不需要通过任何点,除了开始和结束)。它必须是 "approximation".

我已经阅读了以下内容:

所以我对如何解决这个问题的想法是:

  1. 计算通过C和D的直线的最远点
  2. 如果点数是偶数,查看列表中的上一个点和下一个点,确定哪一个离假想线更远,并计算它们之间的中点
  3. 三个点不足以得到曲线的形状,我需要 25% 和 75% 的值。幸运的是,有几种方法可以确定这一点:等距法、弧长法和向心法。
  4. 现在我有 5 个点(开始、25%、中间、75%、结束)来描述我的曲线。我知道每个的 t 值。曲线应如下所示:

据此,我需要以某种方式将点插入贝塞尔公式,然后反向计算控制点...如何?

提前感谢您的任何提示。

我在 "Creating a curve from three points" 部分的 "A Primer on Bézier Curves" 上写了如何完成此操作,但您可能还需要阅读前两部分,因为它们解释了支持理论和代码。

重要的信息是 for any given t, there is a fixed point on the line {start,end} that connects to your on-curve point Bezier(t)。例如,在下图中,点 C 始终 与起点和终点的距离比相同。根据您放置控制点的位置,曲线看起来如何并不重要:在 t=0.5 标记处,C 始终位于起点和终点之间的 mid-way。此外,线段{C,Bezier(t)}与线段{Bezier(t),A}的长度之比是固定的。因此,如果您知道前两点 CBezier(t)——您知道的——那么您会立即知道 A 的去向,因此您拥有所需的所有信息。

有了它,您可以随心所欲地重建曲线,唯一的自由参数是 t 处的切线,或者更准确地说,左右插值距离。没有超过三个点,这几乎是一个猜测值,并且有一些 "aesthetically pleasing" 选项,但其中 none 适用于您的情况:您在选择的 t 值周围有很多点然后您可以根据这些对切线进行有根据的猜测,并且您可以使用该信息简单地重建三次贝塞尔曲线。

在没有信息的情况下,安全的路线是根据 De Casteljau 算法所说的插值线段所在的位置来选择距离,并选择它们的中心:

但是根据您的数据,您可以获得更好的拟合度。

最简单的是最小二乘近似。如果B(t)是贝塞尔方程,Pi是要逼近的点,ti是对应的参数值,你要最小化 LSQ = ∑i||B(ti)-Pi||2 = ∑i ((Bx(ti) -Pxi)2 + ((By(ti)-Pyi)2).可以把F和E的坐标作为变量,所以得到四个一次方程,在四个变量中:∂/∂Fx(LSQ)=0, ∂/∂Fy (LSQ)=0, ∂/∂Ex(LSQ)=0, ∂/∂ Ey(LSQ)=0。它们可以使用标准方法求解。要找到相应的参数值,您可以使用弦长近似,结果很好:ti = ||Pi - Pi-1|| /总计,总计 = ||D-Pn|| + ∑||Pi-Pi-1||(取P0=C)。如果需要最好的近似,可以refine使用迭代算法的参数。