6

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

第 1 行:

y=ax+b 

第 2 行:

y=cx+d 

第 3 行:

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

是否有任何代数方法来确定efab和?cd

4

3 回答 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 规则获得方程。

继续解释!

线图

这是三线的粗略图。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

如果有人这么倾向于,请检查我的数学。但我现在很累。

于 2013-06-30T23:51:04.473 回答
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  

所以我们可以在第二行得到两个任意点,应用这个变换,计算新的线方程

于 2013-07-01T06:12:29.300 回答
0
  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 而言。

自己解决....

但是,如果它们是平行的,则很简单,两个变量中有两个方程,请使用中点法

于 2013-07-01T00:46:55.290 回答