2015-07-19 63 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

相關問題