C# 求两个给定点之间的角度

ins*_*nia 1 c# angle rotation coordinates 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);
Run Code Online (Sandbox Code Playgroud)

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

小智 9

我创建了这个 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;
    }
Run Code Online (Sandbox Code Playgroud)

这里的角度以 0 到 359 之间的度数显示。我希望这有助于计算两点之间的角度。