我有一个圆圈,向上矢量方向是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轴的旋转进行变换。我仍在试图弄清楚这是否是正确的方法。
答案 0 :(得分:1)
从圆心中找出点B的相对x和y坐标。 (如果你知道圆的半径,你可以这样做)。如果圆直径是精灵的宽度,只需将宽度除以2即可获得半径。然后使用反正切。
我会尝试帮助你,因为我在相对年轻的时候开始使用XNA,在我有任何矢量经验之前,你可能和我5年前的位置相同。
如果你不理解它背后的数学,你只需将B点视为由3条线组成的三角形上的一个点。我将使用(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)/(| |。甲|| || ||乙)
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弧度。
注意:使用计算器,您将获得准确的值,该值非常接近近似值。