Я работал над созданием гексагональной сетки (с плоским верхом) для моделирования, над которым я работаю. Я попытался определить расстояние между шестиугольниками от заданного целевого шестиугольника.
Решение, которое у меня есть, работает большую часть времени, за исключением того, что каждый нечетный столбец целевого шестиугольника к северу от цели смещен на 1. Я знаю, что это звучит сбивающе, но я прикрепил изображение, чтобы объяснить, что я имею в виду:
Как вы, ребята, видите, нижняя половина сетки под целевым шестиугольником и все остальные столбцы над целевым шестиугольником правильные. Я не могу понять почему: S
Вот объяснение Axial & Cube Co-ords.
http://www.redblobgames.com/grids/hexagons/#coordinates
Вот код, отвечающий за преобразование осевых коордов в кубические коорды.
public void setQR(int theQ, int theR){
this.q = theQ;
this.r = theR;
this.x = this.q;
this.z = this.r - (this.q - (this.q&1)) /2;
this.y = -(this.x + this.z);
}
И вот код для определения расстояния.
К вашему сведению, шестиугольники создаются из CentrePoint (CPx, CPy).
private double distance = 0;
public double workOutDistance(Hexagon hexagon, HexagonFood target){
double targetX = target.getCPX();
double targetY = target.getCPY();
double hexagonX = hexagon.getCPX();
double hexagonY = hexagon.getCPY();
double deltaX = (targetX-hexagonX)*-1;
double deltaY = (targetY-hexagonY)*-1;
double deltaXRadius = (deltaX/(SimField.hexSize)/1.5);
double deltaYApothem = (deltaY/(SimField.hexSize/1.155)/2);
hexagon.setQR((int)deltaXRadius, (int)deltaYApothem);
ArrayList<Integer> coords = new ArrayList<>();
coords.add(
Math.abs(hexagon.getX() - target.getX())
);
coords.add(
Math.abs(hexagon.getZ() - target.getZ())
);
coords.add(
Math.abs(hexagon.getY() - target.getY())
);
System.out.println(coords);
distance = Collections.max(coords);
return distance;
}
Кто-нибудь может сказать мне, почему это происходит? Буду очень признателен.
РЕДАКТИРОВАТЬ:
После изменения Int на Double, как было предложено Тимом, я получил это.
https://i.stack.imgur.com/javZb.png
**
РЕШЕНИЕ
**
После экспериментов с полученными ответами эта небольшая настройка решает проблему.
меняя это ..
public void setQR(int theQ, int theR){
this.q = theQ;
this.r = theR;
this.x = this.q;
this.z = this.r - (this.q - (this.q&1)) /2;
this.y = -(this.x + this.z);
}
к этому..
public void setQR(int theQ, int theR){
this.q = theQ;
this.r = theR;
this.x = this.q;
if (this.r>0){
this.z = this.r - (this.q - (this.q&1))/2;
}
else {
this.z = this.r - (this.q + (this.q&1))/2;
}
this.y = -(this.x + this.z);
}
double
не поможет, если причина в том, что предложил Тим. Вместо этого вам придетсяMath.round
. Вы должны убедиться, что значения, которые передаются вsetQR
, действительно верны (и желательно опубликовать MVCE). В любом случае деление с помощью магических констант типа.../1.155
выглядит весьма сомнительным ... - person Marco13   schedule 15.07.2014