Methoden Methoden anpassen und fehlende Funktionen hinzufügen

@mihe7 Inwiefern? Die Methode gibt doch nur zurück, ob man dorthin fahren kann oder nicht. Ich dachte an findTracks(), da die Methode zu einem gegebenem Punkt das Gleis raussucht... Dennoch hat die Modifikation von Beidem nichts bewirkt.
Wie müssen diese Methoden dafür angepasst werden?
Sorry, ich hab das Zeug alles nicht mehr im Kopf.

Nur beim step... So eine Aufgabenstellung habe ich auch nie erlebt
Nur beim step? Das würde bedeuten, dass beim Erreichen von switchedTo sofort ein Gleiswechsel stattfinden müsste.
 
Also wenn der Zugkopf auf der Grenze zu einem anderen Gleis ist, dann wird er nur das Gleis belege wo das gesamte Hinterstück des Zuges platziert ist und nicht das nächste Gleis, welches direkt angrenzt
 
Irgendwie ist dann doch diese Methode zu bearbeiten, damit diese bei einem Grenzpunkt nicht das komplette andere Gleis zurückgibt, oder nicht?
 
@mihe7 Hier noch mal eine Verdeutlichung der Aufgabe:
Code:
1. Die Schritte werden in Teilschritte von 1 aufgeteilt.
2. Am Ende einer Strecke entgleißt der Zug. Dabei ist das Gleis für den Teilschritt, in dem er das Gleis verlässt evtl. immer noch belegt (falls >1)
3. Alle Zusammenstöße zwischen Zügen werden bestimmt (nach den gegeben Regeln, mind. zwei Züge auf einem Gleis oder (Verbindungs)punkt)
4. Die Zusammenstöße in den Teilschritten werden zusammengefasst, falls es eine Überlappung gibt.
5. Alle Züge die in dem Teilschritt entgleisen werden vom Gleis genommen
6. Die anderen Teilschritte werden nach dem gleichen Prinzip ausgefüllt.
 
Während der Simulation kann es zu Zusammenstößen von verschieden Zügen kommen. Ein Zusammenstoß tritt hierbei auf, wenn zwei Züge auf dem gleichen Gleis oder Position stehen.
Ein gleis ist damit dann belegt, wenn das Hinterstück auf dem restlichen Gleis liegt.
a-----b----c
---train
Hier wäre dann zum Beispiel nur das Gleis von a---b belegt und nicht zusätzlich das Gleis von b---c
 
Und hier noch mal eine Visualisierung:

Screenshot 2020-03-01 at 20.08.49.png

Für den putTrain Befehl gilt:
Screenshot 2020-03-01 at 20.34.03.png
(der rechte Zug kann nicht aufgegleist werden).
 

Anhänge

  • Screenshot 2020-03-01 at 20.09.29.png
    Screenshot 2020-03-01 at 20.09.29.png
    79,4 KB · Aufrufe: 15
  • Screenshot 2020-03-01 at 20.32.51.png
    Screenshot 2020-03-01 at 20.32.51.png
    161,9 KB · Aufrufe: 4
Zuletzt bearbeitet:
@Mika34 Kannst Du zu #407 noch das Posten, was davor steht?
@mihe7 Die canNavigate kann doch nur true/false zurückgeben. Inwiefern ist denn zu verändern????
Java:
    public boolean canNavigateTo(CartesianPoint p) {
        if (switchIsSwitchedTowards == null) {
            return false;
        }
       
        CartesianPoint p1 = getStartPoint();
        CartesianPoint p2 = switchIsSwitchedTowards;
        if (p1.equals(p) || p2.equals(p)) {
            return true;
        }
        return (((p1.getXCoordinate() == p.getXCoordinate()) && (p.getXCoordinate() == p2.getXCoordinate())
                && (((p.getYCoordinate() - p1.getYCoordinate()) / ((p2.getYCoordinate() - p1.getYCoordinate()))) == 0)
                && ((p2.getYCoordinate() - p1.getYCoordinate()) / (p.getYCoordinate() - p1.getYCoordinate())) > 0)
                || ((p1.getYCoordinate() == p.getYCoordinate()) && (p.getYCoordinate() == p2.getYCoordinate())
                        && ((p.getXCoordinate() - p1.getXCoordinate())
                                / (p2.getXCoordinate() - p1.getXCoordinate()) == 0)
                        && ((p2.getXCoordinate() - p1.getXCoordinate())
                                / (p.getXCoordinate() - p1.getXCoordinate())) > 0));
    }
 
