我有以下六边形网格,并试图计算从中心到每个边缘六边形的度数(浅蓝色):
蓝色突出显示的十六进制在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;
}
为什么剩下的角度(每个六边形中的文字)不正确?
答案 0 :(得分:2)
你真的很接近正确;你只需要补偿atan
的周期。执行此操作的标准方法是使用atan2
,其返回(-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
中查找角度,该角度代表中心十六进制和蓝色突出显示的十六进制之间的最小角度,您可以只取结果的绝对值{ {1}}:return Math.abs(radians) * 180 / Math.PI
;这个问题让你有点不清楚你要求的是哪一个。