gpt4 book ai didi

c# - 获取 Vector2 之间的角度

转载 作者:太空狗 更新时间:2023-10-29 23:08:15 25 4
gpt4 key购买 nike

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

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com