我试图编写用于计算点线距离的代码。我在互联网上发现了很多计算结果,但不确定我是否理解正确。我找到了一些线的方程式,似乎是在3D模式下计算点平面距离的方程式。我认为是相同的,但在二维中。

我有一些3D点平面距离计算的经验。我从3个点vec3(平面定义)计算了参数A,B,C,D,并且要获取距离,只需将此方程与vec3点(x,y,z)一起应用即可。

平面方程:Ax + By + Cz = D

线方程应为:Ax + By = C

线方程应通过应用带有vec2点(x,y)的方程来类似地工作。

我的问题是如何用2点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的长度

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

最佳答案

从您的问题尚不清楚,但是听起来您有一条由两个点定义的线,并且您想查找该线与第三个点之间的距离?如您所见,无法仅从两个点唯一地确定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的长度。)

Point-Line Distance--3-dimensional

10-08 08:24
查看更多