当前位置: 代码迷 >> java >> 为什么Graphics2D中的AffineTransform的invert方法抛出错误?
  详细解决方案

为什么Graphics2D中的AffineTransform的invert方法抛出错误?

热度:82   发布时间:2023-07-31 12:02:35.0

倒置变换矩阵的倒置会引发错误的示例是什么?

try {
        g2.getTransform().invert();
    } catch (NoninvertibleTransformException ex) {
        ex.printStackTrace();
    }

当它不能倒置时,这是否意味着矩阵将相同,因此倒置的变换矩阵和原始的变换矩阵将相等?

有什么例子吗?

谢谢

不,如果不能反转变换,则意味着它根本不存在逆变换。

某些变换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这样的东西应该足够安全。