Methoden Methoden anpassen und fehlende Funktionen hinzufügen

Diskutiere Methoden anpassen und fehlende Funktionen hinzufügen im Allgemeine Java-Themen Bereich.
mihe7

mihe7

Jein, es geht zunächst nur darum, sich ein Set von Tracks geben zu lassen, auf dem der Zug stehen müsste.

Wenn kein Track eine Referenz auf einen Zug besitzt (sprich: alle Tracks sind frei), dann können alle Tracks aus dem Set die Referenz auf den Zug speichern.
 
D

DagobertDuck

Muss die Methode findTrack() also eine Liste von Tracks zurückgeben?
 
mihe7

mihe7

Muss die Methode findTrack() also eine Liste von Tracks zurückgeben?
Nein. die Aufgabe von findTrack besteht einfach nur darin, den Track zu liefern, der den gegebenen Punkt enthält, sofern zu diesem überhaupt gefahren werden kann.

Damit wird ein Teil von
Java:
    /*
    TODO:
         - Check if there is even a track at the point <point>.
         - If it is a switch at point <point> then check if it's switched to this track.
         - Check if no other train is already on the required track(s) - note the length of the train
         - Check if directionVector fits with direction of track
    */
    public void putTrain(Train train, Point point, Point directionVector) throws LogicException {
        ...
        long trainLength = train.getLength();

    }
gelöst. Konkret die ersten beiden Punkte.

Als nächstes brauchst Du die "required track(s)". Den Starttrack hast Du schon mit findTrack gefunden. Du kannst also eine Methode schreiben, die Dir die requiredTracks() liefert - ausgehend vom Strarttrack, der Startposition des Zugs und des Richtungsvektors. (edit: und natürlich der Zuglänge).
 
M

Mika34

required track(s) ist somit der Platzbedarf (gemessen in Tracks, welche benötigt werden um den Zug aufzugleisen) des einzelnen Zugs, welcher auf den Gleisen aufliegt.
Aber inwiefern erlange ich die Kenntnis wie viele Tracks denn gebraucht werden.
Ich kenne die Länge des gesamten Zugs und die Länge jedes Gleises und die genaue Länge von dem Gleis auf, welchem der Zugkopf aufliegt.
Daran scheitert es bei mir gerade noch sehr stark
 
mihe7

mihe7

required track(s) ist somit der Platzbedarf (gemessen in Tracks, welche benötigt werden um den Zug aufzugleisen) des einzelnen Zugs, welcher auf den Gleisen aufliegt.
Ja. Aber nicht die Anzahl sondern die Menge der Tracks.

Ich kenne die Länge des gesamten Zugs und die Länge jedes Gleises und die genaue Länge von dem Gleis auf, welchem der Zugkopf aufliegt.
Eben. Nehmen wir mal an, der Kopf des Zuges würde genau an einem Gleisende stehen, das betreffende Gleis befindet sich bereits in der Liste und len gäbe die noch auf den Gleisen unterzubringende Länge des Zugs an - anfangs also die komplette Länge des Zugs.

Dann gibt es zwei Möglichkeiten:
  1. der Zug passt auf das Gleis. Dann bist Du fertig und die Liste enthält die Gleise.
  2. der Zug passt nicht auf das Gleis. Dann ziehst Du von len die Gleislänge ab und arbeitest mit dem nächsten Gleis weiter. Gibt es keines oder befindet sich dieses bereits in der Liste -> Exception.
Den Spaß wiederholst Du, bis Du fertig bist (s. 1)
 
mihe7

mihe7

Könntest du den Vorgang beispielsweise durch Pseudo-Code etwas verdeutlichen?
Pseudocode:
Java:
Track currentTrack = startTrack;
Point pos = startPosition;
List<Track> required = new ArrayList<>();
while (len > 0) {
    if (currentTrack == null || required.contains(currentTrack)) {
        // Zug kann nicht positioniert werden
        throw new ...
    }
    required.add(currentTrack);
    Point passed = currentTrack.getPassedPoint(direction);
    len -= currentTrack.distance(pos, passed);
    pos = passed;
    currentTrack = getConnection(passed, currentTrack);
}
 
