Как реализовать Area.contains (Площадь)?

Есть 2 области (java.awt.geom.Area) область1 и область2. Мне нужно проверить, находится ли область2 внутри области1? (область1 содержит область2).

Я пытался:

areaDelta = (Area)area1.clone();
areaDelta.add(area2);
return areaDelta.equals(area1);

Но он не всегда работает так, как должен (если границы области2 находятся на границах области1, возвращается истина, должна возвращаться ложь).

На самом деле у меня есть 2 полигона (java.awt.Polygon), и мне нужен метод Polygon.contains (Polygon), может быть, это может быть проще для областей.

Любые идеи?

Многоугольники могут быть выпуклыми и невыпуклыми.


person Cenius    schedule 18.01.2012    source источник
comment
Проверьте stackoverflow.com/questions / 4833802 / и stackoverflow.com/questions / 3017872 /   -  person Napte    schedule 18.01.2012
comment
Можете ли вы обойтись без проверки ограничивающего прямоугольника?   -  person Randy    schedule 18.01.2012
comment
Нашел - как это сделать без дополнительных библиотек: сделайте проверку пересечения линий для каждой пары линий многоугольника. Это несложно сделать со стандартной библиотекой java. Но это не самое эффективное решение.   -  person Cenius    schedule 18.01.2012


Ответы (1)


Поскольку у вас есть Polygon.contains (Point), вы можете добиться того, что вам нужно, проверив, находится ли каждая точка вашего второго многоугольника внутри первого многоугольника (я мечтаю о версии JDK, которая реализует все основные потребности программиста, например .NET ).

РЕДАКТИРОВАТЬ: чтобы обработать вогнутые многоугольники, вам сначала нужно разделить многоугольники на выпуклые, а затем вы сможете правильно использовать метод, упомянутый выше. Я использовал два разных алгоритма разложения многоугольников в одном из моих приложений, и я бы посоветовал вам посмотреть на их код:

person Aurelien Ribon    schedule 18.01.2012
comment
Это не работает, потому что многоугольники могут быть как выпуклыми, так и невыпуклыми. Я думал об этом. По поводу заметки - спасибо, но я знаю, кто-то отредактировал мой пост ... - person Cenius; 18.01.2012
comment
Это работает, если вы также проверяете, что каждая вершина первого многоугольника находится вне второго многоугольника. - person Joni; 18.01.2012
comment
Вы также можете преобразовать свои многоугольники в выпуклые, тогда проверка будет тривиальной. Смотрите мою редакцию. - person Aurelien Ribon; 18.01.2012
comment
Спасибо, но это означает полную перезапись стандартной библиотеки (нет функции декомпозиции) или использование дополнительных библиотек. Во всяком случае, работает то, что мне нужно. Я попробую связать это со стандартным java. - person Cenius; 19.01.2012