Если, как вы говорите, в комментариях, вы знаете, что вы всегда будете проверки Line2D
и Rectangle
для столкновения, вы можете использовать intersects
метод Line2D
(см javadoc):
public static void main(String[] args) {
Rectangle rect1 = new Rectangle(0, 0, 100, 100);
Line2D line2 = new Line2D.Double(0, 0, 100, 100);
System.out.println(isColliding(rect1, line2));
}
public static boolean isColliding(Rectangle2D rect1, Line2D line2) {
if (line2 != null) {
return line2.intersects(rect1);
}
return false;
}
Испытание, если линия сталкивается с более общим Area
, сложнее; Я не думаю, что для этого есть метод в библиотеке. Если Area
создан из прямоугольников, вы можете попробовать сохранить массив (или List
) объектов Rectangle
и проверить, пересекается ли линия с любым из них. Другой подход. Вы можете попробовать использовать метод contains
Area
, который проверяет, содержит ли область точку. Если либо Конечная точка Line2D
содержится в Area
, то линия и область сталкиваются. Если обе конечные точки находятся за пределами области, но область состоит из прямых линий (area.isPolygonal()
), вы можете извлечь каждый сегмент линии из многоугольника и проверить, пересекает ли линия каждый сегмент линии. Вы можете сделать это с помощью area.getPathIterator(null)
, а затем использовать что-то вроде этого на полученном пути итератора:
double[] coords = new double[6];
double moveX, moveY, prevX, prevY, newX, newY;
while (!pathIterator.isDone()) {
switch (pathIterator.currentSegment(coords)) {
case PathIterator.SEG_MOVETO:
moveX = coords[0]; moveY = coords[1];
prevX = moveX; prevY = moveY;
break;
case PathIterator.SEG_LINETO:
newX = coords[0]; newY = coords[1];
if ([line2 intersects the line from (prevX,prevY) to (newX,newY)]) {
return true;
}
prevX = newX; prevY = newY;
break;
case PathIterator.SEG_QUADTO:
case PathIterator.SEG_CUBICTO:
throw new RuntimeException("What is a curve doing in my rectangle?");
case PathIterator.SEG_CLOSE:
// go back to the last SEG_MOVETO point, usually the first point
if ([line2 intersects the line from (prevX,prevY) to (moveX,moveY)]) {
return true;
}
prevX = newX; prevY = newY;
break;
}
}
Есть методы в Line2D
, чтобы проверить, пересекает ли отрезок другой.
Примечание: Я не тестировал это вообще. Надеюсь это работает.
Имея в виду, что Line2D действительно только очень тонкий прямоугольник, вы не могли бы использовать это: https://docs.oracle.com/javase/7/docs/api/java/awt/ geom/Area.html # intersects (java.awt.geom.Rectangle2D) – Kon
Попытайтесь, я не знал, что Line2D был прямоугольником, учитывая, что он повернут (справа?) –
@Kon Вы уверены, что 'Line2D' является прямоугольник - т.е. он имеет такое же поведение, как и «Rectangle2D»? Или вы говорите в общем смысле? – ajb