我有一个关于计算曲线bezier控件的问题。问题如下图所示:
我在有序列表中有红点,包括C和D.我需要找到F和E.问题是不是每个点都必须在曲线上(曲线不需要通过任何点,除了开始和结束)。它只需要是一个“近似”。
我已经阅读了以下内容:
所以我对如何解决这个问题的想法是:
答案 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
始终位于开始和结束之间的中间位置。此外,线段{C
,Bezier(t)
}和线段{Bezier(t)
,A
}的长度之间的比率是固定的。所以,如果你知道前两个点C
和Bezier(t)
- 你做了什么 - 那么你就会立刻知道A
的去向,所以你需要所有的信息。
通过这种方式,您可以随意重建曲线,您的唯一自由参数是t
的切线,或者更确切地说,是左右插值距离。没有超过三个点,这几乎是一个猜测的价值,并且有一些“美学上令人愉悦”的选项,但这些选项都不适用于你的情况:你在你选择的t
值附近有一堆积分然后你可以制作一个基于这些对切线进行有根据的猜测,您可以使用该信息简单地重建三次贝塞尔曲线。
缺乏信息,安全路线是根据De Casteljau算法所说的插值线段所在的位置选择距离,然后选择它们的中心:
但是根据你的数据,你可以更好地适应。
答案 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)。如果需要最佳近似值,可以优化带有迭代算法的安培计。