我有三个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三角测量法检查形成的三角形内。如何计算点Z
的{{1}}值?我喜欢在C编程中实现它。实际上我正在尝试在MATLAB中实现p4
。
由于
答案 0 :(得分:6)
p1
,p2
,p3
定义了一架飞机。您可以通过点和法线来表示它。例如,P=p1
,N=(p2-P) x (p3-P)
(即N = p1p2
和p1p3
的叉积。)
现在p4处于同一平面,它满足平面方程:
(p4-P) · N = 0 %// dot product
⇒ (x4-x1)*N.x + (y4-y1)*N.y + (z4-z1)*N.z = 0
重新排列:
z4 = z1 - ((x4-x1)*N.x + (y4-y1)*N.y)/ N.z
没有线性系统可以解决,你只需要一个交叉产品。
答案 1 :(得分:4)
您可以在P1P2P3载体的基础上表达P4坐标。
x4 = x1 + A * (x2 - x1) + B * (x3 - x1)
y4 = y1 + A * (y2 - y1) + B * (y3 - y1)
这是易于求解的线性方程组。你必须找到A和B系数,然后用它们来计算z坐标
z4 = z1 + A * (z2 - z1) + B * (z3 - z1)
答案 2 :(得分:1)
这是为了支持MBo和Konstantin的答案。请不要接受这个问题,而是接受其中一个问题。
这是在MATLAB中实现解决方案的方法:
%// Your known 3 points
p1 = [ 1 10 0]';
p2 = [-1 10 10]';
p3 = [ 0 0 10]';
%// your 4th target point
p4 = [0 5 NaN]';
%// Difference matrix/vector
A = [p2-p1 p3-p1];
b = p4-p1;
%// Compute solution
p4(end) = p1(end) + A(3,:)*(A(1:2,:)\b(1:2));
现在,在C ++中,仅包含相关eigen
库的事实相当惊人地破坏了可执行文件的大小。对于这个简单的2x2系统,eigen
能够完成的任何过度杀伤。
所以我不会诉诸eigen
,除非你有大量的其他线性代数事情要做。它是一个简单的2x2系统,很容易手动解决。
只是KISS它;见DanielKO的回答:)
答案 3 :(得分:0)
这里的数学问题是解决以下方程组
p1 + a * (p2 - p1) + b * (p3 - p1) = (x4, y4, z4)
或等效
(x1,y1,z1) + a * (x2-x1, y2-y1, z2-z1) + b * (x3-x1, y3-y1, z3-z1) = (x4, y4, z4)
表示a,b和z4。
要在C / C ++中解决它,您可以实现高斯算法(另请参阅“数字食谱”一书,可在线获取),或使用线性代数库,例如Eigen或其他。< / p>
备注:无论点(x4, y4)
是否位于三角形(x1, y1), (x2, y2), (x3, y3)
内,方法都是相同的。