Affine
课程在Transform
中作为扩展JavaFX
课程。
这是一种幻觉,除了仿射之外,还有一些类型的变换。
更新
在JavaFX 2.x
Transform
类中仅包含特定矩阵元素的getter,其中包括用于3D仿射变换的12x3x4矩阵元素。任何类使用都只能依赖于这些元素,因此任何表示的转换都是仿射的。
这意味着2.x版本的设计很糟糕,因为基本类只能代表仿射变换,而Affine
则是它的子类。这是错误的,因为Affine
应该成为基本类。
在JavaFX 8
Transform
课程中有更好的设计。除了getter之外,它还对索引访问矩阵元素并确定matrix type。它还有transform()
个方法,可以进行实际转换。
这意味着,该用法可以依赖于transform()
方法,也可以依赖于矩阵元素getter。
如果可以保证JavaFX
的所有内部部分都依赖于transform()
方法,则可以扩展此类并实现透视转换。甚至可以在JavaFX8
的发布版本中实现。
问题是:可以保证,JavaFX
仅依赖于transform()
方法吗?
答案 0 :(得分:2)
是的,数学中存在非仿射变换。
不,JavaFX 2.2 Transform类不支持这些非仿射变换,JavaFX 8 Transform类也不支持这些非仿射变换。 Transform类或其任何子类中没有办法设置执行非仿射变换所需的变换矩阵元素。
您可以将PerspectiveTransform应用于2D节点。有关使用示例,请参阅我对Stretching Polygon to other Polygon with Java的回答。
要了解非仿射变换的数学运算,请参阅Petzold's explanation。您可以对2d transforms使用类似的数学运算。是的,我意识到Petzold的例子不是JavaFX的例子。但是,数学仍然成立,您可以通过PerspectiveTransform或使用自定义矩阵定义修改TriangleMesh中的点来将其应用于JavaFX。
注意,PerspectiveTransform的限制是拾取(鼠标选择)不起作用。拾取将适用于已转换的TriangleMesh,但网格本身不是一般的JavaFX节点,只是一组阴影面。