c# - 获取 Vector2 之间的角度

标签 c# windows-phone-8 xna monogame

当汽车撞到星星时,我想将星星(我的代码中的硬币)移动到屏幕的右上角。每次更新时,星和路都在以恒定的速度向下移动。由于道路向下移动,汽车没有移动但似乎在向上移动。虽然它可以根据用户的命令移动到左右车道。

所以我用下面的方法计算了星星和屏幕右上角的夹角

public double AngleBetween(Vector2 a, Vector2 b)
{
    return Math.Atan2(b.Y - a.Y, b.X - a.X);
}

在我的Update 方法中,下面计算移动的速度并将其发送到屏幕的右上角

double angleBetween = coin.AngleBetween(coin.Position, new
   Vector2(currentGame.GraphicsDevice.Viewport.Bounds.Right, 0));              
collidedCoinVelocity = new Vector2((float)Math.Sin(angleBetween), 
   -(float)Math.Cos(angleBetween));

在我的Draw 方法中,我更新了coin.Position 使用

coin.Position += collidedCoinVelocity * 10 ;

问题是星星(硬币)没有像我想要的那样发送到右上角,而是在右屏幕边界中间的某个地方。

当星星在右车道被击中时,它与右上角的夹角总是

1.2196048576751 radians = 69.878211 degree

当星星在左边车道时,角度是

0.952588487628243 radians = 54.5793 degree

我是否正确计算了角度,我错过了什么?也许我忘了考虑恒星的向下运动?

enter image description here

enter image description here

编辑

我更新了图像以显示我尝试计算的角度,并编辑了我的问题以使其更清晰。

编辑 2

添加了第二张图片以显示星星被击中后的去向。

最佳答案

看来你不小心交换了 sin 和 cos,而且里面似乎有一个随机的负数。因此这一行

collidedCoinVelocity = new Vector2((float)Math.Sin(angleBetween), 
   -(float)Math.Cos(angleBetween));

应该是

collidedCoinVelocity = new Vector2((float)Math.Cos(angleBetween), 
   (float)Math.Sin(angleBetween));

虽然你甚至不需要计算那么多角度。要获得没有角度的单位向量,只需使用

double dx = b.X - a.X;
double dy = b.Y - a.Y;
double mag = Math.Sqrt(dx * dx + dy * dy);
collidedCoinVelocity = new Vector2(dx, dy) / mag;

关于c# - 获取 Vector2 之间的角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18798107/

相关文章:

c# - 以编程方式在 Listview 中选择项目,该项目绑定(bind)到数据表并且默认按排序顺序排列?

c# - 如果参数为空,则查询返回所有记录

sql - WP8 SQlite选择查询

api - 访问 xbox 音乐 API

c# - Game1.GraphicsDevice 和graphics.GraphicsDevice 之间的区别

c# - XNA 中的实时资源更新

c# - 将 X.509 证书发送到 WCF c#

c# - 将 null 传递给泛型方法时,奇怪的是我仍然可以获得类型

c# - HtmlAgilityPack.HtmlNode 没有 SelectNodes 的定义

c# - 在瓷砖照明中混合颜色的最佳方式? (新华社)