【问题标题】:Calculate the rotation performed around a point计算围绕一个点执行的旋转
【发布时间】:2010-11-03 13:37:19
【问题描述】:

我在二维空间中有两个点,以原点 (0,0) 为中心。第一个点表示起始位置,第二个表示结束位置。我需要计算两点之间的旋转角度,我的问题是每个点到(0,0)的斜边不相等。

谁能告诉我如何计算出两点之间的角度,记住它们可以是相对于 (0,0) 的任何位置。

非常感谢,

马特。

【问题讨论】:

    标签: math geometry


    【解决方案1】:

    假设点 1 是 (x1,y1),点 2 是 (x2,y2)

    从X轴到点1的角度的切线,相对于(0,0)是y1/x1

    从X轴到点2的角度的切线,相对于(0,0)是y2/x2

    取反正切(这是正确的术语吗?计算器上的 Tan-1)得到每个角度的实际角度,然后减去得到你正在寻找的答案

    【讨论】:

    • @Matt W:不要忘记点所在的象限以及“x = 0”的情况。
    • 好点。反正切是正确的术语,你知道吗?上正式数学课已经20多年了,记性有点生疏了
    • @Lavir,您是说如果点是 (10,10) 和 (-12,-43) 的话,Kevin O' 提供的答案会有所不同吗?
    • @Kevin Arctangent 是正确的术语。 @Matt Ordinary arctan 有歧义——您可以考虑改用atan2。如果您的任何一点与原点重合,显然没有明确的答案。 (顺便说一句,其他方法也是可能的——例如,您可以使用dot product 来获取角度的余弦并取其中的acos。)
    • 如果您要使用反正切,请使用atan2(如果您的语言/库中有它),因为当您有垂直时它不会遇到问题。普通的旧 atan 在域中有无穷大,这可能很尴尬……
    【解决方案2】:

    这很容易实现,取两个向量的归​​一化 inner product 的反余弦值。也就是说,给定 u = (ux, uy) 和 v = (vx , vy),两者的夹角由θ = acos(u·v/|给出u||v|),其中 u · v = uxv x + uyvy 是两者的点积和 | |运算符是由 |u| 给出的 l2 法线。 = sqrt(ux2 + uy2)。这将导致可以应用于其中一个向量的最小旋转,这将使它们成为彼此的线性倍数。因此,您可能需要摆弄 θ 的符号,以确保如果您想从一个方向开始,您会朝着正确的方向前进。

    【讨论】:

    • @Donal Fellows:谢谢。我一直在寻找一种在其中放一个点的方法,但它只是一直插入一个大正方形。
    • 对不起,我不知道是什么||数学上的意思。我怀疑如果我这样做了,这个几何问题就不会成为问题。因此,我也不知道如何将其转换为代码(我正在使用 lua 和 C#。)
    • @Matt W: |u|表示使用正常笛卡尔长度的 u 的长度。那就是 sqrt(u_x^2 + u_y^2)。 |u||v|表示向量 u 的长度与向量 v 的长度的乘积。
    • 好的,谢谢。这不是我通常的领域,我得稍微考虑一下。
    猜你喜欢
    • 2023-04-11
    • 2023-04-03
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    相关资源
    最近更新 更多