如何正确表示极坐标?

How can I get polar coordinates represented properly?

我有以下六边形网格并尝试计算从中心(浅蓝色)到每个六边形边缘的度数:

蓝色突出显示的十六进制在 0 度时是正确的,并且该象限(右下角)是正确的。这是我的角度计算方法:

private static function calculateAngle(hex1:Hexagon, hex2:Hexagon):Number {
    // hex1 is always passed in as the grid center or start
    var diffY:Number = Math.abs(hex2.center.y) - Math.abs(hex1.center.y);
    var diffX:Number = Math.abs(hex2.center.x) - Math.abs(hex1.center.x);
    var radians:Number = Math.atan(diffY / diffX);

    return radians * 180 / Math.PI;
}

为什么剩余的角度(每个六边形中的文字)不正确?

你真的很接近正确;你只需要补偿 atan 的周期性。执行此操作的标准方法是使用 atan2,其中 returns 是 (-pi, pi] 中的有符号角,而不是 [0, pi) 中的无符号角。您可以这样做:

var radians:Number = Math.atan2(
    hex2.center.y - hex1.center.y, hex2.center.x - hex1.center.x);

请注意,我没有在其中包含对 abs 的调用:atan2 需要这些值的符号才能知道它在哪个象限!

编辑:如果您要在 [0, pi] 中寻找一个角度,它表示中心六边形和蓝色突出显示的十六进制之间的最小角度,您可以只取 atan2: return Math.abs(radians) * 180 / Math.PI;这个问题有点不清楚你要的是哪一个。