Algorithm 快速计算两点描述直线上点的反射
问题如下:Algorithm 快速计算两点描述直线上点的反射,algorithm,floating-point,geometry,formula,Algorithm,Floating Point,Geometry,Formula,问题如下: 给定两个不同的点P1=(x1,y1),P2=(x2,y2)和点G=(a,b),找到c和d,使得G'=(c,d)是G关于线P1P2的反射 我正在寻找的是一种快速执行此操作的方法。由于我在研究浮点数,我还想使用一种方法,在科学记数法中最小化指数的绝对值,但这是第二优先级 我尝试过的是:让R是向量,它是向量(G-P1)到向量(P2-P1)的投影。然后,通过取Q=P1+R,这是G在直线上的投影,然后取G'=2Q-G来实现反射。现在这一切都很酷,但计算投影是这里的难点 如何计算向量A到B的投影
给定两个不同的点P1=(x1,y1),P2=(x2,y2)和点G=(a,b),找到c和d,使得G'=(c,d)是G关于线P1P2的反射 我正在寻找的是一种快速执行此操作的方法。由于我在研究浮点数,我还想使用一种方法,在科学记数法中最小化指数的绝对值,但这是第二优先级 我尝试过的是:让R是向量,它是向量(G-P1)到向量(P2-P1)的投影。然后,通过取Q=P1+R,这是G在直线上的投影,然后取G'=2Q-G来实现反射。现在这一切都很酷,但计算投影是这里的难点 如何计算向量A到B的投影:
A和B的标量积是| A |*| B |*cos(θ),其中θ是从A到B的定向角。可以通过取xAxB+yAyB获得标量积的值。但是投影的长度是| A |*cos(θ),所以我们必须将标量积除以| B |。现在,我们有长度,但没有方向。方向是沿着向量B的,所以我们必须乘以沿着B的单位向量,即B/| B |。最后,我们得到了公式(xAxB+yAyB)*B/| B | 2 实际问题:
这是一种迂回的方法,我想从坐标中找到一个更直接的公式。另外(虽然不太重要),当我处理的数字很大时,计算投影和标量积所需的向量长度是有问题的,因为我可能会得到浮点溢出或类似的结果 如果这有什么意义的话,我正在OCaml中工作
提前感谢公式非常简单 投影(对于AB线和p点)似乎与您的类似:
L = A + AB * ScalarProduct(AB, AP) / ScalarProduct(AB, AB)
反射点
P' = P + 2*(L-P) = 2*L-P
工作Python示例:
def refl(x1, y1, x2, y2, xp, yp):
x12 = x2 - x1
y12 = y2 - y1
xxp = xp - x1
yyp = yp - y1
dotp = x12 * xxp + y12 * yyp
dot12 = x12 * x12 + y12 * y12
coeff = dotp / dot12
lx = x1 + x12 * coeff
ly = y1 + y12 * coeff
return 2*lx-xp, 2*ly-yp
print(refl(0, 0, 2, 2, 0, 1))
>>> (1.0, 0.0)
你认为最小化指数的绝对值有什么好处?