Und hier noch mal eine Visualisierung:
Also irgendwie passt das alles nicht zusammen:
Ein gleis ist damit dann belegt, wenn das Hinterstück auf dem restlichen Gleis liegt.
Demnach müsste der rechte Zug im Bild doch das rechte und das mittlere Gleis belegen. Eingezeichnet ist nur das rechte Gleis, dagegen würde der linke Zug zwei Gleise belegen, weil der Kopf sich auf dem Verbindungspunkt befindet.
 
Ach, jetzt verstehe ich das Bild: das ist das "vorher" Bild und unten ist der "nachher" Zustand eingezeichnet. Das hätte man auch deutlicher machen können...

So ist es eh implementiert, das Problem ist, dass die Kollisionsbehandlung erst stattfinden darf, wenn alle Züge bewegt wurden.
 
Pardon, wenn mehr als 400 Beiträge im Uni Forum geschrieben wurden mit Pi mal Daumen 7 Beiträgen und man sich dann den falschen rauspickt, dann ist man fehlinformiert.
 
Ach, jetzt verstehe ich das Bild: das ist das "vorher" Bild und unten ist der "nachher" Zustand eingezeichnet. Das hätte man auch deutlicher machen können...

So ist es eh implementiert, das Problem ist, dass die Kollisionsbehandlung erst stattfinden darf, wenn alle Züge bewegt wurden.
Also landet die Kollisionsbehandlung in den step Befehl und nicht in den singleStep Befehl
 
Aber das verstehe ich noch nicht richtig. Wenn alle nacheinander ausgeführt werden, wie kann man dann prüfen, ob eine Kollision stattgefunden hat, wenn alle Züge einen Schritt ausgeführt haben. Und zusätzlich muss man eine Fehlermeldung ausgeben, welche die gecrashden Züge sortiert nach der id ausgibt wie:"Crash of train 1,2".
Nachdem für alle Züge ein Schritt ausgeführt wurde.
 
Wie sind dann die Züge vom Gleis zu nehmen, die in der Kollision beteiligt sind. Setzt man dann das Attribut currentTrain einfach auf 0 bei den beteiligten Zügen oder soll eine weitere Liste verwaltet werden, die nur Züge enthält die sich auf dem Streckennetz bewegen, so wie es @DagobertDuck macht?
 
Ach Leute, da kommen die nach dem 400. Kommentar mit so Nebensächlichkeiten an... da könnten wir fast von vorne anfangen.

Prüft mal, ob das Belegungsmodell B überhaupt eingehalten wird.

Wenn ich es richtig sehe, müsst ihr mit dem aktuellen Modell:
1. Neue Positionen und Richtungen der Züge nach Modell A berechnen.
2. Für alle Ergebnisse aus 1. die requiredTracks nach Modell A ermitteln
3. Kollisionen feststellen, Züge entfernen
4. Züge tatsächlich bewegen
 
Ach Leute, da kommen die nach dem 400. Kommentar mit so Nebensächlichkeiten an... da könnten wir fast von vorne anfangen.

Prüft mal, ob das Belegungsmodell B überhaupt eingehalten wird.

Wenn ich es richtig sehe, müsst ihr mit dem aktuellen Modell:
1. Neue Positionen und Richtungen der Züge nach Modell A berechnen.
2. Für alle Ergebnisse aus 1. die requiredTracks nach Modell A ermitteln
3. Kollisionen feststellen, Züge entfernen
4. Züge tatsächlich bewegen
Nach vorne die Gleise zu belegen ist möglich, da man über die Map einen Key vergleicht mit dem Aufsetzpunkt des Trains, aber wie ist zu prüfen, ob der Endpunkt des Zuges einem Verbidnungspunkt zweier Gleise entspricht? Geht man da über eine Fallunterscheidung?
 
Prüft mal, ob das Belegungsmodell B überhaupt eingehalten wird.
Nein, es wird leider nicht eingehalten..
Code:
> add track (1,1) -> (5,1)
1
> add track (5,1) -> (10,1)
2
> add track (10,1) -> (15,1)
3
> create engine steam T3 Emma 3 true true
steam engine T3-Emma added to train 1

> add train 1 T3-Emma
T3-Emma
> put train 1 at (4,1) in direction 1,0
OK
> create engine steam ICE 1106 6 true true
ICE-1106
> add train 2 ICE-1106
steam engine ICE-1106 added to train 2
> put train 2 at (10,1) in direction 1,0
OK
Der letzte put train Befehl darf nicht funktionieren.

