2012-11-12 9 views
5

Was ist der beste Weg, um Affine Transformationen in Scala zu implementieren? Es scheint keine in der Standardbibliothek oder in Spire zu geben. Die AWT AffineTransformation Klasse ist furchtbar veränderbar und ich möchte die Graphics2D Klasse definitiv nicht mutieren. Ist es effizienter, eigene zu schreiben oder die Java-Klasse in wertgebende Funktionen einzubinden, oder gibt es bereits eine geeignete Scala-Bibliothek?Scala: Affine Transformationen

Edit: Ich glaube nicht, dass die grundlegenden Gleichungen zu schwierig sind, um zu programmieren. Die Komplikation scheint spezielle Fälle für 90/180/270 Umdrehungen hinzuzufügen und mit Int/Double/Float-Konvertierungen für eine umfassende Lösung umzugehen.

+1

Ich würde vorschlagen, AWTs Affine zu wickeln. Es würde definitiv viel weniger Zeit benötigen, als selbst zu rollen. – Rogach

Antwort

2

Ich stimme dem Kommentar zu, investieren Sie nicht den Aufwand, um die Formeln selbst zu implementieren.

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 
} 

Test:

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

Das ist ordentlich. Und es gibt keinen Grund, warum ich einige Methoden nicht direkt implementieren kann, während ich die Java-Klasse für den Rest verwende. –

Verwandte Themen