winforms 按Angular 将对象从A移动到B-对象走错了方向

62o28rlo  于 2023-06-24  发布在  Angular
关注(0)|答案(2)|浏览(90)

我知道在这个问题上有很多问题。我对几何或数学不够熟悉,无法理解解决方案(很长时间没有做数学),所以我真的很感激有人帮助我解决这个问题。
我试图在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 飞行?

x6yk4ghg

x6yk4ghg1#

根据您的文本,您正在使用Angular (0-360),但Math.Sin/Cos期望Angular 以弧度(0-2π)为单位。
你应该用

Math.Sin(angle * Math.PI / 180)
Math.Cos(angle * Math.PI / 180)
tyky79it

tyky79it2#

我强烈建议创建一个Angular 类型,以处理任何弧度/度转换。使用float/double表示Angular 会导致混淆和错误。我还强烈建议尽可能多地使用矢量,因为描述Angular 会变得复杂。使用System.Numerics.Vectors

public class Angle{
    public double Radians {get;}
    public double Degrees => Radians * 180d / Math.PI;
    private Angle(double radians) => Radians = radians;
    public Angle FromDegrees(double degrees) => new Angle(degrees * Math.PI/180d);
    public Angle FromRadians(double radians) => new Angle(radians);
    public double Sin => Sin(radians);
    public double Cos => Cos(radians);
    public Vector2 ToDirection() => new Vector2( (float)Cos, (float)Sin);
}

这应该可以让你写这样的代码:

var newPosition = currentPosition  + angle.ToDirection() * bulletSpeed;

请注意,坐标系是复杂的,如果你有一个方便的系统来显示位置,Angular ,方向等,而不是试图猜测它们是什么,或者试图在调试器中读取变量并试图理解它们的含义,你会让生活更容易。这在3D中尤其重要,因为一切都变得更加复杂。

相关问题