Создание составной фигуры в Java 2D - PullRequest
0 голосов
/ 19 января 2010

Используя Java 2D, я скрепил несколько кривых Безье (CubicCurve2D) вместе, чтобы создать «блоб». Проблема, с которой я сейчас сталкиваюсь, заключается в следующем:

  1. Эффективно заполните шарик заданным цветом.
  2. Эффективно определить, находится ли данная точка внутри капли.

Я заметил, что CubicCurve2D реализует Shape, который предоставляет многочисленные contains методы для определения "внутренности" и что Graphics2D способен заполнить Shape через fill(Shape) (который, я считаю, использует Shape s getPathIterator способов сделать это).

Учитывая это, я надеялся, что смогу создать составной Shape, в результате чего мой метод getPathIterator(AffineTransform) просто свяжет базовые PathIterator вместе. Тем не менее, это производит NoSuchElementException, как только моя форма содержит более одного CubicCurve2D. Даже если мне удастся добиться этого, я не уверен, что это будет работать так, как ожидалось, потому что CubicCurve2D всегда заполнено на выпуклой стороне, а мой «шарик» состоит из вогнутых и выпуклых кривых. Проблема «содержит» еще сложнее, так как точка может на законных основаниях находиться внутри объекта, но не внутри какой-либо отдельной кривой.

  • Правильно ли я подхожу к этой проблеме (пытаюсь реализовать Shape?) Или есть идиоматический способ сделать это, о котором я не знаю? Я бы подумал, что проблема составления геометрических фигур будет довольно распространенной.
  • У кого-нибудь есть предложения по решению этой проблемы?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 19 января 2010

Не уверен, что понимаю ваш вопрос, но составные фигуры можно создать с помощью класса java / awt / geom / Area .

1 голос
/ 21 июня 2010

Поиск правильного решения - правильный путь для решения этой проблемы. Если у вас есть набор кривых, которые вы пытаетесь собрать в форму, я бы предложил использовать GeneralPath. Просто добавьте ваши кривые или прямые отрезки, как требуется. Посмотрите на интерфейс, чтобы увидеть различные методы добавления. Также обратите внимание, что вы можете «завершить» форму, соединив последнюю точку с начальной точкой.

Как только путь будет закрыт, существует несколько различных версий функции has (), которые можно использовать, пожалуйста, найдите время, чтобы прочитать каждое из их описаний, так как существуют компромиссы с точки зрения скорости и точности, зависит в вашем заявлении.

Также легко получить фигуру с траектории, заполнить ее, преобразовать и т. Д.

...