# Koordinaten in Koordinatensystem zeichnen



## data89 (11. Mrz 2009)

Hallo,

das Forum sieht ja wirklich super aus - das Logo links oben gefällt mir am Besten .

Also, nun zu meiner Frage ... ich habe von meinem Lehrer eine besondere Aufgabe bekommen (da ich schon alle Aufgaben der nächsten 6 Wochen erledigt habe ^^): ich soll Punkte in ein Koordinatenkreuz eintragen und das Koordinatensystem selbst mit Canvas erstellen. 

Ich habe keine Ahnung, wie ich das ganze maßstabsgetreu darstellen kann. Außerdem habe ich die Koordinaten als double-Wert gegeben mit 6 Nachkommastellen. Dafür weiß ich, dass alle Werte zwischen 0 und 1 liegen. Ich habe mir überlegt, dass ich z.B. ein Koordinatensystem der Breite 1000px erstelle und dies dann verkleinere ... aber das funktioniert nicht so toll!

Außerdem habe ich bis jetzt nur immer in die paintComponent Methode etwas geschrieben, wie g.drawLine(...). Diese "Architektur" kann man doch sicherlich "eleganter" gestalten, oder?

Ich bin dankbar für Eure Kommentare,
data89


----------



## Marco13 (11. Mrz 2009)

Jo, da reichen die Möglichkeiten von einem 50-Zeilen-Pillepallehack bis zu einer 50000-Zeilen-API zum allgemeinstmöglichen Behandeln von Koordinatensystemen....

Du hast zwar was von "Canvas" gesagt, aber auch von paintComponent, und wegen letzterem gehe ich mal davon aus, dass du das in Swing machst.

Der erste Punkt wäre, sich klarzumachen, welche Möglichkeiten das ganze bieten soll. Das fägt bei der Frage nach Mausinteraktion (zoom/pan, Verschieben der Punkte) an, und hört bei der Frage, ob die Koordinatenachsen "hübsch" sein sollen (d.h. sowohl Werte zwischen 0 und 1 als auch zwischen -100000 und 100000 "schön" und mit passenden Unterteilungsstrichen darstellen) noch lange nicht auf...

Wenn's nur darum geht, einmal irgendwelche Punkte zu malen: "BoundingBox" der Punkte berechnen, das ganze auf die Größe der Component hochskalieren, fertig...


----------



## slawaweis (12. Mrz 2009)

@data89
ich weis jetzt nicht, ob Du die ganze Aufgabe selber schreiben sollst, aber in SwingX gibt es eine Komponente JXGraph:

Romain Guy's Weblog: JXGraph in SwingX
JXGraph (SwingLabs JavaDoc)

die für die Darstellung eines Koordinatensystem verwendet werden kann.

Slawa


----------



## Spacerat (12. Mrz 2009)

@slawaweis: Angesichts diesem tollen Feature (JXGraph) kann ich mir recht gut vorstellen, warum der Lehrer von data89 das Koordinatensystem in einem "Canvas" verlangt. Der nette Herr (data89) muß doch beschäftigt werden.
@data89: Ich nehme mal an, das du dich möglicherweise schon mal (oder vllt. auch ausschliesslich) mit Swing befasst hast. Was für Swing "paintComponent()" ist, heisst beim "Canvas" (AWT) schlicht "paint()". Der "Graphics"-Context bleibt allerdings funktionell der gleiche, was bedeutet, das du z.B. "g.drawLine()" auch hier verwenden kannst.


----------



## data89 (12. Mrz 2009)

Vielen Dank für die Antworten!

Also, ein Paar Antworten auf Eure Fragen:

* Es geht hier um einen "Pillepallehack". Die Mausinteraktionen fallen weg und es geht nur darum, eine x-/y-Achse einzuzeichnen (vllt. mit Karo-Raster). Wie schon gesagt, sind die Einzutragenden Punkte zwischen 0 und 1 und immer positiv. Die Achseneinteilung wird im 1/4-Intervall vorgenommen.

Ergo: Ich muss ein Panel/Bereich erstellen, wo ich zwei Achsen, mit jew. 4 Einteilungen (0,25; 0,5; 0,75; 1), einzeichne und dann die gegebenen Punkte aus dem double-Array auslese und einzeichne.

