我之前遇到过这个完全相同的问题。请跟随我的思路...
这个问题涉及两个部分:
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](https://istack.dev59.com/JhE6U.webp)
这是三条线的粗略图形。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
如果有人有兴趣的话,请检查我的数学。但是现在我有点累了。