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

标签 java graphics2d affinetransform

什么是反转变换矩阵的示例,其反转可能会引发错误?

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

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

请问有什么例子吗?

谢谢

最佳答案

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

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

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

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

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

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

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

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

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

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

上面 EPS 的确切值取决于您的应用程序,但对于 精度,诸如 1.0e-8 之类的值应该是安全的对于大多数情况来说足够了。

关于java - 为什么 Graphics2D 中 AffineTransform 的 invert 方法会抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31499245/

相关文章:

ios - 用户可读格式的 CGAffineTransform 矩阵

java - 搜索具有特定范围内的属性值的对象的 ArrayList

java - 在单独的方法中使用在构造函数中创建的列表

java - 我可以在Java中将椭圆2D矩形2D之外的其他形状添加到 "Shape"吗?

java - 在 Java 中打印 - 字符距离太近

python - 将一组 x,y 点匹配到另一个已缩放、旋转、平移且缺少元素的集合

java - 在 Excel 工作表中写入内容

java - 如何在Android中检查当前时间是否在未来的时间间隔内?

java - Font.createFont 将文件留在临时目录中

java - 自定义形状旋转问题