M

Mika34

Ok, somit kann ich dann innerhalb der Methode mit einem getter auf die Länge der Tracks zugreifen.
Nun ist dann da das Problem wie man geschickt an die requiredTracks drankommt. Mir fällt dazu nichts ein, da man ja nur, wie oben erwähnt "die Länge des gesamten Zugs und die Länge jedes Gleises und die genaue Länge von dem Gleis auf, welchem der Zugkopf aufliegt." und somit nur den Zugkopf direkt in Relation mit einem track stellen kann und der Rest des Zuges dabei unberücksichtigt bleibt.
 
D

DagobertDuck

@mihe7 Danke, das hilft schon weiter. Was sollen die Methoden getPassedPoint() und getConnection() genau machen?
 
mihe7

mihe7

getPassedPoint() s. #57 Punkt 1.
getConnection(point, track): liefert das Anschlussgleis von track, an Punkt point. Hier kannst Du die Map tracks verwenden.
 
mihe7

mihe7

und somit nur den Zugkopf direkt in Relation mit einem track stellen kann und der Rest des Zuges dabei unberücksichtigt bleibt.
Ich weiß jetzt nicht, ob Du #88 gesehen hast, verstehe aber Dein Problem nicht:

Code:
V----------Z-----------------H
|          |                 |
|<-------->|<--------------->|
  Länge VZ     Länge ZH
Wenn Zug Z irgendwo steht und du weißt, dass er aus Richtung H gekommen ist, kannst Du doch ZH berechnen und weißt, wie viel vom Zug auf diesem Abschnitt höchstens stehen kann.
 
M

Mika34

Ich weiß jetzt nicht, ob Du #88 gesehen hast, verstehe aber Dein Problem nicht:

Code:
V----------Z-----------------H
|          |                 |
|<-------->|<--------------->|
  Länge VZ     Länge ZH
Wenn Zug Z irgendwo steht und du weißt, dass er aus Richtung H gekommen ist, kannst Du doch ZH berechnen und weißt, wie viel vom Zug auf diesem Abschnitt höchstens stehen kann.
Ja, man hat dann die Restlänge von dem Zug, aber das gibt mir ja trotzdem keine Auskunft darüber auf welchen er letztendlich stehen tut. Es sagt mir die Länge VZ/VH befindet sich momentan auf einem anderen Zug in die entgegengesetzte Richtung vom Richtungsvektor.
long story short: Wie prüfe ich, auf welchen Gleisen er genau stehen tut, wenn du wie oben erklärt hast man die Länge vom "Restzug" schon hat
 
D

DagobertDuck

@mihe7 Wenn der Punkt noch mitten auf dem Gleis liegt wird dasselbe Gleis zurückgegeben, oder? (getConnection)
 
D

DagobertDuck

Sicher, ob dies der richtige Ansatz ist, weiß ich nicht.

Java:
    private Track getConnection(Point point, Track track) {
        return edges.get(point).stream().filter(...);
    }
Könntest du mir behilflich sein?
 
D

DagobertDuck

So in der Art müsste es doch klappen, oder?

Java:
    private Track getConnection(Point point, Track track) {
        return edges.get(point).stream().filter(x -> x.getSwitchedTo() != null);
    }
Leider bin ich noch nicht sehr vertraut mit der Stream API. Daher weiß ich nicht so recht, was an dem Ausdruck noch nicht stimmt.
 
mihe7

mihe7

Vergiss mal die Streams. Die Frage ist, was Du da überhaupt filterst. An einem Punkt laufen max. 2 Tracks zusammen. Der Anschlusstrack kann ja nur der von track verschiedene sein, sofern es ein solches überhaupt gibt.
 
Thema: 

Methoden anpassen und fehlende Funktionen hinzufügen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben