【问题标题】:Quickly compute reflection of point about line described by two points快速计算点关于两点描述的线的反射
【发布时间】:2021-03-22 22:56:20
【问题描述】:

问题如下:
给定两个不同的点 P1 = (x1,y1), P2 = (x2,y2) 和点 G=(a,b),求 c 和 d 使得 G'=(c,d) 是 G 关于直线 P 的反射1P2

我正在寻找一种快速的方法。由于我正在研究浮点数,因此我还想使用一种方法来最小化科学计数法中指数的绝对值,但这是第二要务。

我尝试过的:设 R 是向量 (GP1) 到向量 (P2-P1 的投影的向量子>)。然后,通过取 Q = P1 + R 来实现反射,这是 G 到线上的投影,然后 G' = 2Q-G。现在这一切都很酷而且花花公子,但计算投影是这里的难点。

我如何计算向量 A 在 B 上的投影:
A和B的标量积是|A|*|B|*cos(theta),其中theta是A到B的有向角。取xA可以得到标量积的值sub>xB + yAyB。但是投影的长度是 |A|*cos(theta),所以我们必须将标量积除以 |B|。现在,我们有长度,但没有方向。方向是沿向量 B,所以我们必须乘以沿 B 的单位向量,即 B/|B|。最终,我们得到公式 (xAxB + yAyB)*B/|B |2.

实际问题:
这是一种迂回的方法,我正在从坐标中寻找更直接的公式。此外(虽然不太重要),当我正在处理的数字很大时,我在计算投影和标量积时需要计算向量的长度是有问题的,因为我可能会遇到浮点溢出或类似的情况.

如果这有任何意义,我在 OCaml 工作。

提前致谢

【问题讨论】:

  • 最小化指数的绝对值有什么好处?

标签: algorithm floating-point geometry formula


【解决方案1】:

公式真的很简单。

投影(对于 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)

【讨论】:

    猜你喜欢
    • 2012-10-06
    • 2012-07-22
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 2014-05-09
    • 2017-06-30
    相关资源
    最近更新 更多