2017-07-06 116 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

相關問題