如何正确表示极坐标?
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
;这个问题有点不清楚你要的是哪一个。
我有以下六边形网格并尝试计算从中心(浅蓝色)到每个六边形边缘的度数:
蓝色突出显示的十六进制在 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
;这个问题有点不清楚你要的是哪一个。