Как бы я посчитал координаты границы квадрата 7х7 - PullRequest
0 голосов
/ 11 ноября 2019

Итак, у меня есть этот квадрат 7х7, размещенный в определенных координатах, и я хотел бы получить список координат для границы квадрата, но я не знаю, как сделать для этого математику. Я лично думал о sqrt, но не смог продвинуться дальше.

Редактировать: Изображение сетки с квадратом для пояснения

Цель состоит в том, чтобыполучить координаты синей области.

Set<Location> borderCoordinates = new HashSet<>();
Rectangle center = World.getRectangle(1363, 1370, 10264, 10271); //these values are dynamic
for (int x = (int) center.getMinX(); x <= (int) center.getMaxX(); x++) { //north
    borderCoordinates.add(new Location(x, (int) center.getMinY()));
}
for (int x = (int) center.getMinX(); x <= (int) center.getMaxX(); x++) { //south
    borderCoordinates.add(new Location(x, (int) center.getMaxY()));
}
for (int y = (int) center.getMinY() + 1; y < (int) center.getMaxY(); y++) { //west
    borderCoordinates.add(new Location((int) center.getMinX(), y));
}
for (int y = (int) center.getMinY() + 1; y < (int) center.getMaxY(); y++) { //east
    borderCoordinates.add(new Location((int) center.getMaxX(), y));
}

1 Ответ

0 голосов
/ 11 ноября 2019

С моей точки зрения, ваш код работает, но вы можете внести некоторые улучшения:

  • Вы можете исследовать верхнюю и нижнюю границы одновременно, а левую и правую границы нав то же время, чтобы избежать дополнительных циклов.
  • Хотя set гарантирует отсутствие повторных местоположений, вы также можете избежать их изучения. Таким образом, при добавлении левой / правой границ вы можете начинать с позиции + 1 и заканчивать на позиции - 1.

Вот код:

Set<Location> borderCoordinates = new HashSet<>();
Rectangle center = World.getRectangle(1363, 1370, 10264, 10271); //these values are dynamic
for (int x = (int) center.getMinX(); x <= (int) center.getMaxX(); x++) {
    // Add north and south borders
    borderCoordinates.add(new Location(x, (int) center.getMinY()));
    borderCoordinates.add(new Location(x, (int) center.getMaxY()));
}
for (int y = (int) center.getMinY() + 1; y < (int) center.getMaxY() - 1; y++) { 
    // Add west and east borders
    borderCoordinates.add(new Location((int) center.getMinX(), y));
    borderCoordinates.add(new Location((int) center.getMaxX(), y));
}

Также,если вы используете Java 8, вы можете использовать лямбды и / или потоки. Производительность будет немного хуже, но код может показаться более выразительным (декларативным) и компактным. Вот код:

Stream<Location> s1 = IntStream.range((int) center.getMinX(), (int) center.getMaxX()).mapToObj(x -> new Location(x, (int) center.getMinY()));
Stream<Location> s2 = IntStream.range((int) center.getMinX(), (int) center.getMaxX()).mapToObj(x -> new Location(x, (int) center.getMaxY()));
Stream<Location> s3 = IntStream.range((int) center.getMinY() + 1, (int) center.getMaxY() - 1).mapToObj(y -> new Location((int) center.getMinX(), y));
Stream<Location> s4 = IntStream.range((int) center.getMinY() + 1, (int) center.getMaxY() - 1).mapToObj(y -> new Location((int) center.getMaxX(), y));
Set<Location> borderCoordinates = Stream.concat(s1, Stream.concat(s2, Stream.concat(s3, s4))).collect(Collectors.toSet());

Также, в этом вопросе вы можете найти расширенное сравнение между потоками и для циклов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...