Обратите внимание: Я не заинтересован в использовании каких-либо сторонних JAR или AWT в качестве части этого решения. Я делаю все, что в моих силах, чтобы сохранить зависимость от проекта, и я хотел бы сохранить его таким образом. И, если JRE поставляется с любыми классами, которые решают это для меня, меня все еще интересует пользовательское решение, чтобы я мог действительно понять математику, а не просто слепо сделать несколько вызовов API.Вычислить пересечение нескольких 2D-фигур в Java
я иметь следующую структуру POJO для различных форм:
public class Coordinate {
private Double xVal;
private Double yVal;
// Constructors, getters/setters, etc.
public static Double distance(Coordinate c1, Coordinate c2) {
// Calculates the Cartesian distance between c1 and c2 using the standard
// distance formula.
}
}
public abstract class Shape {
// Some properties inherent to all 2D shapes.
public abstract Double calcArea();
public abstract Double calcPerimeter();
}
public class Rectangle extends Shape {
private Coordinate upperLeft;
private Coordinate upperRight;
private Coordinate lowerLeft;
private Coordinate lowerRight;
// Constructors, overrides, getters/setters, etc.
}
public class Circle extends Shape {
private Coordinate center;
private Double radius;
// Constructors, overrides, getters/setters, etc.
}
Теперь то, я будет дан List<Shape>
(смешанный набор, содержащий 0+ Rectangle
с и 0+ Circle
S). Мне нужно, чтобы определить, есть ли какой-либо из форм в этом списке пересекаются друг с другом (истина или ложь):
public boolean intersectionsExist(List<Shape> shapes) {
// ???
}
Я хотел бы реализовать лучшие практики здесь, так что я не знаю, есть ли уже какой-либо алгоритм для этого с (потенциально) десятками фигур. Все фрагменты кода обнаружения пересечений, которые я нашел на SO и в Интернете, были между двумя формами. Но что, если у меня есть 3 прямоугольника и 7 кругов в списке?!?
Мое мышления перебирать каждый Shape
в списке, и сравнить его с любым другой Shape
(отсюда решением квадратичной, который я не в восторге). Но таким образом я мог бы вернуть true
в тот момент, когда я нахожу Shape
, который пересекает с другим.
Что касается обнаружения фактического пересечения, мне интересно, есть ли что-нибудь, что я могу сделать, что касается этих фигур, таких как диаграмма Венна. Смысл, как-то определить, является ли одна форма перекрытием другой. Но как я мог определить «перекрытие», я понятия не имею.
Так несколько вопросов:
- Существуют ли какие-либо стандартные алгоритмы там для обнаружения пересечений между 3+ форм? Если да, может кто-нибудь, пожалуйста, дайте мне некоторые ссылки/информацию о них?
- Если ответ на № 1 выше «нет», то это мое квадратичное решение выше наилучшего пути (двухполюсный
for
-loops, сравнивающий каждыйShape
друг с другом и возвращающийtrue
, когда обнаружено одно пересечение)? Или есть лучший/более эффективный способ? - Самое главное: как определить фактические пересечения? Существуют ли стандартные алгоритмы для этого (ссылки?)? Может ли кто-нибудь представить пример кода (используя мои POJO выше) или даже дать простой пример псевдокода того, что я могу здесь сделать?
Заранее благодарен!
1. Нет, вы можете обнаружить только пересечение двух форм. 2. Ваше квадратичное решение является лучшим. Если у вас 10 объектов, это менее 100 тестов пересечения. Вы не проверяете пересечение формы A с формой A. 3. Используйте методы пересечения (и содержат) формы. Форма - это интерфейс, поэтому Shape будет выбирать конкретные методы пересечения (и содержит). –
Спасибо @GilbertLeBlanc (+1) - какой lib является «Shape» частью? Можете ли вы предоставить ссылку на свой Javadoc? Как только я знаю, где найти исходный код, я немного пошлю его и посмотрю, смогу ли я найти фактический алгоритм «пересекает». Еще раз спасибо! – IAmYourFaja
http://docs.oracle.com/javase/7/docs/api/java/awt/Shape.html –