0

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

我有一些 3D 点平面距离计算的经验。我从3 个点 vec3 (平面定义)计算参数A,B,C,D并获得距离,只需将这个方程与vec3 point (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| 是向量 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

4

1 回答 1

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 的长度。)

点线距离--3维

于 2013-11-09T17:06:15.927 回答