如何在另一条线上反射一条线

A P*_*ikh 5 reflection algorithm math algebra linear-algebra

对于我正在开发的碰撞算法,我需要找出如何将一条线反射到另一条线上.

第1行:

y=ax+b 
Run Code Online (Sandbox Code Playgroud)

第2行:

y=cx+d 
Run Code Online (Sandbox Code Playgroud)

第3行:

(a result of reflecting line 1 over line 2) y=ex+f
Run Code Online (Sandbox Code Playgroud)

有没有什么代数方法来确定e,并f来讲a,b,c,和d

Bra*_*eel 13

我以前遇到过这个完全相同的问题.跟我在一起......

这个问题涉及两个部分:

1.找到它们相交的点

为了找到两条线相交的位置,我们使用两条线的方程:

y = M1x + B1
y = M2x + B2
Run Code Online (Sandbox Code Playgroud)

使用替换:

M1x + B1 = M2x + B2
M1x - M2x = B2 - B1
x(M1 - M2) = B2 - B1
x = (B2 - B1) / (M1 - M2)
Run Code Online (Sandbox Code Playgroud)

要找到y值,只需将其插入:

y = M1x + B1
Run Code Online (Sandbox Code Playgroud)

2.找到其他两个斜坡的斜率.

第二个是更棘手的.使用三角法,这不是不可能的.

设L1为"基线".(斜率为M1)

设L2是要在"基线"上反射的线.(斜率为M2)

设L3为我们的结果线.(斜率为M3)

我使用的等式如下:

double M3 = ((2 * M1) + (M2 * pow(M1, 2)) - M2) / (2 * M1 * M2 - pow(M1, 2) + 1);
Run Code Online (Sandbox Code Playgroud)

直接从我的C代码.重要的是要注意两个斜坡都应该被定义.当其中一个斜坡接近无穷大时,您可以使用L'Hopital的规则得到方程.

随着解释!

线图

这是三行的粗略图.L2在L1上反射,产生L3.绘图并不准确.L1和L2之间的角度以及L2和L3标记为R. \以下是事实:

M1 = tan(A1) 
M2 = tan(A2) 
M3 = tan(A3) 
Run Code Online (Sandbox Code Playgroud)

这来自切线的定义.

A3 = R + A1
Run Code Online (Sandbox Code Playgroud)

这看起来有点棘手,但是如果你在交叉点画一条水平线就很明显了.

因此,我们的目标是找到棕褐色(A3).为了实现这一点,我们需要找到R.正如我们所看到的,R可以在一个带有A2的三角形和另一个角度的A1的补充中找到.因此,我们知道:

R + (180 - A1) + A2 = 180
R - A1 + A2 = 0
R = A1 - A2
Run Code Online (Sandbox Code Playgroud)

让我们看看双方的切线:

tan(R) = tan(A1 - A2)
Run Code Online (Sandbox Code Playgroud)

从三角学,我们知道:

tan(R) =  (tan(A1) - tan(A2)) / (1 + tan(A1)tan(A2))
R = arctan((tan(A1) - tan(A2) / (1 + tan(A1)tan(A2))
Run Code Online (Sandbox Code Playgroud)

Arctan反正切.根据我们之前的公式,A3 = R + A1,我们得到:

A3 = arctan((tan(A1) - tan(A2) / (1 + tan(A1)tan(A2)) + A1
A3 = arctan((M1 - M2) / (1 + M1*M2)) + A1
Run Code Online (Sandbox Code Playgroud)

但我们不想要A3.我们想晒黑(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))
Run Code Online (Sandbox Code Playgroud)

不幸的是,那令人作呕的令人作呕.用斜面替换切线并简化,我们得到

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

这与上面的公式完全相同.抱歉所有丑陋的数学.当M2完全垂直时,您可以使用L'Hopital的规则来获取

M3 = (M1^2 - 1) / 2*M1
Run Code Online (Sandbox Code Playgroud)

如果有人如此倾向,请检查我的数学.但我现在很累.