我有三个3D点,如 p1(x1,y1,z1)
, p2(x2,y2,z2)
, p3(x3,y3,z3)
. 我还有另外一点,但我只知道 x
, y
这一点的值,如 p4(x4,y4,Z)
,其中 Z
是我想要计算的值 .
我确信 p4(x4,y4)
点是在 p1(x1,y1)
, p2(x2,y2)
, p3(x3,y3)
形成的三角形内部,通过delaunay三角测量方法检查 . 如何计算点 p4
的 Z
值?我喜欢在C编程中实现它 . 实际上我正在尝试在MATLAB中实现 griddata
.
谢谢
4 回答
p1
,p2
,p3
定义一架飞机 . 您可以通过点和法线来表示它 . 例如,P=p1
,N=(p2-P) x (p3-P)
(即,N =p1p2
和p1p3
的叉积) .现在让p4在同一平面上,它满足平面方程:
重新排列:
没有线性系统要解决,你只需要一个交叉产品 .
您可以在P1P2P3向量的基础上表达P4坐标 .
这是易于求解的线性方程组 . 你必须找到A和B系数,然后用它们来计算z坐标
这里的数学问题是解决以下方程组
或者等价的
对于a,b和z4 .
要在C / C中解决它,你可以实现高斯算法(参见数字食谱书,它可在线获得),或使用线性代数库,如Eigen或其他 .
备注:无论点
(x4, y4)
是否位于三角形(x1, y1), (x2, y2), (x3, y3)
内,方法都是相同的 .这是为了支持MBo和Konstantin的答案 . 请不要接受这个问题,而是接受其中一个问题 .
这是您在MATLAB中实现解决方案的方法:
现在,在C中,仅包括相关的
eigen
库的事实相当惊人地破坏了可执行文件的大小 .eigen
能够对这个简单的2x2系统完全矫枉过正 .所以除非你有大量的其他线性代数要做,否则我不会去求助于
eigen
. 它是一个简单的2x2系统,很容易手动解决 .只是KISS它;看DanielKO的回答:)