2015-07-19 58 views
1

倒置变换矩阵的一个例子是什么,它的倒数会抛出一个错误?为什么Graphics2D中AffineTransform的逆方法会抛出一个错误?

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

当不能倒置,这是否意味着矩阵将是相同的,所以倒和原来的变换矩阵将是平等的吗?

请举个例子吗?

感谢

回答

1

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

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

B(A(p)) = p for all points 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

非常好的解释。我的刻度值不是零,而且始终在0.001和1000之间。这意味着我处于安全区域。感谢您的帮助@Franz – Soley

相关问题