Определить сторону многоугольника с заданным внутренним углом - PullRequest
2 голосов
/ 12 мая 2019

Я сделал следующую картину, чтобы помочь визуализировать проблему:

image

Вы можете управлять обезьяной, вращая ее. Вы можете перейти к соседним полям, но здесь у меня возникла проблема с вычислением поля для шага.

У обезьяны есть угол, который идет от 0 до 360 градусов, 0 - когда голова поднята. Я хотел бы рассчитать поле соседа с этого угла. (В основном это поле, в котором «смотрит» орангутан). Я храню соседей, а также вершины для каждого многоугольника.

Я пытался со следующей идеей:

Начните половину линии от орангутана, затем вычислите пересечение с каждой стороны многоугольника. Если у нас есть пересечение, то мы знаем две конечные точки. Затем ищите в соседних полях, если одно из них имеет обе точки в своих вершинах, тогда это хорошее.

Equations

Вот код, который я написал:

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;
    }

Но я не получаю правильных результатов, я не знаю, в чем проблема.

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