Zusammenfügen von Shapes

Nocana

Mitglied
Ich habe eine Software entwickelt, welche GDS-Dateien visualisiert. Es kann nun vorkommen, dass hier sehr, sehr viele Shapes visualisiert werden müssen (in einer meiner Beispiel-Dateien sind es 1,8 Millionen Shapes).

Beim Zoomen habe ich nun das Problem, das es sehr langsam wird. Wie ich herausgefunden habe, liegt es hauptsächlich gar nicht am Zeichnen, sondern eher an den vielen zu berechnenden affinen Transformationen, welche fürs Zoomen benötigt werden.

Gibt es eine Möglichkeit, mehrere Shapes zu einem Shape zusammenzufügen, so dass ich dann nur noch eine Transformation machen müsste?

Hier ist mein Code-Abschnitt:

Java:
for (Shape shape : shapes)
{
    shape = gdsTransform.createTransformedShape(shape);
            
    if (shape.intersects(getVisibleRect()))
    {
        g2.draw(shape);
    }
}
 

Marco13

Top Contributor
Also das Transformieren an sich ist das aufwändige? Intersects ist auch nicht umsonst, ich frag' nur...
Ob das durch ein Zusammenfügen besser wird, hängt davon ab, was "Zusammenfügen" heißt: 100 disjunkte Shapes in ein Shape zu packen (das dann 100 disjunkte Zusammenhangskomponenten enthält) dürfte nicht viel bringen. Grundsätzlich kann man aber mit Area (Java Platform SE 6) die ganzen CSG-Operationen (add, subtract, or...) auf Shapes durchführen.
 

Nocana

Mitglied
Danke für eure antworten.

@Marco: Was würdest du empfehlen? Ich weiß nicht wirklich, wie ich es verbessern könnte. Wenn du glaubst, dass es eher am intersects liegt, was könnte ich sonst machen? Wollte damit nur erreichen, dass keine sowieso unsichtbaren Strukturen ins leere gezeichnet werden, um Rechenzeit zu sparen.

