X
Xyz1
Gast
the never ending story, Beitrag #401 habe ich mir gesichert.
Sorry, ich hab das Zeug alles nicht mehr im Kopf.@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?
Nur beim step? Das würde bedeuten, dass beim Erreichen von switchedTo sofort ein Gleiswechsel stattfinden müsste.Nur beim step... So eine Aufgabenstellung habe ich auch nie erlebt
Mal schauen, vielleicht toppen wir die 500the never ending story, Beitrag #401 habe ich mir gesichert.
Wie lautet denn der Text diesbezüglich genau?Ich habe das Gefühl, dass die Interpretation der Aufgabenstellung nicht immer so leicht ist ^^.
Nein, es tut mir leid, gilt auch für den putTrain(), aber in beiden Fällen, wie zur Hölle ist das anzustellen????????Sorry, ich hab das Zeug alles nicht mehr im Kopf.
Nur beim step? Das würde bedeuten, dass beim Erreichen von switchedTo sofort ein Gleiswechsel stattfinden müsste.
Bei der Überprüfung gehören die Start-/Endpunkte immer zu dem Gleis auf dem der der Rest des Zuges steht. Zum Beispiel Gleis 1 (G1) von (10,1) nach (20,1) und Gleis 2 (G2) von (20,1) nach (30,1).
Bist du dir sicher? In unserem Forum wurde das meine ich anders geschrieben.Nein, es tut mir leid, gilt auch für den putTrain(), aber in beiden Fällen, wie zur Hölle ist das anzustellen????????
Aber trotzdem ist es nun auch wichtig erstmal die Gleise im Allgmeinen zum Laufen zu bekommen, denn momentan crashen die schon viel zu früh...Bist du dir sicher? In unserem Forum wurde das meine ich anders geschrieben.
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.
Da lag ich mit canNavigateTo doch gar nicht verkehrt...rgendwie ist dann doch diese Methode zu bearbeiten, damit diese bei einem Grenzpunkt nicht das komplette andere Gleis zurückgibt, oder nicht?
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.Da lag ich mit canNavigateTo doch gar nicht verkehrt...
Ein gleis ist damit dann belegt, wenn das Hinterstück auf dem restlichen Gleis liegt.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.
@mihe7 Die canNavigate kann doch nur true/false zurückgeben. Inwiefern ist denn zu verändern????@Mika34 Kannst Du zu #407 noch das Posten, was davor steht?
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));
}
Also irgendwie passt das alles nicht zusammen:Und hier noch mal eine Visualisierung:
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.Ein gleis ist damit dann belegt, wenn das Hinterstück auf dem restlichen Gleis liegt.
Also landet die Kollisionsbehandlung in den step Befehl und nicht in den singleStep BefehlAch, 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.
Nachdem für alle Züge ein Schritt ausgeführt wurde.Also landet die Kollisionsbehandlung in den step Befehl und nicht in den singleStep Befehl
Nachdem für alle Züge ein Schritt ausgeführt wurde.
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?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
Nein, es wird leider nicht eingehalten..Prüft mal, ob das Belegungsmodell B überhaupt eingehalten wird.
> 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
Warum das denn?Der letzte put train Befehl darf nicht funktionieren.
Das habe ich in #428 bereits getan, wobei das aktuelle Modell vorausgesetzt wird.@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.
Alles klar.
@mihe7 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
Das ergibt sich automatisch. Die Hauptaufgabe bzgl. des Belegungsmodells A besteht einfach darin, den Track richtig zu bestimmen, auf dem die Lok steht.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.
A----B----C--D--E
Traiiin
A----B----C---D---E
Train
Das passt nicht zum ersten Bild aus #417Hier werden dann die Gleise von A---B, B----C und C--D belegt, weil sich das Ende vom Zug auf einem Endpunkt 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?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.
A----B------C---D
Train
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.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.
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.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.
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.Die gibt doch nur einen Track zurück auf Basis eines angegebenen Punktes.
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.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.
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?private Track findTrack(Point point) { for (Track track : tracks.values()) { if (track.isPassable(point)) { return track; } } return null; }
public void step(short speed) throws LogicException {
...
for (Train train : trainsOnTrack) {
singleStep(train, getTracksByTrain(train));
}
}
private void singleStep(Train train, List<Track> assignedTracks) throws LogicException {
...
collisionHandling(...);
}
Nein, ich meine findTrack. Nochmals: siehe Seite 2 des Threads.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?