Как проверить, перекрываются ли два повернутых прямоугольника
Я хотел бы помочь с проверкой, перекрываются ли два прямоугольника с помощью 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 защищены авторским правом "Регентов Калифорнийского университета" и используются здесь для нераспределенного кода.