点线距离计算

eSe*_*rus 0 c++ math 3d 2d

我试着编写用于计算点线距离的代码.我在互联网上发现了很多计算但我不确定我是否理解正确.我找到了一些线的方程,它看起来像是用于计算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);
}
Run Code Online (Sandbox Code Playgroud)

飞机有2分:

Line(vec2 p0, vec2 p1) {

    //...

    //Result A,B,C
    A = (?);
    B = (?);
    C = (?);
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

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);
}
Run Code Online (Sandbox Code Playgroud)

差异在于vec2的交叉积.它有点像这样:

vec2 cross(vec2 p) { //Only one parameter
    return vec2(y, -x);
}
Run Code Online (Sandbox Code Playgroud)

数学:

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 + + + c = 0,因为我需要知道它是在线的左侧还是右侧(负距离的正方向)并且它更适合编程.谢谢你的回答.

仍然抱歉我的英语.:d

Jim*_*wis 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|)
Run Code Online (Sandbox Code Playgroud)

(在该公式中,'x'表示3-d交叉乘积,' - '表示向量减法,| v |表示向量v的长度.)

点线距离 - 三维