AffineTransform

AffineTransform

AffineTransform 類表示 2D 仿射變換,它執行從 2D 坐標到其他 2D 坐標的線性映射,保留了線的“直線性”和“平行性”。可以使用一系列平移 (translation)、縮放 (scale)、翻轉 (flip)、旋轉 (rotation) 和錯切 (shear) 來構造仿射變換。

基本介紹

  • 外文名:AffineTransform
  • 表示:2D 仿射變換
  • 作用:處理 90 度旋轉
  • 屬性:轉換
簡介
這樣的坐標變換可以使用一個 3 行乘 3 列的矩陣來表示,最後一列默認為 [ 0 0 1 ]。此矩陣將源坐標 (x,y) 變換為目標坐標 (x',y'),這一過程將坐標視為列向量,並用矩陣乘以坐標向量,步驟如下:
[ x'] [ m00 m01 m02 ] [ x ] [ m00x + m01y + m02 ] [ y'] = [ m10 m11 m12 ] [ y ] = [ m10x + m11y + m12 ] [ 1 ] [ 0 0 1 ] [ 1 ] [ 1 ]
處理 90 度旋轉在 AffineTransform 類的 rotate 方法的一些變數中,雙精度參數指定了以弧度表示的旋轉角度。這些方法為近似 90 度(包括倍數諸如 180、270 和 360 度)的旋轉提供特殊的處理,以便更有效地處理象限旋轉這類常見情形。這種特殊處理可以導致旋轉角度非常接近於 90 度的倍數,從而可以將其視為正好是 90 度的倍數。對於 90 度的小倍數,被視為象限旋轉的角度範圍大約是 0.00000121 度寬。這一節解釋為什麼需要特別小心以及如何實現它。
因為 90 度用弧度表示是 PI/2,而 PI 是無限不循環小數(因此是無理數),所以它不能像用弧度表示的精確雙精度值那樣準確地表示 90 度的倍數。因此,理論上不可以使用 PI 來描述象限旋轉(90、180、270 或 360 度)。雙精度浮點值可以非常接近 PI/2 的非零倍數,但是不夠接近到正弦或餘弦能精確到 0.0、1.0 或 -1.0。只有在 Math.sin(0.0) 的情況下,Math.sin() 和 Math.cos() 實現才相應地返回 0.0。但是,對於接近每個 90 度倍數的某些範圍內的數,相樣的實現卻返回 1.0 和 -1.0,因為正確答案是如此接近 1.0 或 -1.0,以至於雙精度的有效位數無法像表示接近 0.0 的數那樣精確地表示差值。
這些問題歸結為:如果在執行這些基於弧度的旋轉操作期間,使用 Math.sin() 和 Math.cos() 方法直接生成用於矩陣修改的值,那么嚴格來說,得到的變換不能歸類為象限旋轉(即使對於 rotate(Math.PI/2.0) 這樣的簡單情況也是如此),因為執行正弦和餘弦操作而得到的非 0.0 值將造成矩陣的細微變化。如果這些變換不能歸類為象限旋轉,那么試圖根據變換類型最佳化下一步操作的後續代碼會被移交到它最通用的實現中。
因為象限旋轉相當常見,所以在對變換套用旋轉和對坐標套用所得變換時,此類應該快速合理地處理這些情況。為了達到最佳處理,以弧度為單位測量旋轉角度的方法試圖檢測象限旋轉的角度並以這種方式處理它們。因此,如果 Math.sin(theta) 或 Math.cos(theta) 正好返回 1.0 或 -1.0,那么這些方法會將角度 theta 視為象限旋轉。實際經驗證明,此特性可用於 Math.PI/2.0 的小倍數大約 0.0000000211 弧度(0.00000121 度)的範圍。

相關詞條

熱門詞條

聯絡我們