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

Why invert method of AffineTransform in Graphics2D throw an error?

反转变换矩阵可能会抛出错误的示例是什么?

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

当不能倒置时,是否表示矩阵相同,所以倒置后的变换矩阵与原变换矩阵相等?

有什么例子吗?

谢谢

不,如果一个变换不能被反转,就意味着它的逆变换根本不存在。

某个变换A的逆变换B必须满足以下条件属性:

B(A(p)) = p   for all points p,

即对 p returns 原始 p 的变换应用逆变换。

现在,一些转换只是没有这个 属性 的转换。例如,缩放为零的仿射变换将平面中所有可能的点变换为一个点;它的逆不能存在,因为它需要将该单个点转换回多个原始点。

API 文档除了说明矩阵可逆当且仅当其行列式非零时,没有说明此异常的原因。

根据实际经验,发生这种情况的最常见原因是当您使用视图变换将视图 window 缩放到视口大小时,并且您的视口大小变为 0(在 x 或 y 维度上).在这种情况下,逆变换并不重要,因为无论如何都不会在您的视口中显示,您应该能够安全地忽略它。

但是,最好先检查一下以防止出现这种异常;您可以检查 getDeterminant() 是否为零——见下文。 实际值 NoninvertibleTransformException 的另一个可能原因可能是原始转换中的 NaN 或无限值;不过,这只是一个猜测——我还没有检查过,API 文档也没有说明任何相关内容。

为防止此异常,您需要检查变换的行列式是否不为零——或者,正如我们在这里讨论的浮点数,您需要检查它不是太小,例如

if (Math.abs(transform.getDeterminant()) < EPS) {
    return; // probably not invertible
}
AffineTransform inverse = transform.invert();

上面 EPS 的确切值取决于您的应用程序,但对于 double 精度,对于大多数情况,像 1.0e-8 这样的值应该足够安全。