【问题标题】:Why invert method of AffineTransform in Graphics2D throw an error?为什么 Graphics2D 中 AffineTransform 的反转方法会抛出错误?
【发布时间】:2015-07-19 08:17:45
【问题描述】:

什么是逆变换矩阵的例子,它的逆变换会抛出错误?

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

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

有什么例子吗?

谢谢

【问题讨论】:

    标签: java graphics2d affinetransform


    【解决方案1】:

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

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

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

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

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

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

    根据实际经验,发生这种情况的最常见原因是当您使用视图变换将视图窗口缩放到视口大小时,您的视口大小变为 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 之类的值在大多数情况下应该足够安全。

    【讨论】:

    • 很好的解释。我的比例值不为零,并且始终在 0.001 和 1000 之间。这意味着我在安全区。感谢您的帮助@Franz
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    相关资源
    最近更新 更多