2015-11-05 3 views
-1

У меня есть неопределенное количество очков на карте, основанной вокруг центра. Они должны быть расположены в многоугольнике, поэтому их угол равен 360/количество очков (http://prntscr.com/8z2w3z). У меня есть центральная точка, длина и направления, поэтому должно быть возможно найти координаты для точек. Поскольку я работаю с Bukkit для создания плагина minecraft, единственный способ добавить места - это добавить их координаты, поэтому я не могу просто дать им направление. Вот код, я должен работать, но не сделал:Получение координат для правильного многоугольника

 float teamAngle = angle * teamNumber; 
     Location spawnPoint = mapCenter; 
     float relX = (float)Math.cos(Math.toRadians(teamAngle))*radius; 
     float relZ = (float)Math.sin(Math.toRadians(teamAngle))*radius; 
     spawnPoint.add(new Location(Bukkit.getWorld("world"), relX, 0, relZ, 0, 0)); 
  • teamAngle является φ для каждой точки, так и с 4 очками, было бы 0, 90, 180 и 270
  • radius является просто поплавок на основе размера карты/2 * 0.8. Это не может быть лучшим имя переменной

С 4 очка, я бы ожидать, что-то вроде этого (ширина карты 100 => радиусом 40, центром в точке (0 | 0)):

  • (40 | 0)
  • В (0 | -40)
  • C (-40 | 040)
  • D (0 | 40)

EDIT: На самом деле, как комментатор сказал, c аорты должны быть немного разными, я изменил его выше

+1

«Это не сработало» не дает никакой соответствующей информации, чтобы помочь исправить вашу проблему. – Unihedron

+0

Ваши ожидаемые точки предназначены для углов 45 °, -45 °, -135 °, 135 ° с радиусом 56,5. Вы должны получить (40,0), (0,40), (-40,0), (0, -40). Или (28,28), (- 28,28) и т. Д. С 'teamAngle = angle * (teamNumber + 0.5)'. – LutzL

ответ

1

Ваша идея расчета координат, насколько я могу судить, верна. Я могу только догадываться, что причина, по которой вы получаете странные координаты, состоит в том, что вы продолжаете редактировать одно и то же место снова и снова (хотя, поскольку вы предоставили только частичный фрагмент кода, я не могу гарантировать, что это так).

Линия Location spawnPoint = mapCenter не создает новое местоположение, оно создает только ссылку с именем spawnPoint, указывающую на mapCenter.

Метод для местоположений также не возвращает новый экземпляр Location. Поскольку каждая вершина многоугольника должна быть найдена путем добавления x и y компонентов в центр, вы должны скопировать или клонировать переменную mapCenter, чтобы вы не редактировали/не изменяли исходный центр карты. Я предполагаю, что вы используете цикл, чтобы создать/найти каждый из местоположений вершин многоугольника, а не копируя переменную mapCenter, это будет происходить:

1-й итерации: Угол 0º, добавьте 40 в координате х от spawnPoint (это изменяет mapCenter) и 0 на координату z spawnPoint. Предполагая, что центр карты первоначально был равен 0, 0, 0, теперь координаты 40, 0, 0 (это все еще правильно).

второй итерации: Угол 90º, добавьте 0 к Координата х spawnPoint и 40 к апликаты spawnPoint (еще раз меняется centerMap, который мы уже отредактированный в последней итерации). Теперь координаты mapCenter равны 40, 0, 40, что неверно. Мы должны были добавить новые компоненты к новой копии mapCenter.

Чтобы исправить это использование Location spawnPoint = mapCenter.clone().Пример кода:

public static List<Location> getPolygonVertices(float radius, int edges, Location center) { 
    List<Location> vertices = new ArrayList<Location>(); 
    float angleDelta = 360/edges; // The change in angle measure we use each iteration 
    for (int i = 0; i < edges; i++) { // For each vertix we want to find 
     float angle = angleDelta * i; // Calculate the angle by multiplying the change (angleDelta) with the number of the edge 
     Location corner = center.clone(); // Clone the center of the map 
     corner.add(Math.cos(Math.toRadians(angle)) * radius, 0, Math.sin(Math.toRadians(angle)) * radius); // Add the x and z components to the copy 
     vertices.add(corner); 
    } 
    return vertices; 
} 

Вы можете использовать этот метод следующим образом:

List<Location> vertices = getPolygonVertices(40, 4, mapCenter); 

и он будет возвращать правильные места ([40 | 0], [0 | 40], [-40 | 0 ], [0 | -40]).

+0

Привет, я использовал 'Location spawnPoint = mapCenter;', чтобы попытаться избежать этой проблемы, но поймите, почему это не сработало. –

+0

Использование 'Location spawnPoint = mapCenter' _is_. Вам нужно клонировать переменную, в противном случае вы меняете 'mapCenter' себя и не использовать его в качестве опорной точки до начала координат. –

+0

Да, это действительно сработало, спасибо. Хотя я сменил поплавки на парные, потому что это было действительно неточно –

Смежные вопросы