对于我正在开发的碰撞算法,我需要找出如何将一条线反射到另一条线上。
第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
?< / p>
答案 0 :(得分:12)
之前我遇到了同样的问题。跟我在一起......
这个问题涉及两个部分:
找到两条线相交的位置,我们使用两条线的方程式:
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
第二个更棘手。使用三角法,这不是不可能的。
让L1成为“基线”。 (斜率为M1)
设L2为要在“基线”上反射的线。 (斜率为M2)
让L3成为我们的结果线。 (斜率为M3)
我使用的等式如下:
double M3 = ((2 * M1) + (M2 * pow(M1, 2)) - M2) / (2 * M1 * M2 - pow(M1, 2) + 1);
直接从我的C代码。 重要的是要注意两个斜坡都应该被定义。当其中一个斜坡接近无穷大时,您可以使用L'Hopital的规则得到方程。
随着解释!
这是三行的粗略图。 L2在L1上反射,产生L3。绘图并不准确。 L1和L2之间的角度以及L2和L3标记为R. 以下是事实:
M1 = tan(A1)
M2 = tan(A2)
M3 = tan(A3)
这来自切线的定义。
A3 = R + A1
这看起来有点棘手,但如果你在交叉点画一条水平线就显而易见了。
因此,我们的目标是找到棕褐色(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。我们想晒黑(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完全垂直时,您可以使用L'Hopital的规则来获取
M3 = (M1^2 - 1) / 2*M1
如果有人如此倾向,请检查我的数学。但我现在很累。
答案 1 :(得分:0)
第1步:
首先找到线y = ax + b与线y = cx + d的交点,即通过求解得出来
m =(d - b)/(c - a)
第2步:
最后一行有形式的点(x,ex + f),所以我们知道的是连接点的线,相应的图像垂直于镜像线和第一个点的中点及其图像躺在镜子线上。解决第一个要求......
(线连接点的斜率及其图像)*(镜像线的斜率)= -1
我们得到......
c *(e * pt + f - a * n - b)/(pt - n)= -1 -----&gt;第一个等式。
然后该点的中点及其图像位于中心线上,即
中点的Y坐标 - (c * x中点坐标+ d)= 0
中点的y坐标=(a * n + e * pt)/ 2和x坐标=(pt + n)/ 2
把它放在上面我们得到......
(a * n + e * pt) c - c (pt + n) - 2d = 0 ----&gt;第二个等式
3
现在这个点和它的图像从交叉点做出相等的角度......一个简单的方法就是说镜像线,点线和图像线之间的角度,点线是相等的...因此...切线线mI和mM之间的角度等于mM和mP的角度
等同于我们
(mM + mP)/(1 + mp * mM)=(mI-mM)/(1 + mI * mM)
其中mM = c,mI = e,并且mP = a -----&gt;第三个等式
把它放在各自的
中你得到三个未知数的三个方程,pt,e和f并求解......只需x代替n,你就得到a,f,a,b,c,d。
解决你自己......
然而,如果它们是平行的,那么在两个变量中有两个方程使用中点方法
答案 2 :(得分:0)
又一种方法:
相对于线y = ax + b的反射的仿射变换矩阵(适用于非垂直线!)。 设pa = 1 + a ^ 2,ma = 1-a ^ 2,然后矩阵(来自Nikulin的计算机几何书)
ma/pa 2a/pa 0
2a/pa -ma/pa 0
-2ab/pa 2b/pa 1
因此我们可以在第二行得到两个任意点,应用此变换,并计算新的线方程