【问题标题】:How can I get polar coordinates represented properly?如何正确表示极坐标?
【发布时间】:2016-11-10 19:25:01
【问题描述】:

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

蓝色突出显示的十六进制在 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;
}

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

【问题讨论】:

  • center 属性是 Point 对象吗?
  • @null: 是的,center 是一个 Point 对象。
  • 认为Point 中的角度有一个getter,但只有一个静态方法polar(len:Number, angle:Number):Point 从极坐标构造Point。没有内置方法来获取现有极坐标。

标签: actionscript-3 geometry polar-coordinates


【解决方案1】:

你真的很接近正确;你只需要补偿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 结果的绝对值:@ 987654331@;这个问题有点不清楚你要的是哪一个。

【讨论】:

  • 我这样做了,但左角应该是 > 180 为负:-173-166 ... -6。所以我归一化if (radians < 180) return radians + 360
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多