在Scala中实现仿射变换的最佳方法是什么?在标准库或Spire中似乎没有任何内容。 AWT AffineTransformation类非常可变,我绝对不想对Graphics2D类进行突变。编写自己的类或将Java类包装在值返回函数中是否更有效率,或者已经有合适的Scala库?
编辑:我认为基本方程式对编写代码没有太大挑战。复杂的情况似乎是增加了90/180/270旋转的特殊情况,并处理了int / double / float转换以提供全面的解决方案。
最佳答案
我同意这一评论,不要投入精力自己实施这些公式。
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)