Как нарисовать абсолютно нестандартную форму в Java?

Самая сложная фигура, поддерживаемая Java2D API, — это отрезок Безье. Предположим, я хочу нарисовать рациональный сегмент (каждая контрольная точка имеет вес, и вся формула рендеринга немного отличается).

Как это сделать?

Можно ли расширить движок рендеринга, чтобы он мог рисовать более сложные фигуры?

ОБНОВЛЕНИЕ

Обычный способ реализации пользовательской фигуры — это реализация Shape. интерфейс. Этот интерфейс имеет ключевые методы для возврата PathIterator пока PathIterator перебирает типы сегментов. Всего 5 типов сегментов. Самый изогнутый из них — SEG_CUBICTO, которая представляет собой стандартную кривую Безье с 4 контрольными точками (в том числе 2 для начала и конца).

Если я применяю линейно-дробное преобразование к кривой Безье, каждая контрольная точка получает вес в качестве дополнения к своим координатам, и кривая Безье превращается в NURBS (не уверен в этом, не смог выучить точную терминологию). В любом случае, формула кривой отличается от Безье.


person Suzan Cioc    schedule 18.11.2013    source источник
comment
Я не эксперт по java2d, но на основе javadocs все формы реализуют интерфейс Shape, поэтому я могу сказать, что это путь, если вы хотите что-то сложное и индивидуальное.   -  person user902383    schedule 18.11.2013
comment
Да, но Shape возвращает PathIterator, а PathIterator возвращает только фиксированное количество типов сегментов, самым сложным из которых является SEG_CUBICTO docs.oracle.com/javase/7/docs/api/java/awt/geom/   -  person Suzan Cioc    schedule 18.11.2013
comment
взгляните на этот пример, возможно, он натолкнет вас на некоторые идеи 82.157.70.109/зеркальные книги/javaexamples/   -  person user902383    schedule 19.11.2013
comment
Обойти это невозможно, ваша реализация Shape должна преобразовывать кривую в последовательность линий, четырехугольников или кубических кривых. Но при наличии достаточно коротких строк нет никакой разницы в поточечной итерации.   -  person Holger    schedule 19.11.2013
comment
@Holger Теоретически можно переопределить или подклассировать некоторые базовые классы рендеринга, как это можно сделать с помощью Sound API.   -  person Suzan Cioc    schedule 20.11.2013
comment
Не совсем. Рендеринг реализован внутри нестандартных пакетов реализации. Вы можете взломать модифицированные классы, но это будет работать только для этой конкретной реализации JVM и, вероятно, сломается в следующей версии. Если у вас есть руки в приложении, выполняющем рендеринг, вы можете предоставить ему методы рендеринга/растеризации. Но это не имеет ничего общего с вашим первоначальным вопросом: «реализация интерфейса Shape».   -  person Holger    schedule 20.11.2013
comment
Нет, мой первоначальный вопрос не об интерфейсе Shape, а о рисовании в целом. Я думал о чем-то вроде звукового API, где, например, вы можете добавить функциональность MP3, добавив некоторые классы в путь к классам и определив некоторые строковые соответствия. Я подумал, что здесь тоже можно подключить пользовательские рендереры...   -  person Suzan Cioc    schedule 20.11.2013
comment
Ничто не мешает выделить буфер изображения и тыкать в произвольные пиксели!   -  person Ernest Friedman-Hill    schedule 20.11.2013
comment
@ErnestFriedman-Hill да, но это будет слишком сложно ... Я хотел бы повторить кубический код Безье и другие. Также я хотел бы сохранить совместимость с библиотеками на основе AWT.   -  person Suzan Cioc    schedule 21.11.2013


Ответы (1)


Вы не можете на самом деле расширить механизм рендеринга: вы можете создавать подклассы Graphics/Graphics2D, но у вас нет контроля над созданием экземпляров, поэтому вы не можете заставить фреймворк рисования передать ваш подкласс методам рисования.

Что вы можете сделать, так это создать реализацию Shape в RationalShape, которая имеет методы, которые рисуют все, что вам нравится, и возвращает PathIterator, который аппроксимирует его с помощью сплайнов Безье. Как пользователь графических программ, таких как Photoshop, я обнаружил, что каждую кривую можно очень хорошо аппроксимировать с помощью сплайнов Безье, я не знаю, насколько сложной будет математика, стоящая за этим приближением.

person lbalazscs    schedule 20.11.2013