【问题标题】:Find the angle between any point inside a circle and the up vector direction求圆内任意点与上矢量方向的夹角
【发布时间】:2014-01-09 02:45:53
【问题描述】:

我有一个向上矢量方向为 Vector(0, -1) 的圆和一个点 B,它可以在该圆上的任何位置。我知道它在圆圈内的确切位置。 (0,0) 点位于图像的左上角。

如何找到点 B 和上向量之间相对于圆心的角度 x?

我正在用 XNA 和 C# 开发游戏。

更新:我不明白为什么这个问题被标记为与编程无关。无论如何,这是我到目前为止所做的。

我可以找到两个向量之间的弧度

    private float radianBetweenVectors(Vector2 a, Vector2 b)
    {
        return (float)Math.Atan2(b.Y - a.Y, b.X - a.X);
    }

但如果可能的话,我不想知道向上矢量在精灵图像上的位置。这里的位置是圆的圆周上从 0 度开始的点。

更新 2:

一旦我有了角度,我想获得旋转矩阵:

Matrix rotMatrix = Matrix.CreateRotationZ(angle);

现在我有了这个包含旋转的矩阵,我可以让 XNA 用这个旋转来变换 Up 向量:

moveDirection = Vector2.Transform(up, rotMatrix);

我希望这将采用原来的向上方向,通过围绕 Z 轴的旋转进行变换。我仍在试图弄清楚这是否是正确的方法。

【问题讨论】:

  • 为什么投反对票而这个问题与编程无关?
  • 到目前为止,您还没有表现出对问题的数学部分的理解——所以“与编程无关”和“对问题没有表现出最低限度的理解”......
  • 可能的原因是这个网站通常不喜欢不显示任何代码的问题。如果我错了,请纠正我(我没有投反对票)。
  • 好的,我已经展示了代码。以后还会有更多。
  • +1。现在看起来好多了。谢谢。现在很清楚问题出在哪里(基本向量数学) - 正如 Luís Assunção 的答案所示,通常使用标量乘法来查找 cos 而不是获得角度......并且“向上”始终是 (0,1)(0, -1) 取决于您的坐标系统(请注意,您需要将其与 XNA 匹配) - 所以您不需要计算它....

标签: c# vector xna


【解决方案1】:

从圆心查找点 B 的相对 x 和 y 坐标。 (如果你知道圆的半径,你可以这样做)。如果圆的直径是精灵的宽度,只需将宽度除以 2 即可得到半径。然后使用反正切。

我会尽力帮助你,因为我在我比较年轻的时候就开始了 XNA,在我没有任何向量经验之前,你可能处于与 5 年前相同的位置。

如果您不了解其背后的数学原理,您只需将 B 点视为由 3 条线组成的三角形上的一个点。我将使用(0,0)作为圆心,您可以根据给定半径的绝对位置计算圆心的相对位置。 (如果你做不到这部分,你需要在数学课上多加注意)。

  • (0,0) 到 (0, B.y) 将是垂直腿。
  • (0, B.y) 到 (B.x, B.y) 将是水平腿
  • (B.x, B.y) 到 (0,0) 将是斜边。

然后你使用切线规则切线 = 对面/相邻。所以你会知道另一条腿到角度 X 的距离是从 (0, B.y) 到 (B.x, B.y) 水平腿的距离。相邻腿距离为 (0,0) 到 (0, B.y)。不需要距离公式,只需减去坐标。现在你有了 tangent 的值并想求 X 的值,所以我们将使用 arctan。 Math.Atan2(opposite/adjacent)。这将以弧度为您提供答案。

编辑:哦,我记得你可以使用 draw 的 origin 参数绘制精灵,所以 center of the sprite will be rendered at the center of the sprite bitmap。这样您就不必担心计算圆心。

【讨论】:

    【解决方案2】:

    从数学上讲,如果你有两个向量,假设 A(0, -1) 和 B(222, 90) 两个向量之间的角度 X 可以计算为 cos(X)=(A.B)/(| |A||.||B||)。

    1. A x B = (a1 x b1) + (a2 x b2) = 0x222 + (-1x90) = 0 - 90 = -90。

    2.I. ||一个|| = 平方根[0^2+(-1)^2] = sqrt[(-1)^2] = 1

    2.II. ||B|| = squareroot[222^2+90^2] = sqrt(57384) ~= 239.55 (~= 大约)

    2.III. ||A||.||B|| = 1 x 239.55 ~= 239.55

    结果:cos(X) ~= (-90)/(239.55) ~= X ~= cos^-1(X) ~= 1.955 弧度。

    对于你上面给出的向量,你寻找的角度大约是 1.955 弧度。

    注意:使用计算器,您将获得精确值,与近似值非常接近。

    【讨论】:

    • 是的。我很抱歉是在弧度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    相关资源
    最近更新 更多