对于我正在开发的碰撞算法,我需要找出如何将一条线反射到另一条线上。
第 1 行:
y=ax+b
第 2 行:
y=cx+d
第 3 行:
(a result of reflecting line 1 over line 2) y=ex+f
是否有代数方法根据a
、b
、确定
和 e
和f
>cd
?
最佳答案
我以前遇到过这个完全相同的问题。留在我这里...
这个问题涉及两部分:
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);
直接来 self 的 C 代码。 重要的是要注意应该定义两个斜率。当其中一个斜率接近无穷大时,您可以使用 L'Hopital 规则得出方程。
继续解释!
这是三行的粗略图。 L2 在 L1 上反射,产生 L3。画的不准确。 L1 和 L2 以及 L2 和 L3 之间的角度标记为 R。\ 以下是事实:
M1 = tan(A1)
M2 = tan(A2)
M3 = tan(A3)
这来自切线的定义。
A3 = R + A1
这看起来有点棘手,但如果您在交叉点画一条水平线,它就会变得很明显。
因此,我们的目标是找到 tan(A3)。为此,我们需要找到 R。正如我们所见,可以在 A2 和 A1 的补角作为其他角的三角形中找到 R。因此,我们知道:
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))
反正切。从我们之前的公式 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
如果有人愿意,请检查我的数学。但我现在很累。
关于algorithm - 如何将一条线反射到另一条线上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17395860/