2009-08-06 11 views
1

Ich bin neu in der Grafikprogrammierung. Ich versuche ein Programm zu erstellen, mit dem Sie gerichtete Graphen zeichnen können. Für den Anfang habe ich es geschafft, eine Reihe von Rechtecken zu zeichnen (die die Knoten repräsentieren) und habe Schwenk- und Zoomfähigkeiten durch Überschreiben der Paint-Methode in Java gemacht.Zeichnen eines Punktrasters

Dies scheint alles recht gut zu funktionieren, während es nicht zu viele Knoten gibt. Mein Problem ist, wenn es darum geht, ein Punktraster zu zeichnen. Ich benutzen ein einfaches Stück Testcode auf dem ersten, die einen Punktraster mit zwei verschachtelten for-Schleifen überschichtet:

int iPanX = (int) panX; 
int iPanY = (int) panY; 
int a = this.figure.getWidth() - iPanX; 
int b = this.figure.getHeight() - (int) iPanY; 

for (int i = -iPanX; i < a; i += 10) { 
    for (int j = -iPanY; j < b; j += 10) { 
     g.drawLine(i, j, i, j); 
    } 
} 

Dies ermöglicht es mir, um das Raster zu schwenken, aber nicht vergrößern oder verkleinern. Allerdings ist die Leistung beim Panning schrecklich! Ich habe viel gesucht, aber ich glaube, dass ich etwas Offensichtliches vermissen muss, weil ich nichts zu dem Thema finden kann.

Jede Hilfe oder Hinweise würden sehr geschätzt werden.

--Stephen

Antwort

2

Verwenden Sie ein BufferedImage für das Punktraster. Initialisieren Sie es einmal und später nur das Bild, anstatt das Raster immer wieder zu zeichnen.

private init(){ 
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 
    Graphics g = image.getGraphics(); 
    // then draw your grid into g 
} 

public void paint(Graphics g) { 
    g.drawImage(image, 0, 0, null); 
    // then draw the graphs 
} 

und Zoomen leicht erreicht dies mit:

g.drawImage(image, 0, 0, null); // so you paint the grid at a 1:1 resolution 
Graphics2D g2 = (Graphics2D) g; 
g2.scale(zoom, zoom); 
// then draw the rest into g2 instead of g 

die gezoomt Graphics Zeichnung einfügen proportional größere Linienbreite führen usw.

+0

Danke, Leistung hat massiv zugenommen! Es gibt ein paar Macken, die ich ausbügeln muss, aber insgesamt ist es viel besser. Die Lösung, die Sie zum Zoomen anbieten, ist nicht ideal, da dies die Größe des Rasters erhöht, das ich lieber als einzelne Pixel behalten würde. Aktualisiere ich das Raster img auf einem Zoom zu empfangen? – SRoe

+0

Ja, das ist mir später eingefallen. Es hängt davon ab, wie oft Sie erwarten, dass sich der Zoom ändert. Ich denke, du solltest das Rasterbild bei jedem Zoomwechsel aktualisieren. Und in Farbe (g) können Sie das Raster mit einem 1: 1-Zoom zeichnen und dann den Skalierungsfaktor für den Rest der zu malen Objekte einstellen. Ich denke, ich werde das in meiner Antwort aktualisieren. – Stroboskop

2

Ich denke, neu zeichnen alle Punkte jedes Mal, wenn die Maus bewegt wird Sie Performance-Probleme geben. Vielleicht sollten Sie versuchen, einen Schnappschuss der Ansicht als Bitmap zu erstellen und diese dann zu verschieben, indem Sie die Ansicht "richtig" neu zeichnen, wenn der Benutzer die Maustaste loslässt.