找到圆内任意点与向上矢量方向之间的角度

时间:2014-01-09 02:45:53

标签: c# vector xna

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

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

enter image description here

我正在使用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轴的旋转进行变换。我仍在试图弄清楚这是否是正确的方法。

2 个答案:

答案 0 :(得分: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)将是斜边。

然后使用切线与规则tangent = opposite / adjacent。因此,您将知道相对的腿与角度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。这样你就不用担心计算圆心了。

答案 1 :(得分:1)

以数学方式说,如果你有两个向量,让我们假设A(0,-1)和B(222,90)两个向量之间的角度X可以计算为cos(X)=(AB)/(| |。甲|| || ||乙)

  1. A x B =(a1 x b1)+(a2 x b2)= 0x222 +( - 1x90)= 0 - 90 = -90。
  2. 2.I。 ||一个|| = squareroot [0 ^ 2 +( - 1)^ 2] = sqrt [( - 1)^ 2] = 1

    物2.ii。 || ||乙= squareroot [222 ^ 2 + 90 ^ 2] = sqrt(57384)〜= 239.55(〜=近似)

    2.III。 || ||甲。|| ||乙= 1 x 239.55~ = 239.55

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

    对于上面给出的矢量,您寻找的角度约为1.955弧度。

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