2016-05-11 7 views
-1

Ich habe eine einfache Klasse, die ein Diagramm darstellt, und es zeichnet derzeit nur Linien. Ich bin gerade dabei, Liniendefinitionen vor dem Zeichnen abzufangen und ihre Punkte zu ändern, aber jetzt möchte ich komplexere Formen mit mehr als nur Punktdefinitionen hinzufügen. Ich weiß über affinetransform, aber ich bin mir nicht sicher, wie man es benutzt. Ich möchte eine Transformation äquivalent zu:Einfache Punkt Transformation (Graphics2D)

private Point transform(PlasmaPoint2D plasmaPoint2D) { 
     double x = plasmaPoint2D.getX(); 
     double y = plasmaPoint2D.getY(); 
     Point p = new Point(); 
     p.setLocation(x * this.gridScale/this.scale + this.gridScale, y * this.gridScale/this.scale + this.gridScale); 
     return p; 
    } 

(Wo PlasmaPoint2D ist meine eigene, unveränderlich, Version Point2D). gridScale ist eine Instanzvariable, die die Anzahl der Pixel zwischen jeder Rasterlinie angibt, und scale ist die Anzahl der Einheiten, die von einer einzelnen Rasterbox dargestellt werden.

Ich bin nicht sicher, wie dies in AffineTransform zu implementieren, so dass jede Hilfe geschätzt wird.

+0

Affine (getRotateInstance() verwendet wird) nicht Bewegen Sie die Punkte selbst, es teilt einem Grafikobjekt mit, wie die Punkte mit einer Drehung gezeichnet werden. –

+0

Gibt es eine Möglichkeit, ein Bewegungspunktverhalten festzulegen? –

+0

Linien und Bögen. Ich wäre bereit, herauszufinden, wie ich diese einfach umwandeln kann, aber ich hätte lieber eine allgemeine Lösung. –

Antwort

0

Wenn eine Transformation aus dem Menü-Transformation ausgewählt wird, die Transformation auf die Affine konkateniert wird unter:

public void setTrans(int transIndex) { 
    // Sets the AffineTransform. 
    switch (transIndex) { 
    case 0 : 
     at.setToIdentity(); 
     at.translate(w/2, h/2); 
     break; 
    case 1 : 
     at.rotate(Math.toRadians(45)); 
     break; 
    case 2 : 
     at.scale(0.5, 0.5); 
     break; 
    case 3 : 
     at.shear(0.5, 0.0); 
     break; 
    } 
} 

Bevor die Form Anzeige der Menüoptionen entspricht, wobei die Anwendung ruft zuerst Transformation der Strom von der Graphics2D Objekt:

AffineTransform saveXform = g2.getTransform(); 

Nachdem der aktuelle Transformations Abrufen, eine andere Affine, toCenterAt, erzeugt, die bewirkt, dass Formen in der Mitte der Platte wiedergegeben werden. Der bei Affine wird auf toCenterAt verketteten:

AffineTransform toCenterAt = new AffineTransform(); 
toCenterAt.concatenate(at); 
toCenterAt.translate(-(r.width/2), -(r.height/2)); 

Die toCenterAt Transformation wird auf die Graphics2D mit der Transformationsmethode transformieren verketteten:

g2.transform(toCenterAt); 

nach dem Rendern abgeschlossen ist, transformiert das Original der setTransform Verfahren wieder hergestellt wird unter Verwendung von :

g2.setTransform(saveXform); 
+0

Das klingt wie eine Beschreibung von einer anderen Klasse, ich verstehe es nicht ganz. –

0

sagen, dass ich ein Quad-Kurve haben:

QuadCurve2D.Double c2=new QuadCurve2D.Double(p[j][0], p[j][1], 
    p[j+1][0], p[j+1][1], p[j+2][0], p[j+2][1]); 
int translatebyx=x * this.gridScale/this.scale + this.gridScale-c2.getX1(), 
    translatebyy=y * this.gridScale/this.scale + this.gridScale-c2.getY1(), 
    AffineTransform at=AffineTransform.getTranslateInstance(translatebyx, translatebyy); 
    Shape s=at.createTransformedShape(c2); 
    g2.draw(s); 

, wo ich zu einem bestimmten Ort übersetzen möchten, wie Sie

x * this.gridScale/this.scale + this.gridScale, 
y * this.gridScale/this.scale + this.gridScale 

angeben Wenn Sie Drehung ausführen möchten wenden Sie die gleiche Prozedur usw.

Verwandte Themen