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

标签 algorithm graphics rust bezier

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

Problem bezier curve

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

我已经阅读了以下内容:

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

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

maybe solution

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

预先感谢您的任何提示。

最佳答案

我在 "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 } 是固定的。所以,如果您知道前两点CBezier(t) --你这样做--然后你立即知道在哪里 A继续,这样您就拥有了所需的所有信息。

enter image description here

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

由于缺乏信息,安全的路线是根据 De Casteljau 算法所说的插值线段所在位置来选择距离,并选择它们的中心:

enter image description here

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

关于algorithm - 如何通过有损近似的计算点确定贝塞尔曲线控制点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42459756/

相关文章:

java - java实现归并排序出错?

algorithm - 为什么这种基于 DFS 的拓扑排序算法有效?

algorithm - 检查圆是否适合穿过非量化二维空间中的迷宫

java - Android 相机应用程序 - 大位图处理

javascript - CSS图形操作——连接动态Divs

rust - 我可以从 &[u32] 中过滤出特定的数字并将其转换为 Vec<u32> 吗?

Java,从数组中查找第 K 个最大值

java - 为什么我的图像没有充满绿色?

rust - 创建不同结构的向量的常用方法是什么?

rust - Rust借用可能未初始化的变量-作为程序员,这对我来说很明显,它将始终被初始化