Es sei denn ich habe bei den Eingaben einen Fehler gemacht?
 
@mihe7 Könntest du grob skizieren wie die step() Methode aufgebaut sein muss, damit alle gecrasheden Züge vom Gleis genommen werden und eine Fehlermeldung ausgegeben wird. Dabei sollen alle anderen, die davon nicht betroffen sind ganz normal weiter fahren können.
 
@mihe7 Könntest du grob skizieren wie die step() Methode aufgebaut sein muss, damit alle gecrasheden Züge vom Gleis genommen werden und eine Fehlermeldung ausgegeben wird. Dabei sollen alle anderen, die davon nicht betroffen sind ganz normal weiter fahren können.
Das habe ich in #428 bereits getan, wobei das aktuelle Modell vorausgesetzt wird.

Es geht im Wesentlichen darum, die Ermittlung der nächsten Zugposition von der tatsächlichen Bewegung zu trennen, um dazwischen die Kollisionsbehandlung durchführen zu können. Wobei man sich zunächst auch auf die Ermittlung des Gleises beschränken könnte, auf dem die Lok nach dem Zug stehen würde bzw. aller Gleise, die der Zug belegen würde. Da müsst ihr mal schauen, womit ihr besser zurecht kommt.
 
Alles klar.
Für das Belegungsmodell müssen wir noch an den letzten Punkt drankommen, welcher vom zug auf dem Gleis steht. Also der letzte Punkt des Zuges.
Könntest du hierfür bitte noch eine Methode im groben angeben wie hier vorzugehen ist
 
Für das Belegungsmodell müssen wir noch an den letzten Punkt drankommen, welcher vom zug auf dem Gleis steht. Also der letzte Punkt des Zuges.
Das ergibt sich automatisch. Die Hauptaufgabe bzgl. des Belegungsmodells A besteht einfach darin, den Track richtig zu bestimmen, auf dem die Lok steht.

Steht diese nicht auf einem Endpunkt, ist der Track eindeutig. Ansonsten muss der Track gewählt werden, auf dem die Lok einen Schritt zuvor auch schon stehen musste, d. h. dessen anderer Endpunkt sich entgegengesetzt der Fahrtrichtung befindet.
 
Nein, ich meine was anderes.
Code:
A----B----C--D--E
     Traiiin
Hier werden dann die Gleise von A---B, B----C und C--D belegt, weil sich das Ende vom Zug auf einem Endpunkt befindet.

Code:
A----B----C---D---E
        Train
Hier werden dann lediglich die Gleise B---C und C---D vom Zug belegt.
Deshalb brauch man den letzten Punkt des Zuges um zu prüfe, ob sich der letzte Punkt auf einem Endstück befindet oder nicht?
Denn momentan bekomme ich es mit dem Zugkopf auf die Reihe, aber hieran scheitert es noch
 
Steht diese nicht auf einem Endpunkt, ist der Track eindeutig. Ansonsten muss der Track gewählt werden, auf dem die Lok einen Schritt zuvor auch schon stehen musste, d. h. dessen anderer Endpunkt sich entgegengesetzt der Fahrtrichtung befindet.
Du hast Recht ich habe mich vertan. Aber dann muss man in den putTrain() Befehl den step() Befehl einbauen oder wie verstehe ich das. Daher verstehe ich nicht wie man das dann in den putTrain() Befehl einpacken soll. Ist das überhaupt der richtige Ansatz dafür? Falls ja, dann müsste der getRequiredTracks() Befehl komplett neu aufgesetzt werden, oder nicht?
Oder reicht es zu prüfen, ob der nächste Punkt nach dem Kopf des Zuges ein Verbindungspunkt zwischen zwei Gleisen ist und man damit dann das nächste Gleis ebenfalls belegt wie in diesem Beispiel:
Code:
A----B------C---D
        Train
Hier belegt der Zug dann die Gleise B----C und C---D
 
Nein, es geht doch nur um Gleisbelegungen. Für die Kollisionsbehandlung wird angenommen, dass der Zug so lange wie möglich auf einem Gleis bleibt. Das muss findTrack() entsprechend berücksichtigen. Der Rest von getRequiredTracks() bleibt davon unberührt.

Warum das bei putTrain() anders sein soll, erschließt sich mir zwar (noch) nicht, ist aber kein größeres Problem: zuerst kann man mit der angepassten getRequiredTracks()-Methode die Gleise nach Modell A ermitteln und fügt ggf. das noch fehlende Gleis ein, wenn die Lok auf einem Verbindungspunkt steht.
 
