私が開発している衝突アルゴリズムでは、線を別の線に反映させる方法を見つける必要があります。
ライン1:
y=ax+b
2行目:
y=cx+d
3 行目:
(a result of reflecting line 1 over line 2) y=ex+f
、、、およびに関してe
およびを決定する代数的な方法はありますか?f
a
b
c
d
私が開発している衝突アルゴリズムでは、線を別の線に反映させる方法を見つける必要があります。
ライン1:
y=ax+b
2行目:
y=cx+d
3 行目:
(a result of reflecting line 1 over line 2) y=ex+f
、、、およびに関してe
およびを決定する代数的な方法はありますか?f
a
b
c
d
私は以前にこのまったく同じ問題に遭遇しました。ここで私と一緒にいてください...
この問題には、次の 2 つの部分が含まれます。
2 つの線が交差する場所を見つけるには、線の 2 つの方程式を使用します。
y = M1x + B1
y = M2x + B2
置換の使用:
M1x + B1 = M2x + B2
M1x - M2x = B2 - B1
x(M1 - M2) = B2 - B1
x = (B2 - B1) / (M1 - M2)
y 値を見つけるには、次のように接続します。
y = M1x + B1
2番目ははるかにトリッキーです。三角法を使用すると、不可能ではありません。
L1 を「ベースライン」とします。(M1の傾きで)
L2 を「ベース ライン」上に反映されるラインとします。(M2の傾きで)
L3 を結果の行とします。(M3の傾きで)
私が使用した式は次のとおりです。
double M3 = ((2 * M1) + (M2 * pow(M1, 2)) - M2) / (2 * M1 * M2 - pow(M1, 2) + 1);
私のCコードから直接。両方の勾配を定義する必要があることに注意することが重要です。ロピタルの法則を使用して、勾配の 1 つが無限大に近づいているときに方程式を得ることができます。
説明を続けてください!
これは、3 つの線の大まかな図です。L2 は L1 に反映され、L3 になります。図面は正確ではありません。L1 と L2、および L2 と L3 の間の角度は、R としてラベル付けされています。\ ここに事実があります。
M1 = tan(A1)
M2 = tan(A2)
M3 = tan(A3)
これは接線の定義から来ています。
A3 = R + A1
これは少し見にくいですが、交点に水平線を引くと一目瞭然です。
したがって、目標は tan(A3) を見つけることです。これを達成するには、R を見つける必要があります。ご覧のとおり、R は A2 と A1 の補角を他の角とする三角形の中にあります。したがって、次のことがわかります。
R + (180 - A1) + A2 = 180
R - A1 + A2 = 0
R = A1 - A2
両側の接線を取りましょう:
tan(R) = tan(A1 - A2)
三角法から、次のことがわかります。
tan(R) = (tan(A1) - tan(A2)) / (1 + tan(A1)tan(A2))
R = arctan((tan(A1) - tan(A2) / (1 + tan(A1)tan(A2))
Arctan は逆正接です。前の式、A3 = R + A1 から、次のようになります。
A3 = arctan((tan(A1) - tan(A2) / (1 + tan(A1)tan(A2)) + A1
A3 = arctan((M1 - M2) / (1 + M1*M2)) + A1
しかし、A3 は必要ありません。tan(A3)が欲しいです。繰り返しますが、両側の接線を取ります。
tan(A3) = M3 = tan(arctan((M1 - M2) / (1 + M1*M2)) + A1)
M3 = tan(arctan((M1 - M2) / (1 + M1*M2))) + tan(A1) / (1 - tan(arctan((M1 - M2) / (1 + M1*M2))) * tan(A1))
残念ながら、それはひどく恐ろしいことです。接線を勾配に置き換えて単純化すると、次のようになります。
M3 = ((M1 - M2) / (1 + M1*M2)) + M1 / (1 - ((M1 - M2)/(1 + M1*M2)) * M1)
M3 = (M1 - M2 + M1*(1 + M1*M2)) / (1 + M1*M2 - M1*M1 + M1*M2)
M3 = (M1^2 * M2 + 2*M1 - M2) / (1 + 2*M1*M2 - M1^2)
これは、上記の式とまったく同じです。すべての醜い数学で申し訳ありません。M2 が完全に垂直の場合、ロピタルの法則を使用して
M3 = (M1^2 - 1) / 2*M1
誰かがそう思っているなら、私の数学をチェックしてください。でもそろそろ疲れてきました。
さらに別の方法:
線 y=ax+b に対する反射のアフィン変換の行列 (非垂直線で機能します!)。pa = 1+a^2、ma = 1-a^2 とすると、行列は (Nikulin の Computer Geometry の本から)
ma/pa 2a/pa 0
2a/pa -ma/pa 0
-2ab/pa 2b/pa 1
したがって、2 番目の線で 2 つの任意の点を取得し、この変換を適用して、新しい線の方程式を計算できます。