2012-11-12 17 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クラスを使用している間に直接いくつかのメソッドを実装できない理由はありません。 –

関連する問題