Swing Straßennetz visualisieren

Soloeco

Aktives Mitglied
Hey,
aktuell arbeite ich an einem etwas größerem Projekt und bräuchte dazu ein paar Denkanstöße.
Und zwar möchte ich ein Straßennetz mit Swing darstellen. Die benötigten Informationen stehen in einem mehrdimensionalen Array, das Auslesen davon ist kein Problem. Doch nun meine Frage, wie schaffe ich es aus den Informationen (Welche Strecke wo hin führt (z.B. A -> B), Länge der Strecke) ein "Netz" darzustellen, was für Methoden, Klassen oder Anderes benötige ich dafür?
Ich habe es bisher mit Points und "drawLine()" versucht, damit kam ich zu einem ersten Ergebnis (siehe Anhang). Allerdings war es, für mich, nicht möglich die Punkte automatisch eintragen zu lassen und daraus ein Netz zu erstellen.
Also wie gesagt, ich brauche nur Ideen, Vorschläge und Anmerkungen. Programmieren würde ich das gerne selbst :)

MfG Soloeco
 

Soloeco

Aktives Mitglied
Moin!
Tut mir leid für die späte Antwort, hier nun der relevante Code.

Java:
Point[] points = new Point[] {
        new Point(300,20),
        new Point(550,150),
        new Point(200,300),
        new Point(300,20),
    };

Hierzu ist meine Frage, wie kann ich automatisiert, sagen wir aus einem Array, anhand von Koordinaten Punkte hinzufügen bzw. ist dies überhaupt möglich?

Java:
private void erzeugeCenter() {
        JPanel netPanel = new JPanel() {

            private static final long serialVersionUID = 1L;

            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g;
                g2d.setColor(Color.BLUE);
                /*
                 * Diese for-Schleife durchläuft alle Punkte.
                 * Start und Ende Koordinaten werden ermittelt und dann mit einer Linie verbunden.
                 */
                for(int i = 0; i < points.length; i++) {
                    if(i < points.length - 1) {
                        Point start = points[i];
                        Point ende = points[i + 1];
                        g2d.drawLine(start.x, start.y, ende.x, ende.y);
                        //g2d.fillRect(start.x - 7, start.y - 7, 14, 14);
                    }
                }
            }
        };
        netPanel.setPreferredSize(new Dimension(500, 500));
        mainFrame.add(netPanel, BorderLayout.CENTER);
    }

Das ist bisher meine Methode um aus den Punkten der vorherigen Methode ein "Netz" zu zeichnen. Jeder Punkt wird durchlaufen und anhand eines Anfangs- und Endpunktes dann miteinander verbunden. Das funktioniert soweit doch ich bin mir nicht sicher ob dies die effizienteste Methode dazu ist. Hier gerne auch Vorschläge :)

Und als Zusatzfrage habe ich im Folgenden eine Methode, die anhand der jeweiligen dpi die Kilometer in Pixel so umrechnet, sodass man theoretisch das angestrebte Netzwerk auf jedem beliebigem Bildschirm aufrufen kann ohne Gefahr zu laufen, dass etwas abgeschnitten ist o.Ä. Meiner Ansicht nach stimmt dies so, jedoch würde ich gerne auf Nummer sicher gehen und hören was ihr dazu meint.

Java:
private int berechneStrecke(int strecke) {
        Toolkit tk = Toolkit.getDefaultToolkit();
        int dpi = tk.getScreenResolution();
       
//        System.out.println("Screen Resolution in dpi: " + dpi);
       
        double laengeInKm = strecke;
        double laengeInInch = laengeInKm * 39370.1; //Ein Kilometer = 39370.1 Inch
       
        double laengeInPixel = laengeInInch * dpi;
//        System.out.println("Strecke von " + laengeInKm + " km in Pixel: " + laengeInPixel);
       
        double zoomFaktor = (tk.getScreenSize().getWidth()*tk.getScreenSize().getHeight())*2; //zoomfaktor für spätere Erweiterungen
        double faktorisierteLaengeInPixel = laengeInPixel / zoomFaktor;
        System.out.println("Strecke von " + laengeInKm + " km in Pixel (faktorisiert): " + (int)faktorisierteLaengeInPixel);
       
        return (int)faktorisierteLaengeInPixel;
    }

