Methoden Methoden anpassen und fehlende Funktionen hinzufügen

mihe7

Top Contributor
Ich würde mal ganz einfach anfangen:
Java:
return switchedTo.equals(passed) ? getStartPoint() : switchedTo;
 

DagobertDuck

Bekanntes Mitglied
Danke, ich habe die Funktion der Methode falsch verstanden... Das war jetzt ja wirklich nicht so schwierig.

Leider Gottes funktioniert der besagte Beispielablauf immer noch nicht. Ich blicke hier leider nicht mehr so richtig durch und das Debuggen macht das ganze in diesem Fall leider auch nicht wirklich leichte für mich. Kannst du einen Fehler erkennen...? Hier sind einmal die Durchläufe bis zur Fehlermeldung:
Screenshot 2020-02-27 at 21.28.58.png

Screenshot 2020-02-27 at 21.29.07.png
screenshot-2020-02-27-at-21-30-08-png.13092


Was läuft hier noch schief...? Es kann durchaus sein, dass es immer noch etwas mit der Länge zu tun hat, die eventuell falsch dekrementiert wird.
 

Anhänge

  • Screenshot 2020-02-27 at 21.30.08.png
    Screenshot 2020-02-27 at 21.30.08.png
    122,7 KB · Aufrufe: 368

DagobertDuck

Bekanntes Mitglied
return switchedTo.equals(passed) ? getStartPoint().directionTo(switchedTo) : switchedTo.directionTo(getStartPoint());
Das kann so nicht stimmen, oder?
Meinst du:
Java:
    public Point getDirectionTo(Point passed) {
        return switchedTo.equals(passed) ? toDirection(switchedTo) : toDirection(getStartPoint());
    }
Es geht nur so, da die Methode in der Klasse Track ist. Ist das so denn richtig? Der Beispielablauf funktioniert nämlich leider immer noch nicht und ich bekomme denselben Fehler.
 

mihe7

Top Contributor
Ja, genau. Wir suchen ja von einem Punkt auf einem Track ausgehend immer den vorherigen Endpunkt (und damit den vorherigen Track), wobei "vorherig" durch die Fahrtrichtung bestimmt ist. Nun ist die Fahrtrichtung auf verschiedenen Abschnitten des Netzes aber nicht identisch mit der Fahrtrichtung der Lok. Daher müssen wir für den jeweiligen Track die Fahrtrichtung bestimmen.
 

DagobertDuck

Bekanntes Mitglied
findTrack scheint richtig zu funktionieren und auch dein Ablauf aus #178 ist identisch mit meinem. Allerdings kommt es dann beim zweiten/dritten offenbar zu Problemen die mir noch nicht ersichtlich sind... Ich weiß nicht was ich noch tun soll.
 

mihe7

Top Contributor
Wenn der Ablauf zu #178 identisch ist, dann bekommst Du "no connection to track found" und dort ist auch angegeben, was zu tun ist (s. #172)
 

DagobertDuck

Bekanntes Mitglied
while: length == 2 > 0, also wird der Schleifenrumpf ausgeführt
requiredTracks enthält currentTrack (1,1,5,1) nicht -> requiredTracks = {(5,1,8,1), (1,1,5,1)}
passed = (1,1)
length = length - position.distanceTo(passed) = length - 4 = -2
getConnection(passed, currentTrack) liefert null -> Fehler
Sorry, das war etwas falsch ausgedrückt. Für length == 1 stimmt der Ablauf überein aber ab length == 2 ist er anders.

Screenshot 2020-02-27 at 23.39.38.png
Die zweite Iteration macht für mich noch Sinn und es scheint alles zu stimmen.

