Methoden Methoden anpassen und fehlende Funktionen hinzufügen

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

mihe7

Wie soll ich das implementieren? Dann kann der Rückgabewert ja nicht Track sein, oder?
Es geht nur um die Prüfung, ob der Punkt auf dem Track liegt. Die gezeigte Implementierung von Dir ist vollkommen ok, nur dass inTrack() eine Methode von Track sein sollte (also statt inTrack(point, track) einfach track.contains(point)).

Es muss Dich an der Stelle nicht interessieren, wie der Track aussieht. Stell Dir vor, Du bekommst morgen die Anforderung, dass die Tracks nicht mehr horizontal/vertikal sein müssen. Jetzt musst Du anfangen, Track zu ändern und dann überall suchen, wo davon ausgegangen wurde, dass der Track nur horizontal/vertikal sein darf.

EDIT: der Methodenname contains ist etwas irreführend. Es geht darum, ob der Track an der Stelle befahrbar ist.
 
D

DagobertDuck

Also muss der Rückgabewert nicht mal Track, sondern boolean sein...? Oder soll nur eine Track zurückgegeben werden, wenn sie befahrbar ist, also switchedTo auf dieses Gleis eingestellt ist?
 
mihe7

mihe7

Ja, wie Dein inTrack halt auch. Die findTrack-Methode muss natürlich Track zurückgeben.

Die Methode dürfte in Track etwa so aussehen (Fehler nicht ausgeschlossen):
Java:
public boolean canNavigateTo(Point p) {
    if (switchedTo == null) { return false; }
    Point p1 = getStartPoint();
    Point p2 = switchedTo;
    if (p1.equals(p) || p2.equals(p)) { return true; }

    return p1.x == p.x && p.x == p2.x && (p.y-p1.y)/(p2.y-p1.y) == 0 && (p2.y-p1.y)/(p.y-p1.y) > 0 ||
        p1.y == p.y && p.y == p2.y && (p.x-p1.x)/(p2.x-p1.x) == 0 && (p2.x-p1.x)/(p.x-p1.x) > 0;
}
Und findTrack in RailNetwork (oder wo auch immer die Tracks verwaltet werden):
Java:
    private Track findTrack(Point point) {
        for (Track track : tracks.values()) {
            if (track.canNavigateTo(point)) {
                return track;
            }
        }
        return null;
    }
 
M

Mika34

In diesem Schritt wird dann der Punkt gesucht, falls dieser auf dem Netz liegt dann wird der Track zurückgegeben auf dem sich der Zugkopf befindet und falls dies nicht der Fall ist, dann wird null zurückgegeben, oder?
 
mihe7

mihe7

Ja, wobei durch die Prüfung in canNavigateTo sichergestellt ist, dass nur die befahrbare Strecke der Weiche berücksichtigt wird.
 
mihe7

mihe7

@mihe7 Inwiefern kann das Edge übernehmen? Denn Edge modelliert doch nur die Strecke zwischen zwei Punkten und hat dabei keinerlei Aufschluss auf die nächste verbundene Kante, außer das der Endpunkt der vorherigen Kante der Startpunkt der jetzigen Kante ist
Das reicht ja.

wenn ich an Punkt p bin und in Richtung r fahre, von welchem Endpunkt aus bin ich auf dem Track gestartet?
Bei Edge ist das sehr einfach, weil es immer nur zwei Endpunkte gibt.

wie groß ist die Entfernung auf dem Track zwischen p und diesem Endpunkt?
Auch das kann Edge beantworten. Es ist einfach der Abstand zwischen zwei gegebenen Punkten auf der Kante.
 
D

DagobertDuck

Die Methode dürfte in Track etwa so aussehen (Fehler nicht ausgeschlossen):
Java:
public boolean canNavigateTo(Point p) {
if (switchedTo == null) { return false; }
Point p1 = getStartPoint();
Point p2 = switchedTo;
if (p1.equals(p) || p2.equals(p)) { return true; }

return p1.x == p.x && p.x == p2.x && (p.y-p1.y)/(p2.y-p1.y) == 0 && (p2.y-p1.y)/(p.y-p1.y) > 0 ||
p1.y == p.y && p.y == p2.y && (p.x-p1.x)/(p2.x-p1.x) == 0 && (p2.x-p1.x)/(p.x-p1.x) > 0;
}
Danke, so ähnlich habe ich es im Prinzip auch gehabt. Durch ein paar kleine Änderungen funktioniert die Funktion jetzt auch tadellos.

Java:
    public void putTrain(Train train, Point point, Point directionVector) {
        ...
        if (!findTrack(point).isPresent()) {
            throw new ...("point " + point + " is not passable");
        }
        long trainLength = train.getLength();
    }
Wie geht es jetzt weiter? Sollte ich mich jetzt an den Richtungsvektor wagen und falls ja, muss er normiert werden, oder wie funktioniert das am besten?

EDIT: Wie speichere ich die aufgegleisten Züge am besten (Map<Point, Train> (?))? Es muss ja geschaut werden, ob auf den Gleisen bereits ein anderer Zug steht.
 
Zuletzt bearbeitet:
M

Mika34

Warum weiß der Track nicht einfach, welcher Zug auf ihm steht?
Speichert man im Track, dann das Objekt Zug ab oder wie soll das gemacht werden?
Denn es kann durchaus sein, das der Zug auf mehreren Gleisen steht und daher mehrere Gleise dann mit dem gleichen Zug belegt werden
 
mihe7

mihe7

Speichert man im Track, dann das Objekt Zug ab oder wie soll das gemacht werden?
Ja.

