使用x、y坐标计算角度的度数

4
我的目标是计算用户手指围绕屏幕中心点的拖拽阻力,我已经尝试过使用Math.Atan2()但都不理想。顺便说一下,我在Xamarin应用程序中使用SkiaSharp,但为了简单起见,我只需要以下场景的帮助。
请问如何利用以下截图来产生以下结果?
A = 0度
B = 90度
C = 180度
D = 270度

enter image description here


1
为什么我被扣了负分?您是否希望我展示一些使用Math.Atan2(yPosition, xPosition)的误导性代码或不起作用的代码? - XamDev89
1
就个人而言,我认为仅提及您尝试使用atan2即可“展示您所尝试的”。 - Patrick McDonald
1个回答

9
展示返回错误结果的代码可以帮助我们找到问题所在,并且让我们给出更具体的建议。
  1. 由于您想要相对于中心的角度,因此必须从点坐标中减去中心坐标。
  2. Math.Atan2 返回弧度值。使用 degrees = radians * 180 / pi 将其转换为角度。
  3. 你的零度角不像通常在x轴上,而是在y轴上。加上90度进行修正。
使用向量类型可以使事情更简单。这里将使用 System.Numerics.Vector2 结构。
如 Patrick McDonald 指出的,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;

测试

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));
}

1
这就是了,我最困难理解的是如何捕获角度,但是degrees = radians * 180 / pi很容易理解,因为一个360度的圆等同于两个π弧度。 - XamDev89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接