2

我有三个 3D 点,如p1(x1,y1,z1), p2(x2,y2,z2), p3(x3,y3,z3)。我还有一点,但我只知道那个点的值,比如x,其中是我喜欢计算的值。yp4(x4,y4,Z)Z

通过使用 delaunay 三角测量方法检查,我确信p4(x4,y4)点位于由p1(x1,y1),形成的三角形内。如何计算点的价值?我喜欢在 C 编程中实现它。实际上我正在尝试在 MATLAB 中实现。p2(x2,y2)p3(x3,y3)Zp4griddata

谢谢

4

4 回答 4

7

p1, p2,p3定义一个平面。你可以用一个点和一个法线来表示它。例如,P=p1N=(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

没有要解决的线性系统,您只需要一个叉积。

于 2013-09-12T06:35:36.300 回答
5

您可以在 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)
于 2013-09-12T04:28:11.890 回答
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就会相当惊人地扩大可执行文件的大小。对于eigen这个简单的 2x2 系统来说,能够做到的是完全矫枉过正。

所以我不会求助于eigen,除非你有很多其他线性代数的事情要做。这是一个简单的 2x2 系统,很容易手动求解。

亲吻;见 DanielKO 的回答 :)

于 2013-09-12T06:52:13.767 回答
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++ 中解决它,您可以实现 Gauss 算法(另请参阅 Numerical Recipes 书,可在线获得),或使用线性代数库,例如Eigen或其他。

备注:无论该点是否(x4, y4)在三角形内(x1, y1), (x2, y2), (x3, y3),方法都是相同的。

于 2013-09-12T05:43:20.467 回答