我试图想出一种简单而有效的方法来创建一个与许多给定"样本"点相交的光滑表面.
对于表面上的任何X,Y点,我在4个方向中的每个方向上识别最多4个采样点(X上的下一个较高点和较低点,然后是Y轴).鉴于这一点,我想要一种计算在4个样本点之间插值的Z值的方法.
当然,给定4个采样点中的任何一个的X,Y位置的算法应输出该点的Z值.另请注意,可能少于4个采样点.
我猜测4个样本点的Z值的某些函数,不知何故被样本点的距离反向偏置,但我无法弄清楚如何做到这一点.
有人对这个简单的方法有任何想法吗?
您可以通过构建Catmull-Rom样条曲线中的补丁来完成此操作.这些样条线将击中每个控制点,并且它们在一阶导数中是连续的(尽管不是第二个).我也发现它们非常容易使用.数学很简单,直观,控制点略有变化.
在最高级别,每个补丁需要16个点(在数据集的边缘,您可以在同一个样条曲线中使用两次角点和边缘点).
首先,您需要在4x4矩阵的每一行中对点p [i] [j]进行插值,以创建一组四个中间控制点q [i].这是我的意思的粗略ASCII草图.
p00 p01 q0 p02 p03 p10 p11 q1 p12 p13 p20 p21 q2 p22 p23 p30 p31 q3 p32 p33
现在,您可以在这四个中间控制点中的每一个之间进行插值,以在曲面上找到最终的花键点.
这是Catmull-Rom花键横跨四个点的结构.在此示例中,您使用p [i-2]和p [i + 1]两侧的控制点在点p [i-1]和p [i]之间进行插值. u是从0到1的插值因子. τ定义为样条上的张力,将影响花键表面与控制点的紧密程度.
| 0 1 0 0 | | p[i?2] | |?? 0 ? 0 | | p[i?1] | p(u) = 1 u u2 u3 | 2? ??3 3?2? ?? | | p[i] | |?? 2?? ??2 ? | | p[i+1] |
注意:如何在Stackoverflow的gui中展示它并不是很明显,但u2和u3分别代表u平方和u立方.