为什么在Graphics2D中反转AffineTransform的方法会抛出错误?

时间:2015-07-19 08:17:45

标签: java graphics2d affinetransform

反转变换矩阵的例子是什么,它的反转可以抛出错误?

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

当它不能被反转时,这是否意味着矩阵将是相同的,所以反转和原始变换矩阵将是相等的?

请问任何一个例子吗?

由于

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

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

但是,首先检查以防止此异常总是更好;你可以查看getDeterminant()是否为零 - 见下文。 实际价值 NoninvertibleTransformException的另一个可能原因可能是原始变换中的NaN或无限值;这只是一个猜测 - 然而 - 我还没有检查过,API文档也没有说出任何相关内容。

要防止此异常,您需要检查变换的行列式不是零 - 或者,因为我们在这里谈论浮点,您需要检查它是否太小,类似于< / p>

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

上述EPS的确切值取决于您的应用,但对于double精度,1.0e-8之类的内容对于大多数情况应该足够安全。