Größte Schwierigkeit dabei (für mich):
* Das Ganze irgendwie maßstabsgetreu hinzubekommen.
* Das Ganze elegant zu implementieren. Nicht immer nur alles in die "paintComponent"-Klasse schreiben ...

Ich arbeite mit SWING, d.h. ich habe eine Klasse DrawPanel, die von JPanel abstammt, in der ich die "paintComponent"-Methode überschreibe. Dass soll aber nicht heißen, dass ich einer von den Oberflächen Menschen bin, die sich nur mit der GUI beschäftigen - ich steige auch mal gerne in den Code ein ;-)

Leider kann ich (und will ich) auch kein fertiges Tool benutzen.

data89


----------



## Marco13 (12. Mrz 2009)

Ja, so viel "maßstab" gibt's dann ja nicht. Wie man die Linien zeichnet ist dir ja an sich klar. So viel gibt's da nicht zu machen, dass man das irgendwie feiner aufteilen müßte. Natürlich könnte/würde man die paintComponent tendenziell so aussehen lassen wie

```
public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    paintAxes(g);
    paintPoints(g);
}
```
aber... das meintest du wohl nicht ... ?!


----------



## data89 (13. Mrz 2009)

Vielen Dank für die Hilfe ... 

Aber was mache ich, wenn ich nun neue Punkte einzeichnen möchte? Irgendetwas mit repaint() - aber was?

Außerdem habe ich noch eine Frage: Angenommen ich würde drei Achsen benötigen müsste ich ja im 3-Dimensionalen Raum arbeiten. Müssen alle 3-D-Frameworks für Java nachträglich installiert werden, oder gibt es da ein "natives"? Oder könnte man ein Koordinatensystem mit Geraden und Ebenen u.U. auch mit 2-D-Grafiken zeichnen?

data89


----------



## 0x7F800000 (13. Mrz 2009)

Punkte: ja, solang's wenige sind
Gerade: geht auch grad so...
Ebenen: wird ein unglaublicher Krampf, weil man nicht mehr direkt erkennen kann, wo vorne und hinten bei der ganzen 3D-Konstruktion sein soll. (ohne z-Buffer schwierig)
Lieber gleich JOGL oder Java3D nehmen (mit jogl habe ich kurz rumgespielt, ist eigentlich ganz lustig, und recht stressfrei) Aber bei Java3D wird wohl das zeichnen vom schwebenden Text (Markierungen) einfacher sein.


----------



## Marco13 (13. Mrz 2009)

Wenn man davon ausgeht, dass diese Component, die das zeichnet, eine Liste der Punkte enthält, die sie zeichnen soll, dann kann man einfach neue Punkte zu dieser Liste hinzufügen und dann "repaint" aufrufen.

Alles was jetzt darüber hinausgeht (und speziell: Alles, was in Richtung 3D geht) verdeutlicht die Berechtigung des ersten Satzes meiner ersten Antwort............


----------



## Spacerat (13. Mrz 2009)

Eine 3D-Softwarelösung gibt's in den JDK-Demos (applet/WireFrame). Die bestätigt das, was Andrey bereits sagte. Ein Krampf wie er im Buche steht. Ansonsten JOGL. Und mit meiner jüngsten Veröffentlichung in diesem Forum sind 3D-Fonts (schwebender Text) auch kein Problem mehr (hier).


----------



## data89 (14. Mrz 2009)

Also, wenn ich 3-D zeichnen möchte, muss ich auf eine solche API zurückgreifen.
Diese APIs müssen doch noch zusätzlich auf dem PC des Anwenders installiert werden, oder??

data89


----------



## 0x7F800000 (14. Mrz 2009)

FatJar hier, Webstart da, fette fortgeschrittene jnlp-Dinger drüben... Ähm, nein, je nach dem wie man es macht, muss der Benutzer eigentlich nichts zusätzliches installieren, geh doch einfach mal auf die JOGL-Demoseite, und schau's dir an: es wird auch sofort laufen, ohne dass du irgendwas suchen und installieren musst: klick->läuft.


----------

