0

点と線の距離を計算するコードを書いてみました。インターネットでたくさんの計算を見つけましたが、正しく理解しているかどうかわかりません。線の方程式をいくつか見つけましたが、3D で点と平面の距離を計算するための方程式のようです。同じだと思いますが、2次元です。

3D 点平面距離計算の経験があります。3 つのポイント vec3 (平面定義)からパラメーターA、B、C、Dを計算し、距離を取得するには、この方程式をvec3 point (x,y,z) に適用するだけです。

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

直線の式は次のとおりです: Ax + By = C

直線方程式は、vec2 point (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

あなたの質問からは明確ではありませんが、2 つの点で定義された線があり、その線と 3 番目の点の間の距離を見つけたいと思われますか? 見てきたように、たった 2 点から A、B、C、D を一意に決定することはできません。その線を含む平面は無数にあります。

x_1 と x_2 が線を定義する点を表す 3 次元ベクトルで、x_0 が距離を求めようとしている点である場合、式は次のようになります。

d   =   (|(x_2-x_1)x(x_1-x_0)|)/(|x_2-x_1|)

(この式で、「x」は 3 次元外積を表し、「-」はベクトル減算を表し、|v| はベクトル v の長さを表します。)

点線距離 -- 3 次元

于 2013-11-09T17:06:15.927 に答える