不,如果一個變換不能倒置,這意味着它的逆變換根本不存在。
逆變換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