我有一个关于计算曲线的贝塞尔曲线控件的问题。问题如下图所示:

algorithm - 如何从有损近似的计算点中确定贝塞尔曲线控制点?-LMLPHP

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

我已经阅读了以下内容:

  • Finding the control point of bezier curves-仅适用于水平对齐的手柄,我没有中点。还会仅找到用户可见的控制点,而不是F和E
  • Parametric reconstruction of a NURBS curve-如果您想在红色点之间进行插值就可以了,但这不是我的目标。

  • 所以我对如何解决这个问题的想法是:
  • 计算通过C和D的直线中最远的点
  • 如果点的数量是偶数,请查看列表中的上一个和下一个点,确定哪一个离假想线更远,并计算它们之间的中点。
  • 三个点不足以获取曲线的形状,我需要25%和75%的值。幸运的是,有几种方法可以确定这种情况:等距方法,Arc长和中心点方法。
  • 现在我有5个点(开始,25%,中间,75%,结束)来描述我的曲线。我知道每个的t值。曲线应如下所示:

  • algorithm - 如何从有损近似的计算点中确定贝塞尔曲线控制点?-LMLPHP

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

    预先感谢您的任何提示。

    最佳答案

    我在"Creating a curve from three points"部分的“贝塞尔曲线上的基础知识”一书中写下了如何执行此操作的方法,尽管您可能还需要阅读前两部分,因为它们解释了支持的理论和代码。

    重要的信息是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始终始终位于起点和终点之间。此外,线段{CBezier(t)}和线段{Bezier(t)A}的长度之比是固定的。因此,如果您知道CBezier(t)的前两点(即您要做的),那么您会立即知道A的去向,因此您拥有所需的所有信息。

    algorithm - 如何从有损近似的计算点中确定贝塞尔曲线控制点?-LMLPHP

    这样,您可以根据自己的喜好重新构建曲线,唯一的自由参数是t的切线,或更准确地说是左右插值距离。如果没有超过三个点,这几乎是一个猜测值,并且有一些“美观”的选择,但这些都不适合您的情况:您在所选t值周围有很多点,然后就可以对切线进行有根据的猜测基于这些信息,您可以使用该信息简单地重建三次方贝塞尔曲线。

    由于没有信息,安全的方法是根据De Casteljau算法说出插值线段所在的位置来选择距离,并选择其中心:

    algorithm - 如何从有损近似的计算点中确定贝塞尔曲线控制点?-LMLPHP

    但是,鉴于您的数据,您将获得更好的拟合度。

    10-07 16:28
    查看更多