Affine
类作为Transform
类在JavaFX
中的扩展。
这就产生了一种错觉,认为可以有一些类型的变换,而不是仿射。
更新
在JavaFX 2.x
中,Transform
类只包含特定矩阵元素的获取器,其中包含12个用于三维仿射变换的3x4矩阵元素。任何类的使用都只能依赖于这些元素,因此任何表示的转换都是仿射的。
这意味着2.x版本的设计很糟糕,因为基类只能表示仿射转换,而Affine
是它的子类。这是错误的,因为Affine
应该是基本类。
在JavaFX 8
中,Transform
类有较好的设计。除了getter之外,它还对对矩阵元素的访问和对矩阵型的确定进行了索引。另外,它还有transform()
方法,它们可以进行实际的转换。
这意味着,使用既可以依赖transform()
方法,也可以依赖于矩阵元素getter。
如果可以保证JavaFX
的所有内部部分都依赖于transform()
方法,则可以扩展该类并实现透视图转换。也许它甚至可以在JavaFX8
的发布版本中实现。
问题是:能否保证JavaFX
只依赖于transform()
方法?
发布于 2013-11-21 09:10:46
是的,数学中有非仿射变换.
不,JavaFX 2.2变换类不支持这些非仿射转换,JavaFX 8变换类也不支持它们。在transform类或它的任何子类中,没有方法可以设置执行非仿射变换所需的变换矩阵元。
您可以将PerspectiveTransform应用于2D节点。有关使用示例,请参阅我对用Java将多边形拉伸到其他多边形的回答。
要理解非仿射变换的数学,请参阅佩托德的解释。您可以对二维变换使用类似的数学。是的,我知道Petzold的例子不是JavaFX的例子。但是,数学仍然有效,您可以通过一个JavaFX或使用自定义矩阵定义修改TriangleMesh中的点来将其应用于TriangleMesh。
注意,PerspectiveTransform的一个限制是选择(鼠标选择)不起作用。对转换后的TriangleMesh来说,拾取是可行的,但是网格本身并不是一个普通的JavaFX节点,只是一个阴影面的集合。
https://stackoverflow.com/questions/20108005
复制相似问题