使用x,y坐标计算角度

Xam*_*v89 2 c# math xamarin skiasharp

我的目标是计算用户手指围绕scren中心点的拖动,我尝试使用Math.Atan2()尝试了一些不好的尝试.仅供参考我在Xamarin应用程序中使用SkiaSharp,但为了简单起见我只需要帮助以下方案.

使用下面的截图可能有人告诉我产生以下结果的最佳方法?

A = 0度

B = 90度

C = 180度

D = 270度

在此输入图像描述

Oli*_*bes 6

向我们展示返回错误结果的代码代码,向我们展示问题所在,并允许我们为您提供更具体的建议.

  1. 由于您需要相对于中心的角度,因此必须从点中减去中心坐标.

  2. Math.Atan2屈服弧度.将它们转换为度数degrees = radians * 180 / pi.

  3. 您的零角度在x轴上不常见,但在y轴上.添加90度进行校正.

使用矢量类型可以简化操作.在这里,我将使用System.Numerics.Vector2结构.

正如帕特里克麦克唐纳指出的那样,在某些情况下,Atan2可能会产生负面结果.通过向结果添加450度(360 +我们的90度校正)并将此模数取为360度,您总是得到0到360之间的值.

public static float GetAngle(Vector2 point, Vector2 center)
{
    Vector2 relPoint = point - center;
    return (ToDegrees(MathF.Atan2(relPoint.Y, relPoint.X)) + 450f) % 360f;
}

public static float ToDegrees(float radians) => radians * 180f / MathF.PI;
Run Code Online (Sandbox Code Playgroud)

考试

var a = new Vector2(7, 3);
var b = new Vector2(20, 7);
var c = new Vector2(7, 10);
var d = new Vector2(3, 7);
var e = new Vector2(6.9f, 3); // Test for more than 270 deg.
var f = new Vector2(7.1f, 3); // Test for small angle.

var center = new Vector2(7, 7);

PrintAngle(a); // ==>   0
PrintAngle(b); // ==>  90
PrintAngle(c); // ==> 180
PrintAngle(d); // ==> 270
PrintAngle(e); // ==> 358.5679
PrintAngle(f); // ==>   1.432098


void PrintAngle(Vector2 point)
{
    Console.WriteLine(GetAngle(point, center));
}
Run Code Online (Sandbox Code Playgroud)