2012-11-12 104 views
5

在Scala中實現仿射變換的最佳方式是什麼?似乎沒有任何標準庫或Spire中。 AWT AffineTransformation類是非常可變的,我絕對不想改變Graphics2D類。編寫我自己的函數或將Java類包裝爲函數返回值更有效率,還是已經有適合的Scala函數庫?Scala:仿射變換

編輯:我不認爲基本方程式太難以編碼。併發症似乎增加了90/180/270旋轉的特殊情況,併爲全面的解決方案處理int/double/float轉換。

+1

我建議包AWT的的AffineTransform。這肯定比自己的時間少得多。 – Rogach

回答

2

我同意評論,不要爲自己實施公式而付出努力。

import java.awt.geom.{AffineTransform => JTransform} 

object AffineTransform { 
    implicit def toJava(at: AffineTransform): JTransform = at.toJava 
    implicit def fromJava(j: JTransform): AffineTransform = { 
     import j._ 
     AffineTransform(getScaleX,  getShearY, 
         getShearX,  getScaleY, 
         getTranslateX, getTranslateY) 
    } 
    val identity: AffineTransform = new JTransform() 
} 
final case class AffineTransform(scaleX:  Double, shearY:  Double, 
           shearX:  Double, scaleY:  Double, 
           translateX: Double, translateY: Double) { 

    def toJava: JTransform = new JTransform(scaleX,  shearY, 
              shearX,  scaleY, 
              translateX, translateY) 

    override def toString = "AffineTransform[[" + 
     scaleX + ", " + shearX + ", " + translateX + "], [" + 
     shearY + ", " + scaleY + ", " + translateY + "]]" 

    def scale(sx: Double, sy: Double): AffineTransform = { 
     val j = toJava; j.scale(sx, sy); j 
    } 
    // ... etc 
} 

測試:

AffineTransform.identity.scale(0.5, 1.0) 
+0

這很整齊。沒有理由爲什麼我不能直接實現某些方法,而使用剩餘的Java類。 –