2017-07-06 76 views
0

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

+2

你为什么要困扰安全区的*边缘?只需计算从玩家位置到安全区域中心的距离即可。如果你仍然需要到边缘的距离,那么你可以减去半径。 – domsson

回答

4

要查找玩家与给定安全区域的距离,您只需找到距离安全区域中心的距离,然后减去半径即可。这是因为到圆的边缘的最短向量将垂直于边界,因此平行于通过圆的中心的半径。

给定一个安全区,(x1,y1)和玩家,(x2,y2)的中心坐标的(x,y)坐标,可以计算到安全区像这样的中心的距离:

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字段。

我希望这有助于!

+1

我认为这会更复杂!非常感谢! – ctooley17

+1

没问题你的项目祝你好运! –

+1

ctooley17,如果此答案解决了您的问题,则应将其标记为* accepted *(请参阅左侧的刻度线)。 – domsson

相关问题