我有一个关于计算曲线的贝塞尔控件的问题。问题如下图所示:
我有一个有序列表中的红点,包括C和D。我需要找到F和E。问题是并不是每个点都必须在曲线上(曲线不需要经过任何点,除了开始和结束)。它只是一个“近似值”。
我已经阅读了以下内容:
- Finding the control point of bezier curves - 仅适用于水平对齐的 handle ,我没有从中点开始。也只找到用户可见的控制点,而不是 F 和 E
- Parametric reconstruction of a NURBS curve - 如果你想在红点之间进行插值,那很好,但这不是我的目标
所以我对如何解决这个问题的想法是:
- 计算距离通过 C 和 D 的直线最远的点
- 如果点的数量是偶数,则查看列表中的上一个点和下一个点,确定哪一个距离假想线更远,并计算它们之间的中点
- 三个点不足以获得曲线的形状,我需要 25% 和 75% 的值。幸运的是,有几种方法可以确定这一点:均匀间隔法、Arc长法和向心法。
- 现在我有 5 个点(开始、25%、中间、75%、结束)来描述我的曲线。我知道每个的 t 值。曲线应如下所示:
由此,我需要以某种方式将点插入贝塞尔公式,然后反向计算控制点......如何?
预先感谢您的任何提示。
最佳答案
我在 "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 算法所说的插值线段所在位置来选择距离,并选择它们的中心:
但是根据您的数据,您可以获得更好的拟合结果。
关于algorithm - 如何通过有损近似的计算点确定贝塞尔曲线控制点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42459756/