斯卡拉:仿射变换

Ric*_*ver 5 graphics scala java-2d

在Scala中实现仿射变换的最佳方法是什么?标准库或Spire中似乎没有任何内容.AWT AffineTransformation类非常可变,我绝对不想改变Graphics2D类.编写自己的函数或者在返回值函数中包装Java类是否更有效,或者是否已经有一个合适的Scala库?

编辑:我不认为基本方程对代码来说太具挑战性.复杂性似乎是为90/180/270轮换添加特殊情况并处理int/double/float转换以获得全面的解决方案.

0__*_*0__ 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
}
Run Code Online (Sandbox Code Playgroud)

测试:

AffineTransform.identity.scale(0.5, 1.0)
Run Code Online (Sandbox Code Playgroud)