问题描述
倒置变换矩阵的倒置会引发错误的示例是什么?
try {
g2.getTransform().invert();
} catch (NoninvertibleTransformException ex) {
ex.printStackTrace();
}
当它不能倒置时,这是否意味着矩阵将相同,因此倒置的变换矩阵和原始的变换矩阵将相等?
有什么例子吗?
谢谢
1楼
不,如果不能反转变换,则意味着它根本不存在逆变换。
某些变换A的逆变换B必须满足以下属性:
B(A(p)) = p for all points p,
即对p??的变换应用逆变换会返回原始p。
现在,某些转换只是没有具有此属性的转换。 例如,缩放为零的仿射变换会将平面中所有可能的点变换为单个点; 它的逆不存在,因为它需要将单个点转换回多个原始点。
API文档没有说明发生此异常的原因,只是声明矩阵的行列式为非零且仅当其为非零时才是可逆的。
根据实际经验,发生这种情况的最常见原因是,当您使用视图变换将视图窗口缩放到视口大小,并且视口大小变为0(x或y维度)时。 在这种情况下,逆变换并不重要,因为无论如何都不会在视口中显示任何内容,因此您应该可以安全地忽略它。
但是,最好先进行检查以防止出现此异常;
您可以检查是否为零-参见下文。
实际值导致NoninvertibleTransformException
另一个可能原因可能是NaN或原始转换中的无穷大值。
但是,这只是一个猜测-我还没有检查过,API文档对此也没说什么。
为防止出现此异常,您需要检查转换的行列式是否不为零-或,正如我们在此处所说的浮点数一样,您需要检查其是否太小,例如
if (Math.abs(transform.getDeterminant()) < EPS) {
return; // probably not invertible
}
AffineTransform inverse = transform.invert();
上面的EPS
的确切值取决于您的应用程序,但是对于double
精度,在大多数情况下,像1.0e-8
这样的东西应该足够安全。