Screenshot 2020-02-27 at 23.39.52.png
Darf diese Iteration überhaupt noch stattfinden...? Ich meine jetzt ist currentTrack Element von requiredTracks und daher kommt es zur Exception.
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Die zweite Iteration macht für mich noch Sinn und es scheint alles zu stimmen.
Für mich macht da eigentlich gar nichts Sinn: getConnection müsste in der zweiten Iteration null liefern, die Richtung (1,1) ist totaler Quatsch. Da stimmt hinten und vorne nichts. Du musst Zeile für Zeile genau schauen, welche Werte Du erwartest und was tatsächlich rauskommt.
 

DagobertDuck

Bekanntes Mitglied
Danke, dann werde ich das morgen noch mal in Ruhe durchgehen. Aber wieso sollte getConnection in der zweiten iteration null liefern? Dann würde ja eine exception geworfen werden. Die Eingabe sollte aber valide sein und der Zug aufgegleist werden.
 

mihe7

Top Contributor
Aber wieso sollte getConnection in der zweiten iteration null liefern?
Weil es keinen Track mehr gibt?!?

Es gibt zwei Tracks (1,1,5,1) und (5,1,8,1), Du beginnst beim Track (5,1,8,1), dann liefert die erste Iteration den "Vorgängertrack", also (1,1,5,1). In der zweiten Iteration gibt es keinen Vorgängertrack, also muss getConnection null liefern.

Dann würde ja eine exception geworfen werden.
Ja, s. #215 und #172.
 

DagobertDuck

Bekanntes Mitglied
Danke, jetzt funktioniert zumindest dieser Ablauf. Bei folgendem Ablauf sieht das allerdings noch anders aus (wenn der Zug auf ein Eckpunkt gesetzt wird):

add track (1,1) -> (5,1) add track (1,-3) -> (1,1) create engine steam T3 Emma 3 false true add train 1 T3-Emma put train 1 at (1,1) in direction 1,0 Error, directions do not match

Hier wird ein Fehler ausgegeben, obwohl der Zug aufgegleist werden soll.

Der letzte Durchgang von getPassedPoint
Screenshot 2020-02-28 at 02.07.12.png

Stimmt mit dir hier alles...?
Screenshot 2020-02-28 at 02.12.49.png
 

Mika34

Bekanntes Mitglied
Danke, jetzt funktioniert zumindest dieser Ablauf. Bei folgendem Ablauf sieht das allerdings noch anders aus (wenn der Zug auf ein Eckpunkt gesetzt wird):

add track (1,1) -> (5,1) add track (1,-3) -> (1,1) create engine steam T3 Emma 3 false true add train 1 T3-Emma put train 1 at (1,1) in direction 1,0 Error, directions do not match

Hier wird ein Fehler ausgegeben, obwohl der Zug aufgegleist werden soll.

Der letzte Durchgang von getPassedPoint
Anhang anzeigen 13096

Stimmt mit dir hier alles...?
Anhang anzeigen 13097
Was hast du bei der getConnection abgeändert, das es bei dir geklappt hat?
 

DagobertDuck

Bekanntes Mitglied
Also, passed wird als (1,1) übergeben
Screenshot 2020-02-28 at 02.35.51.png

und dann wird mittels currentTrack.getDirectionTo(passed) (1,-1) berechnet und dir zugewiesen
Screenshot 2020-02-28 at 02.36.12.png

Dann hapert es wohl an currentTrack und somit an getConnection, oder?? Ich blicke hier langsam nicht mehr durch ^^
 

DagobertDuck

Bekanntes Mitglied
Du hast den Code doch so bestätigt, oder nicht:
Java:
    public Point getDirectionTo(Point passed) {
        return switchedTo.equals(passed) ? toDirection(getStartPoint()) : toDirection(switchedTo);
    }
 

Mika34