Warum das bei putTrain() anders sein soll, erschließt sich mir zwar (noch) nicht, ist aber kein größeres Problem: zuerst kann man mit der angepassten getRequiredTracks()-Methode die Gleise nach Modell A ermitteln und fügt ggf. das noch fehlende Gleis ein, wenn die Lok auf einem Verbindungspunkt steht.
Ja, es hat indirekt putTrain(). betroffen, da man da ja auch die benötigten Gleiste über getREquiredTracks() benötigt hat. Dies habe ich nun angepasst und das funktioniert nun auch einwandfrei. Jedoch verstehe ich immer noch nicht wie man die findTracks() entsprechend anpassen soll. Die gibt doch nur einen Track zurück auf Basis eines angegebenen Punktes.
Nein, es geht doch nur um Gleisbelegungen. Für die Kollisionsbehandlung wird angenommen, dass der Zug so lange wie möglich auf einem Gleis bleibt. Das muss findTrack() entsprechend berücksichtigen.
Könntest du das nochmals verdeutlichen, weil ich komme nicht darauf wieso hier nun Anpassungen vorzunehmen sind und wie diese dann auszusehen haben, da die Methode ohnehin keine allzu große Funktionalität besitzt.
 
Die gibt doch nur einen Track zurück auf Basis eines angegebenen Punktes.
Es muss auch die Fahrtrichtung berücksichtigt werden, s. insbes. Seite 2 des Threads. Der zurückgegebene Track muss dabei derjenige sein, auf dem die Lok - nach Belegungsmodell A - steht.

Könntest du das nochmals verdeutlichen, weil ich komme nicht darauf wieso hier nun Anpassungen vorzunehmen sind und wie diese dann auszusehen haben, da die Methode ohnehin keine allzu große Funktionalität besitzt.
Wenn überhaupt, ist nur eine minimale Änderung erforderlich. Es kann sein, dass das Belegungsmodell bereits per Zufall berücksichtigt wurde. Muss man sich im Detail ansehen.
 
private Track findTrack(Point point) { for (Track track : tracks.values()) { if (track.isPassable(point)) { return track; } } return null; }
findTrack() ist momentan so definiert, deshalb habe ich gefragt, wie diese anzupassen ist. Du meinst, man soll nun auch den Richtungsvektor des Zuges der Methode mitgeben? Kann es sein, das du doch getRequiredTracks() meinst, da diese die notwendigen Tracks zurückgibt, welche von dem Zug benötigt werden und man hier dann die Funktionen anpassen soll?
 
@mihe7 Nachdem ich ein paar Testfälle durchgegangen bin, kann ich sagen, dass meine putTrain Methode jetzt so wie erwartet funktioniert. Nichtsdestotrotz würde ich dich gerne noch mal über meinen Code drüberschauen lassen. Könntest du mir dafür die Rechte geben, dein Profil zu sehen?
 
Bezüglich des step-Commands:
Java:
    public void step(short speed) throws LogicException {
        ...
        for (Train train : trainsOnTrack) {
            singleStep(train, getTracksByTrain(train));
        }
    }

Java:
    private void singleStep(Train train, List<Track> assignedTracks) throws LogicException {
         ...
         collisionHandling(...);
    }

Ist die Struktur so richtig, oder habe ich etwas übersehen? Ich bin momentan noch etwas überfragt, wie die Methodenstruktur auszusehen hat. Ich habe bisher erstmal nur das vorwärts fahren berücksichtigt. Allerdings sollte es nicht allzu schwierig sein, das dann dementsprechend anzupassen, oder?
 
findTrack() ist momentan so definiert, deshalb habe ich gefragt, wie diese anzupassen ist. Du meinst, man soll nun auch den Richtungsvektor des Zuges der Methode mitgeben? Kann es sein, das du doch getRequiredTracks() meinst, da diese die notwendigen Tracks zurückgibt, welche von dem Zug benötigt werden und man hier dann die Funktionen anpassen soll?
Nein, ich meine findTrack. Nochmals: siehe Seite 2 des Threads.

Nimm einfach Dein Beispiel aus #441 und frage Dich, welches Gleis Du nehmen sollst, wenn die Lok bei Punkt B steht. Antwort: kommt darauf an. Worauf? Woher der Zug kam, d. h. in welche Richtung er aktuell fährt. Fährt er von A Richtung B, also in Richtung (1,0), dann ist das Gleis A-B das richtige, fährt er dagegen in die andere Richtung, wäre B-C korrekt.
 

Zurück
Oben