Как проверить, перекрываются ли два повернутых прямоугольника

Я хотел бы помочь с проверкой, перекрываются ли два прямоугольника с помощью Java. Есть формулы, подобные этой формуле (0<AM⋅AB<AB⋅AB)∧(0<AM⋅AD<AD⋅AD) это может проверить, находится ли точка в повернутом прямоугольнике; Я хочу использовать две точки прямоугольника (верхний левый и нижний правый, хотя они могут быть полностью повернуты, чтобы быть верхним правым и нижним левым), чтобы посмотреть, не перекрывается ли он с другим прямоугольником, составленным из двух точек.

Редактировать - это было помечено как дубликат этого, что хорошо, но я также хотел бы использовать двойники в качестве точек на сетке, которая не поддерживается java.awt.Polygon

Поскольку это все еще помечено как дубликат, я поставлю свой ответ здесь: я использовал отсюда класс Polygon2D вместе с PolygonIterator для получения полной функциональности из первого класса, затем я добавил следующий метод во внутренний класс, Double, в Polygon2D

/**
 * Get all points of the polygon
 */
public CustomPoint[] getPoints() {
    int c = getVertexCount();
    CustomPoint[] cp = new CustomPoint[c];
    for (int i = 0; i < c; i++)
        cp[i] = new CustomPoint(getX(i), getY(i));
    return cp;
}

Затем я сделал CustomPoint класс для поддержки функциональности с двойниками

public class CustomPoint {
    public double x = 0;
    public double y = 0;

    public CustomPoint(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public double[] getLocation() {
        return new double[] { x, y };
    }

    public void setLocation(double x, double y) {
        this.x = x;
        this.y = y;
    }

    public void setX(double x) {
        this.x = x;
    }

    public void setY(double y) {
        this.y = y;
    }
}

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

public boolean isPolygonsIntersecting(Polygon2D.Double a, Polygon2D.Double b) {
    for (int x = 0; x < 2; x++) {
        Polygon2D.Double polygon = x == 0 ? a : b;

        for (int i1 = 0; i1 < polygon.getPoints().length; i1++) {
            int i2 = (i1 + 1) % polygon.getPoints().length;
            CustomPoint p1 = polygon.getPoints()[i1];
            CustomPoint p2 = polygon.getPoints()[i2];

            CustomPoint normal = new CustomPoint(p2.y - p1.y, p1.x - p2.x);

            double minA = Double.POSITIVE_INFINITY;
            double maxA = Double.NEGATIVE_INFINITY;

            for (CustomPoint p : a.getPoints()) {
                double projected = normal.x * p.x + normal.y * p.y;

                if (projected < minA)
                    minA = projected;
                if (projected > maxA)
                    maxA = projected;
            }

            double minB = Double.POSITIVE_INFINITY;
            double maxB = Double.NEGATIVE_INFINITY;

            for (CustomPoint p : b.getPoints()) {
                double projected = normal.x * p.x + normal.y * p.y;

                if (projected < minB)
                    minB = projected;
                if (projected > maxB)
                    maxB = projected;
            }

            if (maxA < minB || maxB < minA)
                return false;
        }
    }

    return true;
}

И после всего этого я проверил и подтвердил, что теперь он действительно работает с двойниками. Надеюсь, это поможет всем, у кого была такая же проблема. Также обратите внимание, что классы Polygon2D и PolygonIterator защищены авторским правом "Регентов Калифорнийского университета" и используются здесь для нераспределенного кода.

0 ответов

Другие вопросы по тегам