Bekanntes Mitglied
Die ergibt aber auch keinen Sinn, dann ist im letzten Durchlauf der Richtungsvektor (0,1) und nach oben fahren wird der Zug bestimmt nicht ...
Java:
    public CartesianPoint getDirectionTo(CartesianPoint passed) {
        CartesianPoint directionVectorOfTracks = null;
        if(startXCoordiante == passed.getXCoordinate()) {
            if(startXCoordiante < passed.getXCoordinate()) {
                directionVectorOfTracks = new CartesianPoint(-1, 0);
            }
            else {
            
            directionVectorOfTracks = new CartesianPoint(1, 0);
            }
        }
        else if(startYCoordiante == passed.getYCoordinate()) {
            if(startYCoordiante < passed.getYCoordinate()) {
                directionVectorOfTracks = new CartesianPoint(0, -1);

            }
            else {
                directionVectorOfTracks = new CartesianPoint(0, 1);

            }
            

        }
        return directionVectorOfTracks;
    }
 

Mika34

Bekanntes Mitglied
Aber ein Startpunkt kann ein Endpunkt sein und genauso gut auch umgekehrt. Wie soll man da auf eindeutige Richtungsvektoren kommen
 

mihe7

Top Contributor
Aber ein Startpunkt kann ein Endpunkt sein und genauso gut auch umgekehrt. Wie soll man da auf eindeutige Richtungsvektoren kommen

Startpunkt = (1,1)
switchedTo = (5,1)

passed = (5,1) => Zug fährt von (1,1) nach (5,1), Vektor (5-1,1-1)=(4,0), normiert (1,0)
passed = (1,1) => Zug fährt Zug (5,1) nach (1,1), Vektor (1-5,1-1) = (-4,0), normiert (-1,0)

Nachtrag:

Allgemein:
passed = switchedTo => Zug fährt von Startpunkt zu switchedTo => Vektor bilden => normieren
passed != switchedTo => Zug fährt von switchedTo zu Startpunkt => Vektor bilden => normieren.
 

DagobertDuck

Bekanntes Mitglied
Nein, ich habe in #205 geschrieben, dass Du den Richtungsvektor von Startpunkt -> switchTo brauchst oder umgekehrt. Du normierst ja einfach nur den StartPunkt oder switchTo.
Und wie mache ich das dann am besten? Irgendwie hiermit?
Java:
        int firstDirComp = getStartPoint().getFirstComponent() - switchedTo.getFirstComponent();
        int secondDirComp = getStartPoint().getSecondComponent() - switchedTo.getSecondComponent();
        ...
 

Mika34

Bekanntes Mitglied
Oder doch in die Richtung?
Java:
    public CartesianPoint getDirectionTo(CartesianPoint passed) {
        CartesianPoint directionVectorOfTracks = null;
        if(startXCoordiante == passed.getXCoordinate()) {
            if(startXCoordiante < passed.getXCoordinate()) {
                directionVectorOfTracks = new CartesianPoint(-1, 0);
            }
            else {
            
            directionVectorOfTracks = new CartesianPoint(1, 0);
            }
        }
        else if(startYCoordiante == passed.getYCoordinate()) {
            if(startYCoordiante < passed.getYCoordinate()) {
                directionVectorOfTracks = new CartesianPoint(0, -1);

            }
            else {
                directionVectorOfTracks = new CartesianPoint(0, 1);

            }
            

        }
        return directionVectorOfTracks;
    }
 

mihe7

Top Contributor
Und wie mache ich das dann am besten?
Am besten spendierst Du Point ein paar Methoden, damit Du den Käse nicht an jeder Ecke neu schreiben musst:
Java:
public Point vectorTo(Point p) {
    return new Point(p.x - x, p.y - y);
}

public Point negate() {
     return new Point(-x, -y);
}

Zusammen mit der hoffentlich bereits vorhandenen Methode aus #72 (Point#toDirection):
Java:
public Point toDirection() {
    return new Point((int)Math.signum(x), (int)Math.signum(y));
}

kannst Du dann einfach schreiben:
Java:
Point dir = getStartPoint().vectorTo(switchedTo).toDirection();
return passed.equals(switchedTo) ? dir : dir.negate();


Bearbeitung in Farbe
 

mihe7

