algorithm - 如何将一条线反射到另一条线上

标签 algorithm math reflection linear-algebra algebra

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

第 1 行:

y=ax+b 

第 2 行:

y=cx+d 

第 3 行:

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

是否有代数方法根据ab确定ef >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 规则得出方程。

继续解释!

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。正如我们所见,可以在 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/

相关文章:

swift - 在这些条件下如何计算两个圆的第三组坐标的交点?

c# - 将具有派生类型的泛型转换为具有父类型的泛型

Java反射子类

string - 名称的近似字符串匹配算法

c++ - 关于multi-probe Local Sensitive Hashing的问题

javascript - Javascript 中的太阳弧路径

scala - 如何在 Lift 中调用来自不同包的代码段?

algorithm - 网络中的流分解定理

algorithm - 如果 IP 在范围列表中,则过滤它们

c# - 是否有已知的算法来查找 N 个元素中哪 K 个元素的总和最接近整数?