mihe7
Top Contributor
Nein. Die Kollisionsbehandlung darf nicht je Zug (EDIT: je Schritt eines Zuges natürlich) erfolgen.Ist die Struktur so richtig
Nein. Die Kollisionsbehandlung darf nicht je Zug (EDIT: je Schritt eines Zuges natürlich) erfolgen.Ist die Struktur so richtig
Ich gehe mal davon aus, dass du hier absichtlich nicht drauf eingegangen bist ^^ (?).@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?
OK. Sie muss also nach den angegebenen n-Schritten erfolgen, d. h. ganz zum Schluss.Nein. Die Kollisionsbehandlung darf nicht je Zug (EDIT: je Schritt eines Zuges natürlich) erfolgen.
public void step(short speed) {
...
for (int i = 0 i < speed; i++) {
for (Train train : trainsOnTrack) {
singleStep(train, getTracksByTrain(train));
}
}
collissionHandling(...);
}
train
und rAkt
, oder nicht?Ich habe mich vertan. Ist diese dann auf Basis von findTracks() zu realisieren?Es geht darum, dass die Methode
nicht berücksichtigt, dass point ein Punkt sein kann, der zwei Gleise miteinander verbindet. Die Methode braucht also noch die Richtung des Zuges, um ggf. das richtige Gleis auswählen zu können - und natürlich den Code, der sich darum kümmert.
D. h. WENN point Schlüssel von edges ist, DANN muss das richtige Gleis anhand der Richtung gewählt werden, SONST muss der Punkt über die Werte von edges (also alle Tracks) gesucht werden.
private Track findTrack(Point point, Point direction) {
//Wie packe ich nun den Richtiungsvektor in die Prüfung nach
//dem richtigen Track?
for (Track track : tracks.values()) {
if (track.isPassable(point)) {
return track;
}
}
return null;
}
Hast du die genau so implementiert?@Mika34 Gehört das schon zum step Befehl, oder bist du noch am putTrain Befehl? Ich habe bisher nämlich nichts an der findTrack() Methode ändern müssen.
if (edges.containsKey(point)) {
// Find track by direction
...
} else {
// Find point over values of edges (all tracks)
...
}
return null;
Oder sollte ich rAkt als private Attribut in der Klasse speichern?Ich gehe mal davon aus, dass du hier absichtlich nicht drauf eingegangen bist ^^ (?).
OK. Sie muss also nach den angegebenen n-Schritten erfolgen, d. h. ganz zum Schluss.
Wie schaffe ich es, die Argumente dann am besten zu übergeben? Soll der Rückgabewert von singleStep() nicht mehr void sein. Falls ja, welchen Rückgabewert muss ich stattdessen verwenden? Ich brauche für die Kollisionsbehandlung im Grunde genommen ja 2 Attribute:Java:public void step(short speed) { ... for (int i = 0 i < speed; i++) { for (Train train : trainsOnTrack) { singleStep(train, getTracksByTrain(train)); } } collissionHandling(...); }
train
undrAkt
, oder nicht?
Ich verstehe nicht ganz, wie ich in 1. die Positionen und Richtungen berechnen soll, ohne sie direkt auf die Züge anzuwenden? Wie kann ich mir diese Informationen zwischenspeichern?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
Richtig. Zeitmangel.Ich gehe mal davon aus, dass du hier absichtlich nicht drauf eingegangen bist ^^ (?).
Irgendwie wirst Du die Richtung ja übergeben müssen...Es müsset dann ungefähr so aussehen, oder nicht?
Ich weiß nicht, ob es Sinn der Sache ist, dass ich Euch für jedes Problem die Lösung in die Hand drücke.Ich gehe stark davon aus. Aber wie um Himmels Willen soll ich hier den Richtungsvektor ins Spiel bringen???
A-----B-----C Tracks ohne Lok
+----->-----+ Tracks mit point auf Endpunkt B = Endpunkt von A-B und B-C
+---->+-----+ point entgegen Fahrtrichtung verschoben -> jetzt Eindeutig A-B
umgekehrter Fall:
+-----<-----+ Tracks mit point auf Endpunkt B = Endpunkt von A-B und B-C
+-----+<----+ point entgegen Fahrtrichtung verschoben -> jetzt Eindeutig B-C
Indem Du keine Setter verwendest?!?Ich verstehe nicht ganz, wie ich in 1. die Positionen und Richtungen berechnen soll, ohne sie direkt auf die Züge anzuwenden?
Und wie mache ich das dann ohne?Indem Du keine Setter verwendest?!?
Schreib eine Klasse, die Position und Richtung speichern kann. Steck die in eine Map<Train,DeineKlasse>.Ich muss ja die Position und die Richtung für jeden Zug irgendwie speichern.
private void collisionHandling(Train train, List<Track> rAkt) {
List<Track> rNeu = getTracksByTrain(train);
// Entferne Zug von jedem Track, der in rAkt vorhanden, in rNeu nicht vorhanden ist.
if (rAkt != null) {
for (Track track : rAkt) {
if (rNeu != null && !rNeu.contains(track)) {
// TODO: Is this correct?
track.setCurrentTrain(null);
}
}
}
// Setze Zug auf jeden Track, der in rNeu vorhanden, in rAkt nicht vorhanden ist.
if (rNeu != null) {
for (Track track : rNeu) {
if (rAkt != null && !rAkt.contains(track)) {
if (track.getCurrentTrain() != null) {
// Remove train
getTracksByTrain(train).forEach(x -> x.setCurrentTrain(null));
// Remove track.getCurrentTrain()
getTracksByTrain(track.getCurrentTrain()).forEach(x -> x.setCurrentTrain(null));
}
// TODO: Is this correct?
track.setCurrentTrain(train);
}
}
}
}
Selbstverständlich.Was ist jetzt im 4. Schritt zu tun? Sollen hier dann tatsächlich die Setter von Train benutzt werden?
Und wo tauchen hier die requiredTracks aller Züge auf? (Schritt 2)Derzeit zieht meine Kollisionsbehandlung folgendermaßen aus:
public class Placement {
public final Point position;
public final Point direction;
...
}
Alles klar. D. h. bei putTrain sollen auch die Setter vom Train benutzt werden und nicht die extra Klasse. In der separaten Klasse werden die Positon und die Richtung also nur zwischengespeichert.Selbstverständlich.
private void assignTrainToTracks(Train train, Point point, Point directionVector, List<Track> requiredTracks) {
requiredTracks.forEach(required -> required.setCurrentTrain(train));
trainsOnTrack.put(train, new Placement(point, directionVector));
}
Das wäre bei mir doch die ListeUnd wo tauchen hier die requiredTracks aller Züge auf? (Schritt 2)
rNeu
, oder nicht?Warum fängst Du jetzt mit putTrain an?!? Wir sind beim Bewegen der Züge.Alles klar. D. h. bei putTrain sollen auch die Setter vom Train benutzt werden
Nein. Mit der Methode machst Du nichts anderes als vorher auch.Das wäre bei mir doch die ListerNeu
, oder nicht?
Die Klasse stellt Position und Richtung dar. Ob Du Objekte der Klasse nur als Zwischenspeicher verwendest, oder z. B. auch Parameter und Variablen (z. B. in Train) auf die Klasse umstellst, bleibt Dir überlassen.In der separaten Klasse werden die Positon und die Richtung also nur zwischengespeichert.
Naja, weil mir unklar ist, wann jetzt genau die Setter von Train benutzt werden sollen und wann die Position/Richtung in der separaten Klasse gespeichert werden sollen. Außerdem habe ich an dieser Stell vorher mit den Settern die Richtung/Position des Zuges festgelegt. Daher dachte ich, dass ich das jetzt in die Klasse umleiten muss. Die Trennung zwischen Setter und Klasse ist mir noch nicht klar.Warum fängst Du jetzt mit putTrain an?!? Wir sind beim Bewegen der Züge.
List<Track> rNeu = getTracksByTrain(train);
private List<Track> getTracksByTrain(Train train) {
Point position = trainsOnTrack.get(train).getPosition();
Point direction = trainsOnTrack.get(train).getDirection();
Track track = findTrack(position, direction);
return getRequiredTracks(track, position, direction, train.getLength());
}
Nein.Ist meine derzeitige Methode zur Kollisionsbehandlung soweit korrekt?
Genau das wäre die Frage an Dich. Was willst Du damit erreichen?Was soll rAkt und rNeu konkret sein?
Wir sind doch jetzt beim Bewegen von Zügen, da hat doch das Aufgleisen (putTrain) nichts mehr damit zu tun.Naja, weil mir unklar ist, wann jetzt genau die Setter von Train benutzt werden sollen und wann die Position/Richtung in der separaten Klasse gespeichert werden sollen.
ohne Änderungen am existierenden Modell vornehmen zu müssen.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
Dazu müsstest Du Gespräche zulassen.Die Aufgabe sollte sich auch bald dem Ende neigen. Daher wäre ich dir sehr verbunden, wenn du im Laufe der nächsten Tage privat einmal über meine (scheinbar) richtig funktionierende putTrain Methode schauen könntest. Das sollte ja nicht allzu viel Zeit in Anspruch nehmen.
Ich habe vorher an der putTrain Methode und somit am existierenden Modell ja schon einiges ändern müssen, damit es Modell 2B entspricht.ohne Änderungen am existierenden Modell vornehmen zu müssen
Funktioniert es jetzt?Dazu müsstest Du Gespräche zulassen.