2013-11-20 4 views
1

Affine класс сделано как удлинение Transform класс в JavaFX.Возможно ли реализовать преобразование перспективы в JavaFX?

Это создает иллюзию, что могут быть некоторые типы преобразований, отличные от аффинных.

ОБНОВЛЕНИЕ

В JavaFX 2.xTransform класс содержит только геттеры для конкретных матричных элементов, который включает в себя 12 элементов матрицы 3х4 для 3D-аффинное преобразование. Любое использование класса может основываться только на этих элементах, поэтому любое представленное преобразование является аффинным.

Это означает, что версия 2.x имеет плохую конструкцию, потому что базовый класс может представлять только аффинные преобразования, а Affine - это подкласс. Это неправильно, так как Affine должен быть сделан базовым классом.

В JavaFX 8Transform класс имеет лучший дизайн. Дополнительно к геттерам он индексировал доступ к матричным элементам и определению matrix type. Также он имеет методы transform(), которые делают фактическое преобразование.

Это означает, что использование может основываться как на методах transform(), так и на геттерах матричных элементов.

Если можно гарантировать, что все внутренние части JavaFX полагаются на методы transform(), тогда этот класс может быть расширен и может быть реализовано перспективное преобразование. Возможно, он даже может быть реализован в версии версии JavaFX8.

Вопрос в следующем: может ли быть гарантировано, что JavaFX полагается только на transform() методов?

ответ

1

Да, в математике есть неаффинные преобразования.

Нет, эти неаффинные преобразования не поддерживаются классом JavaFX 2.2 Transform и не поддерживаются классом JavaFX 8 Transform. В классе Transform или любом из его подклассов нет способа установить элементы матрицы преобразования, необходимые для выполнения неаффинного преобразования.

Вы можете применить PerspectiveTransform к двумерным узлам. Для примера использования см. Мой ответ на Stretching Polygon to other Polygon with Java.

Чтобы понять математику неаффинных преобразований, см. Petzold's explanation. Вы можете использовать аналогичную математику для 2d transforms. Да, я понимаю, что примеры Петцольда не являются примерами JavaFX. Тем не менее, математика по-прежнему сохраняется, и вы можете применить ее к JavaFX либо с помощью PerspectiveTransform, либо путем изменения точек в TriangleMesh с использованием пользовательского определения матрицы.

Примечание. Ограничение PerspectiveTransform выбирается (выбор мыши) не работает. Выбор будет работать для преобразованного TriangleMesh, но сама сетка не является общим узлом JavaFX, а просто набором затененных лиц.

+1

Если я не могу расширить 'Transform' для получения неаффинного преобразования, тогда иерархия классов неверна в JavaFX, правильно? Они должны делать «Affine» в качестве базы, а другие - как потомки. –

+0

Я думаю, что иерархия правильная. В Transform в качестве основы будущая версия (например, Java 9) может расширить Transform с помощью подкласса NonAffineTransform, но если Affine был root, то это не имеет смысла. – jewelsea

+0

Итак, можно расширить 'Transform' до некоторого неаффинного? –