我有一个关于计算曲线的贝塞尔曲线控件的问题。问题如下图所示:
我有一个红色的点在一个有序列表中,包括C和D。我需要找到F和E。问题在于,并非每个点都必须在曲线上(曲线不需要通过任何点,除了开始和结束)。它只是一个“近似值”。
我已经阅读了以下内容:
所以我对如何解决这个问题的想法是:
由此,我需要以某种方式将点插入贝塞尔曲线公式,然后反向计算控制点...如何?
预先感谢您的任何提示。
最佳答案
我在"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
始终始终位于起点和终点之间。此外,线段{C
,Bezier(t)
}和线段{Bezier(t)
,A
}的长度之比是固定的。因此,如果您知道C
和Bezier(t)
的前两点(即您要做的),那么您会立即知道A
的去向,因此您拥有所需的所有信息。
这样,您可以根据自己的喜好重新构建曲线,唯一的自由参数是t
的切线,或更准确地说是左右插值距离。如果没有超过三个点,这几乎是一个猜测值,并且有一些“美观”的选择,但这些都不适合您的情况:您在所选t
值周围有很多点,然后就可以对切线进行有根据的猜测基于这些信息,您可以使用该信息简单地重建三次方贝塞尔曲线。
由于没有信息,安全的方法是根据De Casteljau算法说出插值线段所在的位置来选择距离,并选择其中心:
但是,鉴于您的数据,您将获得更好的拟合度。