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

时间:2013-06-30 23:42:45

标签: algorithm math reflection linear algebra

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

第1行:

y=ax+b 

第2行:

y=cx+d 

第3行:

(a result of reflecting line 1 over line 2) y=ex+f

是否有任何代数方法可以根据efab确定cd?< / p>

3 个答案:

答案 0 :(得分:12)

之前我遇到了同样的问题。跟我在一起......

这个问题涉及两个部分:

1。找到它们相交的点

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

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代码。 重要的是要注意两个斜坡都应该被定义。当其中一个斜坡接近无穷大时,您可以使用L'Hopital的规则得到方程。

随着解释!

Line Diagram

这是三行的粗略图。 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. 假设两条线彼此不平行
  2. 第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  

因此我们可以在第二行得到两个任意点,应用此变换,并计算新的线方程