想象一下笛卡尔空间中三角形的表面。我怎样才能找到三角形表面上给定点的距离?查找三维空间中三角形的点距离
点1:[30,24,22]
点2:[35,13,19]
点3:[21,29,85]
在这种情况下,有多远距上面定义的三角形表面的点[40,25,77]?
或者特别是 - 公式是什么来确定这个距离?
想象一下笛卡尔空间中三角形的表面。我怎样才能找到三角形表面上给定点的距离?查找三维空间中三角形的点距离
点1:[30,24,22]
点2:[35,13,19]
点3:[21,29,85]
在这种情况下,有多远距上面定义的三角形表面的点[40,25,77]?
或者特别是 - 公式是什么来确定这个距离?
我会假设你的意思最小距离。否则,距离会根据您选择的三角形上的哪个点而变化。要看到这一点,只需在桌子上画一个三角形,并在上面画一支笔。
简短的回答是,找到的最小距离,你需要建立一个矩阵,每列一个点,就像这样:
[ 30 35 21 ]
A = [ 24 13 29 ]
[ 22 19 85 ]
而对于细节读about projections。如果你研究过这种东西已经有一段时间了,不要被吓倒。这不是火箭科学(实际上,也许是火箭科学的入门),但需要一些投资才能理解。为了帮助你,我会首先提及一些理论,然后讨论实施。
给你一些直觉,坚持那支笔。
让我们从最简单的情况开始:为了获得最小的距离,请将笔垂直于桌子,笔的末端放在三角形的某处。将您的观点描绘为笔尖。你只是证明了三角形中最接近你点的三角形中的点是投影到三角形中三点所定义的空间上的点。换句话说,笔的另一端。三角形中的任何其他点必须具有比笔长更长的距离。
现在我们来看看一个复杂化。假设你想要的点不是完全位于三角形的“上方”,而是位于某处。说,完全离开桌子的表面。在这种情况下,距离该点最近的三角形中的点将是其自身的三个点中的一个,或者是连接三个初始点的三条线段上的一个点。
现在的实施:瘦身是,如果你可以使用一个简单的图书馆的线性代数,你会为自己节省很多的悲伤。最难的步骤是反转矩阵,而反转3x3矩阵通常很容易,当点是共线时(即考虑三点对齐),当幅度非常不同时,它会变得复杂(即,想象一个非常长的三角形)等等。
你可以针对这个问题编写一个特定于问题的算法,因为它只有3x3,但是在一天结束时你需要解算投影系统,所以你的算法会做基本相同的数学运算在维基百科页面上。所以你最终可能会重新发现线性代数,这是浪费大量时间的一种可靠方法。
我最近的实施建议是检查游戏或3D库中的关键字“投影”。如果幸运的话,你可以打电话给你。否则,得到一些体面的CLR线性代数库,建立矩阵,并有效地完成整个计算,并在100行代码左右。
非常感谢所有这些伟大的信息狮子座。就在我阅读本文之前,我发现了以下matlab函数:http://www.mathworks.com/matlabcentral/fileexchange/22857-distance-between-a-point-and-a-triangle-in-3d似乎完全正确我想要的是。现在我只需要将该代码“移植”到c#。嗯 - 听起来很有趣! :) – eejai42 2013-05-06 03:54:16
不客气!如果您使用底层库,请在此处更新。 – Leo 2013-06-03 02:58:49
嗨eejai42,感谢您的链接到filexchange。你会如此友善地分享你所做的C#代码吗? – Nic 2016-06-21 15:42:40
这一切都取决于你想要的距离来自哪里(三角形的哪个部分?)。如果你知道三角形的点从(中心也许?)开始,然后,从数学的角度来看,其公式为:
Point 1: [a1,b1,c1] (point on triangle)
Point 2: [a2,b2,c2] (point to find distance to)
distance vector = [a2-a1, b2-b1, c2-c1]
distance = the magnitude of above = sqrt((a2-a1)^2 + (b2-b1)^2 + (c2-c1)^2))
我不知道C#,但是这将是它的伪代码(它背后的数学)
编辑:要查找三角形的中心......
Point 1: [x1, y1, z1]
Point 2: [x2, y2, z2]
Point 3: [x3, y3, z3]
Centre = [(x1+x2+x3)/3, (y1+y2+y3)/3, (z1+z2+z3)/3]
http://math.stackexchange.com/? – spender 2013-05-06 01:53:41