为什么 Graphics2D 中 AffineTransform 的 invert 方法会抛出错误?
Why invert method of AffineTransform in Graphics2D throw an error?
反转变换矩阵可能会抛出错误的示例是什么?
try {
g2.getTransform().invert();
} catch (NoninvertibleTransformException ex) {
ex.printStackTrace();
}
当不能倒置时,是否表示矩阵相同,所以倒置后的变换矩阵与原变换矩阵相等?
有什么例子吗?
谢谢
不,如果一个变换不能被反转,就意味着它的逆变换根本不存在。
某个变换A的逆变换B必须满足以下条件属性:
B(A(p)) = p for all points p,
即对 p returns 原始 p 的变换应用逆变换。
现在,一些转换只是没有这个 属性 的转换。例如,缩放为零的仿射变换将平面中所有可能的点变换为一个点;它的逆不能存在,因为它需要将该单个点转换回多个原始点。
API 文档除了说明矩阵可逆当且仅当其行列式非零时,没有说明此异常的原因。
根据实际经验,发生这种情况的最常见原因是当您使用视图变换将视图 window 缩放到视口大小时,并且您的视口大小变为 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
这样的值应该足够安全。
反转变换矩阵可能会抛出错误的示例是什么?
try {
g2.getTransform().invert();
} catch (NoninvertibleTransformException ex) {
ex.printStackTrace();
}
当不能倒置时,是否表示矩阵相同,所以倒置后的变换矩阵与原变换矩阵相等?
有什么例子吗?
谢谢
不,如果一个变换不能被反转,就意味着它的逆变换根本不存在。
某个变换A的逆变换B必须满足以下条件属性:
B(A(p)) = p for all points p,
即对 p returns 原始 p 的变换应用逆变换。
现在,一些转换只是没有这个 属性 的转换。例如,缩放为零的仿射变换将平面中所有可能的点变换为一个点;它的逆不能存在,因为它需要将该单个点转换回多个原始点。
API 文档除了说明矩阵可逆当且仅当其行列式非零时,没有说明此异常的原因。
根据实际经验,发生这种情况的最常见原因是当您使用视图变换将视图 window 缩放到视口大小时,并且您的视口大小变为 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
这样的值应该足够安全。