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)

你认为最小化指数的绝对值有什么好处?