2012-11-12 12 views
5

Sine'de Affine Transformations'ı uygulamanın en iyi yolu nedir? Standart kütüphanede ya da Spire'de hiç yok gibi görünüyor. AWT AffineTransformation sınıfı, korkunç bir şekilde değiştirilebilir ve kesinlikle Graphics2D sınıfını değiştirmek istemiyorum. Kendi kendime yazmam veya Java sınıfını geri dönen fonksiyonlara sarmak daha mı verimli, yoksa zaten uygun bir Scala kütüphanesi var mı?Scala: Afine Dönüşümler

Düzenleme: Temel denklemlerin kod yazmak çok zor olduğunu sanmıyorum. Komplikasyon, kapsamlı bir çözüm için 90/180/270 rotasyonlar ve int/double/float dönüşümleri ile ilgili özel durumlar ekleniyor gibi görünüyor.

+1

. Kendi yuvarlanmadan kesinlikle daha az zaman alır. – Rogach

cevap

2

Yorumu kabul ediyorum, formülleri kendiniz uygulamak için çaba sarf etmeyin.

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 
} 

Testi: Ben AWT en AffineTransform sarmak için öneririm

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

Bu temiz. Kalanlar için Java sınıfını kullanırken bazı yöntemleri doğrudan uygulayamama sebep yok. –