对于我正在开发的碰撞算法,我需要找出如何将一条线反射到另一条线上。
第 1 行:
y=ax+b
第 2 行:
y=cx+d
第 3 行:
(a result of reflecting line 1 over line 2) y=ex+f
是否有任何代数方法来确定e
和f
,a
,b
和?c
d
对于我正在开发的碰撞算法,我需要找出如何将一条线反射到另一条线上。
第 1 行:
y=ax+b
第 2 行:
y=cx+d
第 3 行:
(a result of reflecting line 1 over line 2) y=ex+f
是否有任何代数方法来确定e
和f
,a
,b
和?c
d
我以前也遇到过同样的问题。留在我这里...
这个问题涉及两个部分:
要找到两条线相交的位置,我们使用两条线的两个方程:
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
第二个要棘手得多。使用三角函数,这并非不可能。
让 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 规则获得方程。
继续解释!
这是三线的粗略图。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))
反正切是反正切。根据我们之前的公式,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
如果有人这么倾向于,请检查我的数学。但我现在很累。
还有一种方法:
相对于线 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
所以我们可以在第二行得到两个任意点,应用这个变换,计算新的线方程
步骤1:
首先找到线 y = ax + b 与线 y = cx + d 的交点,即通过求解得出
m = (d - b) / (c - a)
第2步:
最后一条线有 (x , ex + f) 形式的点,所以我们知道 wjat 是连接点的线,对应的图像垂直于镜像线,并且第一个点的中点及其图像位于镜线。解决第一个要求....
(线连接点及其图像的斜率)*(镜像线的斜率)= -1
我们得到...
c * (e*pt + f - a*n - b)/( pt - n ) = -1 -----> 第一个方程。
则该点的中点及其像在中心线上,即
中点 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 ----> 第二个等式
3.
现在这个点和它的图像从交点形成相等的角度......一个简单的说法是镜像线,点线和图像线之间的角度,点线相等......因此......角度的切线线 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 而言。
自己解决....
但是,如果它们是平行的,则很简单,两个变量中有两个方程,请使用中点法