C# C寻找2个给定点之间的角度

C# C寻找2个给定点之间的角度,c#,rotation,coordinates,angle,atan,C#,Rotation,Coordinates,Angle,Atan,在我正在编写的程序中,我有一个对象,玩家的形状是三角形,这个三角形应该一直朝着鼠标旋转。鉴于这两点,我尝试了我在网上找到的不同方程式,但它们似乎都不起作用,或者至少表现得足够好 delta_x = cursor.X - pos.X; delta_y = cursor.Y - pos.Y; cursorAngle = (float)Math.Atan2(delta_y, delta_x) * (float)(180 / Math.PI); 这是我发现的最有效的公式,但它仍然不够有效,因为它只以特

在我正在编写的程序中,我有一个对象,玩家的形状是三角形,这个三角形应该一直朝着鼠标旋转。鉴于这两点,我尝试了我在网上找到的不同方程式,但它们似乎都不起作用,或者至少表现得足够好

delta_x = cursor.X - pos.X;
delta_y = cursor.Y - pos.Y;
cursorAngle = (float)Math.Atan2(delta_y, delta_x) * (float)(180 / Math.PI);

这是我发现的最有效的公式,但它仍然不够有效,因为它只以特定角度或距离面对鼠标。Cursor.X和.Y是鼠标的坐标,pos.X和.Y是播放器的坐标

我创建了这个WinForm示例,它计算每次在窗体上移动鼠标时鼠标与窗体中心的角度和距离。结果显示在标签中

表单中心的红点只是一个参考面板,与代码无关

    private void f_main_MouseMove(object sender, MouseEventArgs e)
    {
        Point center = new Point(378, 171);
        Point mouse = this.PointToClient(Cursor.Position);

        lb_mouseposition.Text = $"Mouse Angle: {CalculeAngle(center, mouse)} / Distance: {CalculeDistance(center, mouse)}";
    }


    private double CalculeAngle(Point start, Point arrival)
    {
        var deltaX = Math.Pow((arrival.X - start.X), 2);
        var deltaY = Math.Pow((arrival.Y - start.Y), 2);

        var radian = Math.Atan2((arrival.Y - start.Y), (arrival.X - start.X));
        var angle = (radian * (180 / Math.PI) + 360) % 360;

        return angle;
    }

    private double CalculeDistance(Point start, Point arrival)
    {
        var deltaX = Math.Pow((arrival.X - start.X), 2);
        var deltaY = Math.Pow((arrival.Y - start.Y), 2);

        var distance = Math.Sqrt(deltaY + deltaX);

        return distance;
    }
此处显示的角度以度为单位,范围从0到359。
我希望这有助于计算两点之间的角度。

我创建了这个WinForm示例,用于计算每次在窗体上移动鼠标时鼠标与窗体中心的角度和距离。结果显示在标签中

表单中心的红点只是一个参考面板,与代码无关

    private void f_main_MouseMove(object sender, MouseEventArgs e)
    {
        Point center = new Point(378, 171);
        Point mouse = this.PointToClient(Cursor.Position);

        lb_mouseposition.Text = $"Mouse Angle: {CalculeAngle(center, mouse)} / Distance: {CalculeDistance(center, mouse)}";
    }


    private double CalculeAngle(Point start, Point arrival)
    {
        var deltaX = Math.Pow((arrival.X - start.X), 2);
        var deltaY = Math.Pow((arrival.Y - start.Y), 2);

        var radian = Math.Atan2((arrival.Y - start.Y), (arrival.X - start.X));
        var angle = (radian * (180 / Math.PI) + 360) % 360;

        return angle;
    }

    private double CalculeDistance(Point start, Point arrival)
    {
        var deltaX = Math.Pow((arrival.X - start.X), 2);
        var deltaY = Math.Pow((arrival.Y - start.Y), 2);

        var distance = Math.Sqrt(deltaY + deltaX);

        return distance;
    }
此处显示的角度以度为单位,范围从0到359。
我希望这有助于计算两点之间的角度。

你不能只有两个点的角度,你需要第三个点。也许他的意思是原点是第三个点公式应该很好实际上,你确定你没有混淆弧度和度吗?请记住,由于180/Math.PI部分,cursorAngle以度为单位检索值。我使用windows窗体,将播放器的初始位置设置为x=width/2和y=height/2,从那里用户可以向任何方向移动。而且它还接收到鼠标的位置,问题是鼠标和玩家之间的距离似乎会显著影响角度,因此不准确。我看到两者之间的距离越近,数字就越小,因此如果鼠标处于相同的角度,我将鼠标拉得离播放器越近或更远,播放器就会开始移动rotate@insignia-只要给定两个点,就可以在它们之间创建无限个直角三角形。不能只有两个点的角度,你需要第三个点,也许他的意思是原点是第三个点,公式应该可以,实际上,你确定你没有混淆弧度和度数吗?请记住,由于180/Math.PI部分,cursorAngle以度为单位检索值。我使用windows窗体,将播放器的初始位置设置为x=width/2和y=height/2,从那里用户可以向任何方向移动。而且它还接收到鼠标的位置,问题是鼠标和玩家之间的距离似乎会显著影响角度,因此不准确。我看到两者之间的距离越近,数字就越小,因此如果鼠标处于相同的角度,我将鼠标拉得离播放器越近或更远,播放器就会开始移动rotate@insignia-只要给定两个点,就可以在它们之间创建无限个直角三角形。是的,它可以工作,但我有一个问题,我想这和我用来旋转物体的方法有关,比如图形,TranslateTransformpos.X,pos.Y;e、 Graphics.RotateTransformfloatcursorAngle;e、 图形。TranslateTransform-pos.X,-pos.Y;它似乎旋转得很好,直到它达到某个角度,然后快速旋转360度。我从一个朋友不久前给我的示例代码中得到了这段代码,尝试使用Matrix draw=新矩阵和draw.RotateAt将帮助您。是的,它可以工作,但我有一个问题,我认为它与我用于对象旋转的方法有关e.Graphics.TranslateTransformpos.X,pos.Y;e、 Graphics.RotateTransformfloatcursorAngle;e、 图形。TranslateTransform-pos.X,-pos.Y;它似乎旋转得很好,直到它达到某个角度,然后快速旋转360度。我从一个朋友不久前给我的示例代码中获得了这段代码,使用Matrix draw=new Matrix和draw.RotateAt将对您有所帮助。