@Andre: Falls du das meinst, was ich glaube:
Wenn ich das Graphics-Object transformiere, dann hole ich die tatsächlichen Strukturen nicht wirklich heran, sondern vergrößer sie nur.
Das hätte dann bei sehr starken Vergrößerungen die Folge, dass zB sehr sehr kleine Quadrate, welche im Originalgröße nur wie Punkte aussehen, in Vergrößerter Form nur Punkte bleiben. Und das sollte nicht sein, da sonst die Vergrößerung die Originalstrukturen falsch darstellt.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Das Intersects macht Graphics intern schon automatisch (und wahrscheinlich schneller, als wenn man's manuell macht). Hast du Andrés Tipp ausprobiert?
 

Nocana

Mitglied
Das Intersects macht Graphics intern schon automatisch (und wahrscheinlich schneller, als wenn man's manuell macht). Hast du Andrés Tipp ausprobiert?

OK, dass Graphics das automatisch schon macht, wusste ich nicht. Das heißt also, wenn ich ein Shape ins leere zeichne, wird keine zusätzliche Rechenzeit fürs Zeichnen verbraucht?

Also ich habe jetzt mal sowohl die intersect-Befehle rausgeschmissen, als auch Andres Tipp ausprobiert. Das Zoomen bzw. Neuzeichnen der Strukturen dauert immer noch sehr sehr lange (und außerdem werden die Strukturen tatsächlich bei sehr nahem heranzoomen verfälscht dargestellt, wenn ich das Graphics-Objekt anstelle der Shapes transformiere).

Also, da es trotzdem noch langsam ist, auch wenn ich nur eine Transformation mache, weiß ich nun gar nicht mehr, wo ich den Hebel ansetzen könnte :(

Das Problem ist halt, dass es sich, wie schon gesagt, um 1,8 Millionen Shapes handelt, die ich hier auf ein Panel zeichne. Es handelt sich um viele kleine Strukturen, die teilweise sehr dicht beieinander liegen und bei Vollbild sogar (zumindest für den Betrachter) quasi übereinander liegen (eben weil sie so extrem dicht beieinander sind). Ich weiß aber leider nicht, wie ich ausschließen kann, dass viele sinnlose Shapes gezeichnet werden.

Was ich auch komisch finde: Selbst wenn ich sehr nah heranzoome, so dass eigentlich nur noch vielleicht 5-6 Shapes gezeichnet werden müssen (meistens nur einfache Linien), ist das Zeichnen immer noch extem langsam. Deswegen dachte ich, dass das Problem wohl darin liegt, dass hier trotz der nur 5-6 zu zeichnenden Shapes immer noch an 1,8 Millionen Shapes rumgerechnet wird.

Eine Lösung für das Problem fällt mir aber immer noch nicht ein :/
 
S

simon1389

Gast
Hallo Nocana!

Also deine Vermutung, dass trotzdem die 1,8 Millionen Shapes gezeichnet werden ist schon sehr richtig.
Stand vor ein paar Wochen vor genau dem selben Problem und auch die vorgefertigten clip-Methoden erreichen nicht, dass überflüssiges nicht gezeichnet wird (evtl hatte ich clip auch falsch verstanden).

Auf jedenfall macht Graphics das nicht automatisch...
Ich habs einfach selber implementiert und "berechne" sozusagen, ob das zu zeichnende Shape im sichtbaren Bereich liegt und zeichne es erst dann. Spart extrem(!) viel Zeit beim zeichnen.

Ja ich weiß, der Thread ist schon älter, aber ich denke das Problem könnte öfter jemand haben, und dann findet er hier auch eine Lösung ;-)

LG Simon
 

Michael...

Top Contributor
wäre es denn möglich die Shapes auf ein oder mehrere Bilder zu zeichnen und beim Zoomen einfach nur die Bildausschnitte anzuzeigen?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B JTable Zellen zusammenfügen AWT, Swing, JavaFX & SWT 3
GianaSisters 2D-Grafik 2 BufferedImages zusammenfügen wird Schwarz/Weiß AWT, Swing, JavaFX & SWT 10
T 2 Images (jpg) zu einem zusammenfügen - nebeneinander AWT, Swing, JavaFX & SWT 3
M BufferedImages zusammenfügen AWT, Swing, JavaFX & SWT 7
berserkerdq2 Buttons und Shapes sehen ja nach Screengröße klein oder zu groß aus, jemand eine Idee, was man tun kann? AWT, Swing, JavaFX & SWT 1
M Java FX größe der shapes anpassen AWT, Swing, JavaFX & SWT 0
J JavaFX Shapes (Line) erweitern AWT, Swing, JavaFX & SWT 11
J JavaFX Intersect Problem mit Shapes AWT, Swing, JavaFX & SWT 10
S Irgendwie verstehe ich die Winding-Rules bei Shapes nicht :( AWT, Swing, JavaFX & SWT 4
M Swing Shapes setzen AWT, Swing, JavaFX & SWT 4
M 3D-Grafik Denkfehler bei Verschieben von Shapes AWT, Swing, JavaFX & SWT 0
P Swing Shapes in der richtien reihen folge ? AWT, Swing, JavaFX & SWT 3
P Swing Dynamisch zeichnen mit Shapes wie Rectangle2D.Float ? AWT, Swing, JavaFX & SWT 6
4 Shapes Informationen wie Breite usw. mitgeben AWT, Swing, JavaFX & SWT 5
S 2D-Grafik Shapes auf Zeichenfläche gleichmäßig verschieben AWT, Swing, JavaFX & SWT 5
S Wie detektiere ich am schnellsten ob sich 2 Shapes ueberlappen oder nicht? AWT, Swing, JavaFX & SWT 3
L JFreeChart - Line Shapes AWT, Swing, JavaFX & SWT 15
F [Java 1.5] Shapes auf einem JPanel zoomen AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen

Neue Themen


Oben