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

Big*_*azy 2 algorithm graphics bezier rust

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

问题贝塞尔曲线

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

我已经阅读了以下内容:

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

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

也许解决方案

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

预先感谢您的任何提示。

Mik*_*ans 5

我在“ 从三点创建曲线”的贝塞尔曲线上的基础知识”一文中做了详细说明。部分,尽管您可能还需要阅读前两部分,因为它们解释了支持的理论和代码。

重要的信息是,对于任何给定的情况t,在{start,end}线上有一个固定点连接到曲线上的Bezier(t)点。在下面的图像,例如,点C总是在从开始和结束相同的距离比。曲线的形状与放置控制点的位置无关,都无关紧要:在t=0.5标记处,C始终始终在起点和终点之间。另外,线段{ CBezier(t)}和线段{ Bezier(t)A} 的长度之比是固定的。因此,如果您知道前两点C以及Bezier(t)您要进行的工作,那么您会立即知道在哪里A 这样,您便拥有了所需的所有信息。

在此处输入图片说明

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

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

在此处输入图片说明

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