Java 为什么图形2D中仿射变换的反转方法会引发错误?

Java 为什么图形2D中仿射变换的反转方法会引发错误?,java,graphics2d,affinetransform,Java,Graphics2d,Affinetransform,什么是一个倒置的变换矩阵的例子,它的倒置可以抛出一个错误 try { g2.getTransform().invert(); } catch (NoninvertibleTransformException ex) { ex.printStackTrace(); } 当它不能反转时,这是否意味着矩阵将是相同的,因此反转的变换矩阵和原始变换矩阵将是相等的 请举个例子好吗 谢谢不,如果一个变换不能反转,这意味着它的逆变换根本不存在 某些变换A的逆变换

什么是一个倒置的变换矩阵的例子,它的倒置可以抛出一个错误

try {
        g2.getTransform().invert();
    } catch (NoninvertibleTransformException ex) {
        ex.printStackTrace();
    }
当它不能反转时,这是否意味着矩阵将是相同的,因此反转的变换矩阵和原始变换矩阵将是相等的

请举个例子好吗


谢谢

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

某些变换A的逆变换B必须满足以下特性:

B(A(p)) = p   for all points p,
i、 e.对p的变换应用逆变换返回原始p

现在,有些变换没有具有此属性的变换。例如,缩放为零的仿射变换将平面中的所有可能点变换为单个点;由于需要将单个点转换回多个原始点,因此其逆矩阵不可能存在

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

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

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

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

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

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

非常好的解释。我的刻度值不是零,并且始终在0.001和1000之间。这意味着我在安全区。谢谢你的帮助@Franz