如何在另一条直线上对称一条直线

6
为了我正在开发的碰撞算法,我需要找出如何在另一条线上反射一条线。 线1:
y=ax+b 

抱歉,我不能接受翻译任务,因为我只能以英语进行交流。
y=cx+d 

第三行:

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

在代数上是否存在一种方法,能够通过 abcd 来确定 ef 的值?


请记住,如果您按照这种方法进行操作,可能会遇到y =无穷大(垂直于y = 0),因此在需要时切换x = ay + b和y = ax + b,以避免出现问题 :) - CME64
这一直困扰着我,很抱歉。上面的内容是误导性的。你不能简单地交换a和b的值。x = (y-b) / a。此外,99%的垂直斜率问题可以通过将斜率保存为包含分子和分母的结构来解决。因此,你可以知道如果分母为0,则该线是垂直的。 - BrainSteel
3个回答

15

我之前遇到过这个完全相同的问题。请跟随我的思路...

这个问题涉及两个部分:

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

这个有点棘手,但如果在交点处画一条水平线,就会变得很明显。

因此,我们的目标是找到 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完全垂直时,您可以使用L'Hopital法则来计算。

M3 = (M1^2 - 1) / 2*M1

如果有人有兴趣的话,请检查我的数学。但是现在我有点累了。


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  

因此,我们可以在第二条线上获取两个任意点,应用此变换,并计算新的线方程


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 -----> 第一个方程。
然后点和其图像的中点位于中心线上,即
中点的Y坐标 - (中点的x坐标 * c + d) = 0
中点的y坐标=(a * n + e * pt)/ 2,x坐标=(pt + n)/ 2
把它放在上面,我们得到...
(a * n + e * pt) c - c (pt + n) - 2d = 0 -> 第二个方程式
现在,点和它的影像从交汇点处成等角...一种简单的方法是说镜面线、点线和影像线之间的角度相等...因此...mI和mM线之间的正切值等于mM和mP之间的正切值。
所以我们得到:
(mM + mP)/(1 + mp*mM)=(mI-mM)/(1 + mI*mM)
其中,mM=c,mI=e,mP=a ->第三个方程式
把它们放在各自的位置,你就有了三个未知数pt,e和f,解决...用x代替n,然后你就有了e,f关于a、b、c、d的表达式。
自己解决吧...
但如果它们是平行的,那就简单了,你有两个未知数的两个方程式,可以使用中点法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接