如何用有损近似计算出计算点的贝塞尔控制点?

时间:2017-02-25 18:09:36

标签: algorithm graphics rust bezier

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

Problem bezier curve

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

我已经阅读了以下内容:

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

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

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

    提前感谢任何提示。

2 个答案:

答案 0 :(得分:4)

我在"Creating a curve from three points"部分写了关于“Bézier曲线的入门”的文章,但你可能还需要阅读前面两节,因为它们解释了支持理论和代码。 / p>

重要信息是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的去向,所以你需要所有的信息。

enter image description here

通过这种方式,您可以随意重建曲线,您的唯一自由参数是t的切线,或者更确切地说,是左右插值距离。没有超过三个点,这几乎是一个猜测的价值,并且有一些“美学上令人愉悦”的选项,但这些选项都不适用于你的情况:你在你选择的t值附近有一堆积分然后你可以制作一个基于这些对切线进行有根据的猜测,您可以使用该信息简单地重建三次贝塞尔曲线。

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

enter image description here

但是根据你的数据,你可以更好地适应。

答案 1 :(得分:0)

最简单的是最小二乘近似。如果B(t)是贝塞尔方程,P i 是近似点,t i 是相应的参数值,你想最小化LSQ =Σ< sub> i || B(t i ) - P i || 2 i ((B x (t i ) - P xi 2 +((B y (t i ) - P yi 2 。你可以把F和E的坐标作为变量,所以你得到四个线性方程,四个变量:∂/∂ F x (LSQ)= 0,∂/∂ F y < / sub>(LSQ)= 0,∂/∂ E x (LSQ)= 0,∂/∂ E y < / sub>(LSQ)= 0.它们可以使用标准方法求解。要找到相应的参数值,可以使用弦长近似,这样可以得到很好的结果:t i = || P i - P i-1 || / total,total = || DP n || +Σ|| P i < / sub> -P i-1 ||(取P 0 = C)。如果需要最佳近似值,可以优化带有迭代算法的安培计。