Ich weiß manche Variablen Namen sind sehr lang, jedoch dient dies zu meinem eigenen Verständnis und Überblick.

Ich freue mich falls jemand Ideen hat und sie mir mitteilen mag. Danke an alle im Voraus :)
Freundliche Grüße
 

mrBrown

Super-Moderator
Mitarbeiter
Das ist bisher meine Methode um aus den Punkten der vorherigen Methode ein "Netz" zu zeichnen. Jeder Punkt wird durchlaufen und anhand eines Anfangs- und Endpunktes dann miteinander verbunden. Das funktioniert soweit doch ich bin mir nicht sicher ob dies die effizienteste Methode dazu ist. Hier gerne auch Vorschläge :)
Doch, das sieht nach der sinnvollsten Methode aus ;)
Und als Zusatzfrage habe ich im Folgenden eine Methode, die anhand der jeweiligen dpi die Kilometer in Pixel so umrechnet, sodass man theoretisch das angestrebte Netzwerk auf jedem beliebigem Bildschirm aufrufen kann ohne Gefahr zu laufen, dass etwas abgeschnitten ist o.Ä. Meiner Ansicht nach stimmt dies so, jedoch würde ich gerne auf Nummer sicher gehen und hören was ihr dazu meint.
ich würde mit dir Umrechnung in inch sparen, und einfach mit den verfügbaren Pixeln rechnen.

Aus Breite in Pixeln und Breite des Straßennetzes in km sollten den passenden Zoomfaktor errechnen lassen (bzw Höhe, je nachdem)

Ich weiß manche Variablen Namen sind sehr lang, jedoch dient dies zu meinem eigenen Verständnis und Überblick.
Mir gefällt sowas ;P deutlich besser als die üblichen i, j, test, test34424 :D
 

Soloeco

Aktives Mitglied
Vielen Dank, damit hast du bereits sehr vieles beantwortet!

Jedoch eine Frage ist noch offen.
wie kann ich automatisiert, sagen wir aus einem Array, anhand von Koordinaten Punkte hinzufügen
Also angenommen wir haben folgendes:
Code:
int n = 100
und
Code:
int m = 200
. Diese beiden Integer sollen einen Punkt darstellen. Mit welcher Methode kann ich diesen nun automatisiert in
einfügen? Ich möchte nicht, wie bisher, jeden Punkt manuell eintragen müssen, denn falls es später hunderte oder noch mehr sind will das wohl keiner machen.

Mir gefällt sowas ;P
Ja uns würde das vom Prof immer wieder in Kopf geprügelt :D
 

Soloeco

Aktives Mitglied
Super ich versuche es direkt mal, vielen Dank nochmal :)

EDIT: Dann muss ich ja meine "erzeugeCenter()" Methode überarbeiten. Brauche ich zum Durchlaufen der Punkte in der Liste dann einen Iterator? Stehe gerade auf dem Schlauch, sorry xD
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Zum durchlaufen kannst du auch einfach ne normale for-Schleife nehmen, oder alternativ eins for-each-Schleife ;)
 

Soloeco

Aktives Mitglied
Okay eine letzte Frage noch ... Ich habe nun das hier:
Java:
ArrayList<Point> points = new ArrayList<Point>();
Und zum Testen möchte ich diese Liste mit simplen Zahlen füllen und dann auf der Konsole ausgeben lassen.
Befüllen:
Java:
private void test() {
        for(int i = 0; i < 100; i++) {
            points.add(i);
        }
    }
Auslesen:
Java:
ListIterator<Point> litr = points.listIterator();
                while(litr.hasNext()) {
                    Point info = litr.next();
                    System.out.println(info + "");
                }

for(Point p : points) {
                    System.out.println(p);
                }
Ich weiß das Auslesen ist gedoppelt. Frage: Sind Auslesen und die ArrayList richtig? Problem: Beim Befüllen wird mir das "add" unterstrichen mitder Fehlermeldung "The method add(int, Point) in the type ArrayList<Point> is not applicable for the arguments (int)" und damit kann ich nichts anfangen :/
 

CSHW89

Bekanntes Mitglied
Du möchtest eigentlich Punkte zur Liste hinzufügen, übergibst aber nur ein int. Du musst die add-Methode mit einer Punkt-Instanz aufrufen:
Java:
points.add(new Point(x,y));
Grüße
Kevin
 

Ähnliche Java Themen


Oben