不,如果一个变换不能倒置,这意味着它的逆变换根本不存在。
逆变换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.001和1000之间。这意味着我处于安全区域。感谢您的帮助@Franz – Soley