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
我以前遇到过这个完全相同的问题.跟我在一起......
这个问题涉及两个部分:
为了找到两条线相交的位置,我们使用两条线的方程:
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)
第二个是更棘手的.使用三角法,这不是不可能的.
设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)
如果有人如此倾向,请检查我的数学.但我现在很累.