我正在研究一种在嵌入式系统上运行的控制算法。我的编程语言是C,系统在内存和处理能力方面将受到严格的限制。
我在三维空间中有几个(大约10个)参考点。这些通常是静态的,但会偶尔改变。我想拟合一个样条曲面,使它通过所有这些点,然后有一个函数,对于给定的输入向量(x, z)返回距离y到平面y = 0。
我认为这是一个需要分两部分解决的问题:1)每当参考点改变时,将计算一些新的系数,2)系数被插入到一个函数中,该函数返回y对于给定的(x, z)。(只有2个需要"实时"发生。)
我在网上研究了一下,但我对数学有困难,而且很多材料都是专门针对计算机图形学的。我甚至不确定我需要什么样的样条;NURBS和Catmull-Rom似乎都有相关性。最后,关于样条边缘的形状:由于我的输入向量来自有界的传感器读数,所以我并不真正关心样条在该边界之外的情况。
我将非常感谢一些帮助或相关材料的指针,任何伪代码片段将不胜感激。
如果你能在参考点改变时生成bsamziier三角形,这些三角形的光滑表面很容易计算,即使你的微控制器的资源有限-它只需要重复的加法和除以2。
生成通过所有点的bsamzier三角形的一种方法是使用德劳内三角在你的参考点上找到一堆覆盖你表面的三角形。然后用这些三角形的角作为贝塞尔三角形的角,任意选择控制点,使得相邻三角形之间的边缘是"光滑的"(而不是"折痕的")。选择这些控制点的一种可能方法:
对于每个三角形角点(即每个原始参考点):
- 找到所有的三角形边,其中一端在那个角点
- 查找与该角点"连接"的所有点(在这些边的另一端)
- 拟合一个穿过那个角点的平面,最小均方差"接近"连接点
- 对于每条边,从给定的角点向连接的角点选择1/4(或1/3或1/10或任何)的点。在求出平面上离该点最近的点后,忘掉该点。使用生成的点作为与该边相邻的两个三角形的控制点之一。
为每个贝塞尔三角形给出除了一个控制点以外的所有控制点。对于贝塞尔三角形的剩余中央控制点,也许最简单的方法是使用角点的几何平均值(质心)。