我尝试编写用于计算点线距离的代码。我在互联网上发现了很多计算但我不确定我是否理解正确。我找到了一些线的方程,它看起来像是用于计算3D中的点平面距离的方程。我认为它是相同的但是在二维中。
我对3D点平面距离计算有一些经验。我从 3点vec3 (平面定义)计算参数 A,B,C,D 并获得距离只需将该等式应用于 vec3 点的(X,Y,Z)
平面方程: Ax + By + Cz = D
线方程应为: Ax + By = C
通过应用 vec2 点(x,y)的等式,线方程应该相似。
我的问题如何使用 2 points vec2 (线路定义)从此等式计算参数 A,B,C ?
任何简单的编程/数学解释?
平面有3分:
Plane(vec3 p0, vec3 p1, vec3 p2) {
vec3 v = p1 - p0;
vec3 u = p2 - p0;
vec3 n = cross(v, u);
normalize(n);
//Result A,B,C,D
A = n.x;
B = n.y;
C = n.z;
D = dot(vec3(-n.x, -n.y, -n.z), p0);
}
飞机有2分:
Line(vec2 p0, vec2 p1) {
//...
//Result A,B,C
A = (?);
B = (?);
C = (?);
}
感谢。
PS:抱歉我的英文。 :/
更新
解决!
我在计算一小时后找到答案,它与平面方程式相似。
编程:
Line(vec2 p0, vec2 p1) {
vec2 l = p1 - p0;
vec2 n = l.cross();
n.normalize();
//Result a,b,c
a = n.x;
b = n.y;
c = vec2::dot(vec2(-n.x, -n.y), p0);
}
差异在于vec2的交叉产物。它有点像这样:
vec2 cross(vec2 p) { //Only one parameter
return vec2(y, -x);
}
数学:
P1 - 行的起点
P2 - 行的终点
1) N = x(P2 - P1)
其中“x”是向量的交叉乘积(交换元素和否定元素x)---> x(V)= [Vy,-Vx]
(我不确定这个操作是否正式,但结果应该是与该参数垂直的向量)
2) N = N / | N | (规范化向量N)
其中| N |是向量N的长度
3)结果A: a = Nx
4)结果B: b = Ny
5) N'= -N
6)结果C: c =(N')。(P1)
其中“(N')。(P1)”是向量N'和P1的点积
PS:
此公式 d =(|(x_2-x_1)x(x_1-x_0)|)/(| x_2-x_1 |)是正确的。有用。但是我需要使用等式 ax + by + c = 0 因为我需要知道它是在线的左侧还是右侧(负距离的正值)并且它更适合编程。谢谢你的回答。
仍然抱歉我的英语。 :d
答案 0 :(得分:6)
从您的问题中不清楚,但听起来您有一条由两点定义的线,并且您想要找到该线与第三点之间的距离?正如您所见,您无法从两个点唯一地确定A,B,C和D - 存在无限数量的包含该线的平面。
如果x_1和x_2是表示定义线的点的3-d向量,则x_0是该点 你试图找到距离,公式是:
d = (|(x_2-x_1)x(x_1-x_0)|)/(|x_2-x_1|)
(在这个公式中,'x'表示3-d交叉乘积,' - '表示向量减法,| v |表示向量v的长度。)