点と線の距離を計算するコードを書いてみました。インターネットでたくさんの計算を見つけましたが、正しく理解しているかどうかわかりません。線の方程式をいくつか見つけましたが、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