Top Contributor
Oder doch in die Richtung?
Java:
    public CartesianPoint getDirectionTo(CartesianPoint passed) {
        CartesianPoint directionVectorOfTracks = null;
        if(startXCoordiante == passed.getXCoordinate()) {
            if(startXCoordiante < passed.getXCoordinate()) {
Wie soll die zweite Bedingung jemals true werden?!? (weiter habe ich mir die Methode nicht angesehen)
 

DagobertDuck

Bekanntes Mitglied
Danke @mihe7. Jetzt bekomme ich jedenfalls eine NPE:
Exception in thread "main" java.lang.NullPointerException
...getRequiredTracks(RailNetwork.java:253)
...putTrain(RailNetwork.java:277)
...
Screenshot 2020-02-28 at 03.26.58.png
Screenshot 2020-02-28 at 03.27.03.png
Screenshot 2020-02-28 at 03.28.09.png
Wo liegt denn jetzt das Problem :confused: .
 

Mika34

Bekanntes Mitglied
Am besten spendierst Du Point ein paar Methoden, damit Du den Käse nicht an jeder Ecke neu schreiben musst:
Java:
public Point vectorTo(Point p) {
    return new Point(p.x - x, p.y - y);
}

public Point negate() {
     return new Point(-x, -y);
}

Zusammen mit der hoffentlich bereits vorhandenen Methode aus #72 (Point#toDirection):
Java:
public Point toDirection() {
    return new Point((int)Math.signum(x), (int)Math.signum(y));
}

kannst Du dann einfach schreiben:
Java:
Point dir = getStartPoint().vectorTo(switchedTo).toDirection();
return passed.equals(switchedTo) ? dir : dir.negate();


Bearbeitung in Farbe
Auch nochmal vielen Dank von mir
 

DagobertDuck

Bekanntes Mitglied
@mihe7
Java:
            if (currentTrack != null) {
                dir = currentTrack.getDirectionTo(passed);
            }
Die If-Abfrage hat das Problem behoben. Ist das so in Ordnung oder wird dadurch etwas anderes "zerstört"?
 

Mika34

Bekanntes Mitglied
@mihe7
Java:
            if (currentTrack != null) {
                dir = currentTrack.getDirectionTo(passed);
            }
Die If-Abfrage hat das Problem behoben. Ist das so in Ordnung oder wird dadurch etwas anderes "zerstört"?
Es Läuft auf jeden Fall etwas mit dem getDirectionTo schief, da es auf Horizontalen und Vertikalen Strecken funktioniert, also das Aufgleisen. Wird jedoch über eine Ecke versucht aufzugleisen, dann schmeißt er einen Error
 

Mika34

Bekanntes Mitglied
Denn, desto weiter ich den Zug weiter nach rechts positioniere, also weg von der Kreuzung, dann klappt das. getPassedPoint() und den passedPoint() ist auch richtig, der gibt (1,1) zurück. Und dir = currentTrack.getDirectionTo(passed); stimmt auch, weil der mir (0,-1) zurückgibt
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Methoden methoden an generischen klassentyp anpassen Allgemeine Java-Themen 5
B Leere vererbte Interface-Methoden Allgemeine Java-Themen 8
R Programm führt Methoden gleichzeitig aus Allgemeine Java-Themen 2
Encera Unterschied zweier "toString"-Methoden Allgemeine Java-Themen 1
torresbig Klasse mit extends Calendar über Methoden ändern (Hirnblockade) Allgemeine Java-Themen 7
Sachinbhatt Sind alle Methoden in Java implizit virtuell Allgemeine Java-Themen 2
B Arrays von Methoden möglich? Allgemeine Java-Themen 44
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
N abstracte klassen methoden Allgemeine Java-Themen 32
G Methoden für die Zukunft sinnvoll? Allgemeine Java-Themen 4
nonickatall Methoden Kann man Klassen/Methoden aus Variablen heraus aufrufen? Allgemeine Java-Themen 6
LimDul Hä? Lambda-Ausdruck geht, Methoden-Referenz nicht Allgemeine Java-Themen 8
B Methoden Java Getter und Setter Methoden Allgemeine Java-Themen 9
Y Java Methoden unterschiedliche Zahlenreihen Allgemeine Java-Themen 2
S Interface Design von HookUp oder Callback Methoden für eigenes Framework Allgemeine Java-Themen 9
F Sich automatisch aufrufende Java-Methoden Allgemeine Java-Themen 2
J Namen von Methoden über Reguläre Ausdrücke bearbeiten Allgemeine Java-Themen 6
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
R Statistische Methoden (Mathematik) Aufgabe Allgemeine Java-Themen 9
X Brüche kürzen mittels Methoden und ggT Allgemeine Java-Themen 15
L Operatoren Java Reflections: Alle Methoden einer Klasse aufrufen ohne Exceptions Allgemeine Java-Themen 5
L mehrere Methoden Allgemeine Java-Themen 19
KeexZDeveoper Zugriff auf Methoden vom Server Allgemeine Java-Themen 7
B StAX Parser - mehrere Methoden, ein XML Allgemeine Java-Themen 4
F Operationen/Methoden einen WebService im Browser mit Apache Axis aufrufen Allgemeine Java-Themen 4
A Automatisches Methoden Laufzeiten logging? Allgemeine Java-Themen 7
M Quellcode von Java-Methoden Allgemeine Java-Themen 9
rentasad Design-Frage - Interfaces, Klassen, statische Methoden Allgemeine Java-Themen 3
N HashMap und Methoden richtig einbinden Allgemeine Java-Themen 2
R Variable durch mehrere Methoden ändern und nutzen Allgemeine Java-Themen 17
Q-bert Methoden Methoden in Java Allgemeine Java-Themen 13
D Methoden Java-Aufgabe Allgemeine Java-Themen 2
M Compiler-Fehler Methoden-Referenz Allgemeine Java-Themen 5
X Threads Externe Variablen in Run Methoden verändern Allgemeine Java-Themen 4
S 2 methoden mit gleichen namen und ein Interface Allgemeine Java-Themen 9
F Enum-werte als Methoden-Parameter übergeben Allgemeine Java-Themen 6
N Vererbung Design-Problem mit vorhandenen, von der Klasse unabhängigen Methoden Allgemeine Java-Themen 12
E OOP Objekte und Methoden Allgemeine Java-Themen 1
K Java ruft Methoden nicht der Reihe nach auf Allgemeine Java-Themen 14
N Methoden Methoden einer Klasse auf Grundlage eines Strings aufrufen Allgemeine Java-Themen 6
T Java Array in Methoden Allgemeine Java-Themen 1
D Code für bereitgestellte Methoden Allgemeine Java-Themen 1
P Entity Objekt Methoden vs Service methoden Allgemeine Java-Themen 2
R Signatur von Methoden in eine Datei schreiben? Allgemeine Java-Themen 4
A Methoden verändern Allgemeine Java-Themen 12
F Methoden Arraylist weiterverwenden nach methoden Aufruf Allgemeine Java-Themen 2
J Best Practice Testen von protected Methoden Allgemeine Java-Themen 7
L Methoden "Schiffe versenken" Quellcode in Methoden umwandeln Allgemeine Java-Themen 6
G Matrix reduzieren zwei Methoden Allgemeine Java-Themen 2
Sogomn Best Practice "Doppelte" Methoden Allgemeine Java-Themen 3
Paul15 String Methoden Allgemeine Java-Themen 7
G Methoden BMI -Wert Aufgabe(Methoden) Allgemeine Java-Themen 4
F Testen von Methoden Allgemeine Java-Themen 3
S "Vererben" statischer Felder/Methoden Allgemeine Java-Themen 4
F Methoden in der Enumeration Klasse Allgemeine Java-Themen 1
S Methoden ohne Methodenkopf ?! Allgemeine Java-Themen 5
T Überschreiben von Methoden Allgemeine Java-Themen 6
M Methoden werden in falscher Reihenfolge bearbeitet Allgemeine Java-Themen 10
S Methoden Methoden überschreiben Allgemeine Java-Themen 3
N Threads statische Methoden in Threads Allgemeine Java-Themen 5
O Java-Obfuscator, welcher einzelne Methoden, Klassen und Ordnerstrukturen ausnehmen kann. Allgemeine Java-Themen 1
A also definition von klassen und string methoden und algorithmik Allgemeine Java-Themen 13
X Eigene Annotation - mit Bedingung für ganze Klassen oder Methoden Allgemeine Java-Themen 2
A Threads Lock über mehrere Abschnitte in verschiedenen Methoden Allgemeine Java-Themen 5
S Methoden Frage Allgemeine Java-Themen 2
R Wie kann man diese Methoden in arrays etablieren? Allgemeine Java-Themen 8
M Methoden in Rescources speichern Allgemeine Java-Themen 4
G Synchronisation nicht statischer Methoden Allgemeine Java-Themen 4
A Vererbung finale Methoden überschreiben Allgemeine Java-Themen 24
A Methoden parallelisieren? Allgemeine Java-Themen 2
C Methoden Übernahme von standart nativen Methoden? Allgemeine Java-Themen 9
B Zusammenfassen verschiedener ähnlicher Methoden Allgemeine Java-Themen 8
K JNI: Methoden aus unterschiedlichen Threads aufrufen Allgemeine Java-Themen 3
P Unterschiedliche Clone- Methoden Allgemeine Java-Themen 5
MQue Spezialfrage Überschreiben von Methoden Allgemeine Java-Themen 14
B Methoden Alle Methoden und Variablen aus Java-Dateien auslesen. Allgemeine Java-Themen 7
MiMa Rekursive Methoden Allgemeine Java-Themen 3
S Programm das alle aufgerufenen Methoden ausgibt..? Allgemeine Java-Themen 6
F ListIterator (next & previous methoden) Allgemeine Java-Themen 5
W Frage zu Refactoring statischer Methoden Allgemeine Java-Themen 4
M Methoden/Klassen für andere Projekte Allgemeine Java-Themen 4
T Methoden per String-Namen aufrufen Allgemeine Java-Themen 2
C Kapselung Warum graift man auf Variablen nur über Methoden und nich direkt zu? Allgemeine Java-Themen 10
M Methoden Static Methoden und Thread??? Allgemeine Java-Themen 4
A Methoden ohne Referenzen finden Allgemeine Java-Themen 9
turmaline OOP zwei gleiche Methoden mit kleinen Unterschieden Allgemeine Java-Themen 15
G JUnit Test Methoden in anderen Thread verlagern Allgemeine Java-Themen 4
K Auf Methoden der Runnable Klasse zugreifen Allgemeine Java-Themen 2
S Methoden Class.forName() >> Methoden - Reihenfolge Allgemeine Java-Themen 5
D Passende Name für Methoden finden Allgemeine Java-Themen 3
D Wann sollte ich statische Methoden und Variablen benutzen? Allgemeine Java-Themen 44
A Methoden laufen im Konstruktor, außerhalb allerdings nicht Allgemeine Java-Themen 2
M Generische Methoden mit Java und globale Variablen Allgemeine Java-Themen 9
GianaSisters ArrayList in Methoden übergeben Allgemeine Java-Themen 3
S static methoden Allgemeine Java-Themen 9
J coole Methoden Allgemeine Java-Themen 6
R Methoden in einem Thread unterschiedlich oft ausführen Allgemeine Java-Themen 4
A OOP: Überschreiben/Implementierung von Methoden Allgemeine Java-Themen 5
P Methoden und Werte Allgemeine Java-Themen 17
E Performace/Ausführungszeit von Methoden ermitteln Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben