5

Scalaでアフィン変換を実装する最良の方法は何ですか? 標準ライブラリやSpireにはないようです。AWT AffineTransformation クラスは恐ろしく変更可能であり、Graphics2D クラスを変更したくはありません。独自に作成するか、値を返す関数で Java クラスをラップする方が効率的ですか? または、適切な Scala ライブラリが既に存在しますか?

編集: 基本的な方程式をコーディングするのが難しすぎるとは思いません。複雑さは、90/180/270 回転の特殊なケースを追加し、包括的なソリューションのために int/double/float 変換を処理しているようです。

4

1 に答える 1

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)
于 2012-11-13T00:37:18.467 に答える