java - 是否可以在 JavaFX 中实现透视变换?

标签 java graphics javafx transformation

Affine 类作为 JavaFX 中的 Transform 类的扩展。

这让人产生一种错觉,除了仿射之外,还可以有一些类型的变换。

更新

JavaFX 2.xTransform类仅包含特定矩阵元素的 getter,其中包括用于 3D 仿射变换的 3x4 矩阵的 12 个元素。任何类的使用都只能依赖于这些元素,因此任何表示的转换都是仿射的。

这意味着 2.x 版本的设计很糟糕,因为基本类只能表示仿射变换,而 Affine 是它的子类。这是错误的,因为 Affine 应该成为基本类。

JavaFX 8Transform类有更好的设计。除了 getter 之外,它还具有对矩阵元素的索引访问和对 matrix type 的确定。 .它还有 transform() 方法,可以进行实际的转换。

这意味着,该用法既可以依赖于 transform() 方法,也可以依赖于矩阵元素 getter 。

如果能保证JavaFX的所有内部部分都依赖于transform()方法,那么就可以扩展这个类,实现透视变换。它甚至可以在 JavaFX8 的发行版中实现。

问题是:能否保证 JavaFX 仅依赖于 transform() 方法?

最佳答案

是的,数学中有非仿射变换。

不,JavaFX 2.2 Transform 不支持这些非仿射变换类,它们也不受 JavaFX 8 Transform 支持类(class)。在 Transform 类或其任何子类中无法设置执行非仿射变换所需的变换矩阵元素。

您可以申请 PerspectiveTransform到二维节点。有关使用示例,请参阅我对 Stretching Polygon to other Polygon with Java 的回答.

要了解非仿射变换的数学,请参阅 Petzold's explanation .您可以对 2d transforms 使用类似的数学运算.是的,我知道 Petzold 的示例不是 JavaFX 示例。然而,数学仍然成立,您可以通过 PerspectiveTransform 或通过修改 TriangleMesh 中的点将其应用于 JavaFX。使用自定义矩阵定义。

请注意,PerspectiveTransform 的一个限制是拾取(鼠标选择)不起作用。拾取适用于转换后的 TriangleMesh,但网格本身不是一般的 JavaFX 节点,只是阴影面的集合。

关于java - 是否可以在 JavaFX 中实现透视变换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20108005/

相关文章:

python - 如何在迷宫解谜应用中绘制 "trail"

java - 如何在 JavaFX 中创建图例(图表边框中的文本)

JavaFX + Spring boot 实现

java - 这应该是不稳定的还是结果不可预测?

javascript - 在 Javascript 中结束递归

Java 从 MS SQL 切换到 MySQL - 字符集

c++ - DirectX 11中立方体网格的渲染不正确

JavaFx Hello World 问题

java - spring中如何缓存列表?

java - Gradle 源集 : classesDir has been deprecated