什么是反转变换矩阵的示例,其反转可能会引发错误?
try {
g2.getTransform().invert();
} catch (NoninvertibleTransformException ex) {
ex.printStackTrace();
}
当它不能反转时,是否意味着矩阵将相同,因此反转后的变换矩阵和原始变换矩阵将相等?
请问有什么例子吗?
谢谢
最佳答案
不,如果一个变换不能反转,则意味着它的逆变换根本不存在。
某个变换 A 的逆变换 B 必须满足以下属性:
B(A(p)) = p for all points p,
即对 p 的变换应用逆变换将返回原始 p。
现在,某些转换只是没有具有此属性的转换。例如,缩放为零的仿射变换将平面中所有可能的点变换为单个点;它的逆不能存在,因为它需要将单个点转换回多个原始点。
API 文档没有说明此异常的原因,只是指出当且仅当其行列式非零时矩阵是可逆的。
从实践经验来看,发生这种情况的最常见原因是当您使用 View 变换将 View 窗口缩放到视口(viewport)大小时,您的视口(viewport)大小变为 0(x 或 y 维度)。在这种情况下,逆变换并不重要,因为无论如何都不会在您的视口(viewport)中显示任何内容,您应该能够安全地忽略它。
但是,最好先检查一下以防止出现此异常;您可以检查是否 getDeterminant()
零——见下文。
实际值
NoninvertibleTransformException
的另一个可能原因可能是原始转换中的 NaN 或无限值;然而,这只是一个猜测——我没有检查过,API 文档也没有对此进行任何说明。
为了防止这种异常,您需要检查变换的行列式是否不为零 - 或者,正如我们在这里讨论浮点一样,您需要检查它是否太小,例如
if (Math.abs(transform.getDeterminant()) < EPS) {
return; // probably not invertible
}
AffineTransform inverse = transform.invert();
上面 EPS
的确切值取决于您的应用程序,但对于 双
精度,诸如 1.0e-8
之类的值应该是安全的对于大多数情况来说足够了。
关于java - 为什么 Graphics2D 中 AffineTransform 的 invert 方法会抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31499245/