Я сделал следующую картину, чтобы помочь визуализировать проблему:
Вы можете управлять обезьяной, вращая ее. Вы можете перейти к соседним полям, но здесь у меня возникла проблема с вычислением поля для шага.
У обезьяны есть угол, который идет от 0 до 360 градусов, 0 - когда голова поднята. Я хотел бы рассчитать поле соседа с этого угла. (В основном это поле, в котором «смотрит» орангутан).
Я храню соседей, а также вершины для каждого многоугольника.
Я пытался со следующей идеей:
Начните половину линии от орангутана, затем вычислите пересечение с каждой стороны многоугольника. Если у нас есть пересечение, то мы знаем две конечные точки. Затем ищите в соседних полях, если одно из них имеет обе точки в своих вершинах, тогда это хорошее.
Вот код, который я написал:
public Field getNeighbourByAngle(double angle) {
// Field center
Point2D c = center;
// New point initial coordinates
double x = c.getX(); double y = c.getY()+1;
// Rotate the point by the angle
Point2D rotatedPoint = new Point2D(
-(x*Math.cos(Math.toRadians(angle)) - y*Math.sin(Math.toRadians(angle))),
y*Math.cos(Math.toRadians(angle)) + x*Math.sin(Math.toRadians(angle)) );
// Get the vector from the center to the roteted point
Point2D v = rotatedPoint.subtract(c);
// Iterate over the vertex arraylist
for (int i = 0; i<verts.size(); i++) {
// Get the two endpoints
Point2D p1 = verts.get(i);
Point2D p2;
if (i == verts.size() - 1) {
p2 = verts.get(0);
} else { p2 = verts.get(i+1);}
// Calculate the intersection
// Using the formula:
// x = c.x + v.x * t
// x = p1.x * (1-t) + p2.x * t
// These two are equals, get t from the equation:
double t = ( p1.getX() - c.getX( )) / (v.getX() + p1.getX() - p2.getX() );
// t has to be between [0, 1] because p1 <-> p2 is just a line segment
if (0 <= t && t<= 1) {
// Iterate over the neigbours
for (int j = 0; j<neighbours.size(); j++) {
// If the neigbour has both p1 and p2 in its vertices list, then we found the correct neigbour.
if (neighbours.get(j).getVerts().contains(p1) &&
neighbours.get(j).getVerts().contains(p2)) {
return neighbours.get(j);
}
}
}
}
return null;
}
Но я не получаю правильных результатов, я не знаю, в чем проблема.