Bukkit:如何让玩家距离圆圈边缘?

时间:2017-07-06 21:01:36

标签: java geometry bukkit

如果我在所选的世界中有一个位置,并且在该位置周围有一个“安全区”,表示延伸500个街区(创建一个圆圈)(这意味着玩家可以在该位置的500个街区内并且是“安全的” “)。如何找到球员位置到最近的安全区域的距离?或者在这种情况下,该圆圈的最近边缘是什么?

1 个答案:

答案 0 :(得分:4)

要查找玩家到指定安全区的距离,您只需找到他们到安全区中心的距离,然后减去半径。这是因为到圆边的最短矢量将垂直于边界,因此平行于穿过圆心的半径。

考虑到安全区域中心的(x,y)坐标(x1,y1)以及玩家的坐标(x2,y2),您可以计算到安全区中心的距离,如这样:

double distance = Math.sqrt(Math.pow(x1-x2,2) + Math.pow(y1-y2,2));

要比较您最接近的安全区域,您可以等待减去半径长度以防止浪费计算。

对安全区域列表进行排序可能如下所示:

public double distanceToNearestSafeZone(Player player, List<SafeZone> safeZones) {
     double distance;
     double minimumDistance = Double.POSITIVE_INFINITY;
     for(SafeZone safeZone:safeZones) {
          distance = Math.sqrt(Math.pow(player.x-safeZone.x,2) + Math.pow(player.y-safeZone.y,2));
          if(minimumDistance > distance) {
               minimumDistance = distance;
          }
     }
     return minimumDistance - SafeZone.radius;
}

在此示例中,玩家对象有两个public double字段xy保持玩家位置。 SafeZone个对象具有相似的字段。 SafeZone也有一个public static double radius字段。

我希望这有帮助!

相关问题