2013-11-18 7 views
3

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

Как это осуществить?

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

UPDATE

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

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

+1

Я не эксперт по java2d, но на основе javadocs все фигуры реализуют интерфейс 'Shape', поэтому я мог бы сказать, что это путь, если вы хотите что-то сложное и выполненное на заказ – user902383

+0

Да, но' Shape' возвращает ' PathIterator', в то время как 'PathIterator' возвращает только фиксированное количество сегментов, наиболее сложным из которых является' SEG_CUBICTO' http://docs.oracle.com/javase/7/docs/api/java/awt/geom/PathIterator .html # SEG_CUBICTO –

+0

взгляните на этот пример, может быть, это даст вам некоторые идеи. http://82.157.70.109/mirrorbooks/javaexamples/0596006209_jenut3-chp-12-sect-12.html – user902383

ответ

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^