Denn es kann durchaus sein, das der Zug auf mehreren Gleisen steht und daher mehrere Gleise dann mit dem gleichen Zug belegt werden
Ja.

Gespeichert werden ja nicht die Objekte selbst, sondern nur Referenzen darauf. Es ist also nicht so, dass da Kopien des Zugs gespeichert würden, sondern alle Tracks, auf denen der Zug steht, würden dann auf das selbe(!) Objekt verweisen.
 
D

DagobertDuck

OK, das ist natürlich sinnvoll!
Java:
        Track track = findTrack(point).get();
        if (track.getCurrentTrain() != null) {
            // Throw exception
        }
        track.setCurrentTrain(train);
Allerdings ist mir unklar, wie ich die Länge und den Richtungsvektor jetzt noch einbringen soll.
 
mihe7

mihe7

Allerdings ist mir unklar, wie ich die Länge jetzt noch einbringen soll.
Weil, Du auch hin und her springst. Wir waren ja noch nicht fertig.

Track muss noch zwei Dinge beantworten:

1. wenn ich an Punkt p bin und in Richtung r fahre, von welchem Endpunkt aus bin ich auf dem Track gestartet?
2. wie groß ist die Entfernung auf dem Track zwischen p und diesem Endpunkt?
Beide Fragen kann der Track beantworten.
Normieren in Point:
Java:
public Point toDirection() {
    return new Point((int)Math.signum(x), (int)Math.signum(y));
}
 
D

DagobertDuck

1. wenn ich an Punkt p bin und in Richtung r fahre, von welchem Endpunkt aus bin ich auf dem Track gestartet?
Wieso ist das wichtig und warum ist gefragt, von welchem Endpunkt der Zug gestartet ist? Es kann doch auch ein Startpunkt einer Track sein. Oder meinst du mit Endpunkt den Punkt, auf dem der hinterste Teil des Zuges steht?
 
D

DagobertDuck

Mir ist noch nicht ganz klar, wie das mit dieser Modellierung funktionieren soll, da ein Zug auf mehreren Gleisen stehen kann. Wie soll ich den Verlauf des Zuges zurückverfolgen, um den hintersten Punkt zu bekommen? Ich habe die Länge, aber es geht ja nicht nur in die entgegengesetzte Richtung des Vektors, sondern es kann durch Weichen auch in ganz andere Richtungen gehen.
 
mihe7

mihe7

Ich habe die Länge, aber es geht ja nicht nur in die entgegengesetzte Richtung des Vektors, sondern es kann durch Weichen auch in ganz andere Richtungen gehen.
Die Weiche hat ja eine Stellung. Die kann sich schlecht ändern, wenn der Zug auf ihr steht.

Bezogen auf einen Track kann der Zug nur aus zwei Richtungen kommen: getStartPoint() oder switchedTo. Das lässt sich anhand des Richtungsvektors feststellen.

Wie soll ich den Verlauf des Zuges zurückverfolgen, um den hintersten Punkt zu bekommen?
Genau damit, dass Dir der Track sagt, welche Haltestelle der Zug zuletzt passiert haben muss. Über diesen Punkt kann das RailNetwork den anliegenden Track ermitteln, der Dir wieder sagen kann, welche Haltestelle der Zug zuletzt passiert haben muss usw. Das machst Du so lange, bis die Länge des Zugs erreicht wurde und schon hast Du alle Tracks, auf denen der Zug stehen muss.
 
M

Mika34

Ja.


Ja.

Gespeichert werden ja nicht die Objekte selbst, sondern nur Referenzen darauf. Es ist also nicht so, dass da Kopien des Zugs gespeichert würden, sondern alle Tracks, auf denen der Zug steht, würden dann auf das selbe(!) Objekt verweisen.
Auf welche Weise lässt sich das dann implementieren?
Macht man dann eine Methode wie isTrainOnTrack oder passiert das erst beim Auflgeisen?
 
M

Mika34

OK, das ist natürlich sinnvoll!
Java:
        Track track = findTrack(point).get();
        if (track.getCurrentTrain() != null) {
            // Throw exception
        }
        track.setCurrentTrain(train);
Allerdings ist mir unklar, wie ich die Länge und den Richtungsvektor jetzt noch einbringen soll.
Denn hier wird erneut nur auf das Gleis, auf welchem sich der Kopf des Zuges befindet mit der Referenz vom Zug bestückt und nicht die anderen Gleise, auf welchen sich der Zug potentiell befinden kann
 
mihe7

mihe7

Denn hier wird erneut nur auf das Gleis, auf welchem sich der Kopf des Zuges befindet mit der Referenz vom Zug bestückt und nicht die anderen Gleise, auf welchen sich der Zug potentiell befinden kann
Ah, jetzt verstehe ich die Frage. Das ist an der Stelle auch noch nicht richtig und kommt daher, weil Dagobert schon beim Aufgleisen war, obwohl der entscheidende Punkt noch nicht gelöst wurde :)

Wenn Du #76 anschaust, siehst Du, dass man eine Reihe von Tracks erhält. Auf die muss man dann aufgleisen. Auch ist das erstmal nur ein naiver Ansatz, ob es dabei bleibt, muss man sehen.
 
M

Mika34

Jetzt habe ich es glaube ich geblickt. Es geht darum, ähnlich wie bei dem Entfernen von Gleisen, sich ein Set (beispielsweise kann auch eine Liste sein) von Tracks zurückgeben zu lassen, welche allesamt den gleichen Zug als Referenz gespeichert haben.
Ich hoffe ich täusche mich in dieser Annahme nicht
 
Thema: 

Methoden anpassen und fehlende Funktionen hinzufügen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben