我知道在这个问题上有很多问题。我对几何或数学不够熟悉,无法理解解决方案(很长时间没有做数学),所以我真的很感激有人帮助我解决这个问题。
我试图在C#中移动PictureBox对象,其中有三个值:它的起始位置作为一个点坐标,它应该行进的Angular ,以及速度(移动多少像素)。
我尝试了这个方法,把不同的答案拼凑在一起:
private Point MoveBullet(Point startPos, float angle, int bulletSpeed)
{
int X = Convert.ToInt32(startPos.X + (bulletSpeed * Math.Cos(angle)));
int Y = Convert.ToInt32(startPos.Y + (bulletSpeed * Math.Sin(angle)));
return new Point(X, Y);
}
但是,它仅在Angular 为0时起作用。图片是一辆坦克-当图片处于默认方向时,坦克炮塔朝向右侧-Angular 为0。我知道我可能把这个公式搞砸了,因为我没有把Angular 0放在北面,但是我不知道如何根据这个旋转来修正这个公式。
为了说明我对设置的意思,在下面的屏幕截图中,Angular 为0 -您可以从记录Angular 的标签中看到。子弹从坦克正确地射出-从左到右。
然而,当我旋转坦克一点,使其面向右上角,Angular 是315(想象它的顺时针移动315度,或逆时针45度。)我希望子弹飞向右上角,但他们飞向右下角。它看起来好像偏离了大约90度?
我犯了什么错误,我怎么才能纠正运动公式,使子弹以预期的Angular 飞行?
2条答案
按热度按时间x6yk4ghg1#
根据您的文本,您正在使用Angular (0-360),但Math.Sin/Cos期望Angular 以弧度(0-2π)为单位。
你应该用
tyky79it2#
我强烈建议创建一个Angular 类型,以处理任何弧度/度转换。使用float/double表示Angular 会导致混淆和错误。我还强烈建议尽可能多地使用矢量,因为描述Angular 会变得复杂。使用System.Numerics.Vectors:
这应该可以让你写这样的代码:
请注意,坐标系是复杂的,如果你有一个方便的系统来显示位置,Angular ,方向等,而不是试图猜测它们是什么,或者试图在调试器中读取变量并试图理解它们的含义,你会让生活更容易。这在3D中尤其重要,因为一切都变得更加复杂。