Tutorial: Nicht rechtwinklige Bue

Berichte über Problemlösungen, Ergänzungen zur Dokumentation, "Kochrezepte" usw., hier soll vor allem berichtet und nicht so sehr gefragt werden
Antworten
Nachricht
Autor
Benutzeravatar
Oliver Lamm
Beiträge: 3102
Registriert: 04.01.2002 15:02:17
Aktuelle Projekte: Aachen - Neuss für Zusi3
Wohnort: Essen
Kontaktdaten:

Tutorial: Nicht rechtwinklige Bue

#1 Beitrag von Oliver Lamm »

Vielleicht bin ich ja der einzige der mit diesem lästigen Phänomen zu hadern hat. Ein Bahnübergang kreuzt nicht rechwinklig sondern in irgendeinem Winkel die Bahntrasse. Dennoch möchte man den "Bue-Baukasten" im Signalordner verwenden - insbesondere die schönen Rampen.

Ich habe mich jetzt mal drangesetzt und ein OpenOffice-Calc Dokument erstellt was die Sache relativ einfach macht.

Vorgehensweise:

1. Laden der Rampe in den Gebäudeeditor und direkt abspeichern unter neuem Namen.
2. Öffnen von Bue Rechner (OpenOffice .ods)
Bild

3. Den Winkel im Feld B1 ersetzen (negativ -> gegen den Uhrzeigersinn)
4. Nun für jedes Polygon die Werte in das Dokument eintragen und die neuen X-Werte im schwarzen Kasten für das jeweilige Polygon ersetzen.

5. Den Gleisabstand in B8 eintragen.

Die Rampen sind so gebaut das die Elementspitze auf die Mitte des Bahnübergangs zeigt. Da bei einem schrägen Bahnübergang die Elementspitzen nicht nebeneinander liegen kann man nun den Versatz in Gleisrichtung im Feld "Versatz" ablesen. Das Feld B8 ist vorzeichenbehaftet (negativ -> links)

Das Ergebnis sieht dann z.B. so aus (-45 Grad):
Bild

Gruss, Oli

EDIT: Endung korrigiert (Danke @Daniel)
Zuletzt geändert von Oliver Lamm am 15.09.2005 19:54:48, insgesamt 1-mal geändert.
Oliver Lamm
mail(AT)oliverlamm(DOT)de

Benutzeravatar
Daniel Schuhmann
Beiträge: 1147
Registriert: 21.04.2003 18:50:37
Aktuelle Projekte: Nüscht
Wohnort: Miesbach
Kontaktdaten:

Re: Tutorial: Nicht rechtwinklige Bue

#2 Beitrag von Daniel Schuhmann »

Oliver Lamm hat geschrieben:2. Öffnen von Bue Rechner (OpenOffice .odx)
Die Endung müßte richtig .ods heißen, oder (zumindest unter Windows)? Öffnen lässt sie sich dann hervorragend.
Signaturen können bis zu 50 Zeichen lang sein und

Benutzeravatar
Carsten Hölscher
Administrator
Beiträge: 33384
Registriert: 04.07.2002 00:14:42
Wohnort: Braunschweig
Kontaktdaten:

#3 Beitrag von Carsten Hölscher »

sieht sehr interessant aus!

Carsten

Benutzeravatar
Oliver Lamm
Beiträge: 3102
Registriert: 04.01.2002 15:02:17
Aktuelle Projekte: Aachen - Neuss für Zusi3
Wohnort: Essen
Kontaktdaten:

#4 Beitrag von Oliver Lamm »

Es ist noch nicht ganz stimmig - wenn es zu den gleisnahen Elementen kommt. Das fällt allerdings nur bei grossen Winkeln auf. Ich bin gerade dabei den mathematischen Zusammenhang nochmal nachzuvollziehen und werde dann das Skript updaten. Daher bitte noch einen Augenblick gedulden.

Danke, Oli

EDIT: Das Skript ist upgedated.
Zuletzt geändert von Oliver Lamm am 15.09.2005 22:18:50, insgesamt 4-mal geändert.
Oliver Lamm
mail(AT)oliverlamm(DOT)de

Benutzeravatar
Roland Ziegler
Beiträge: 5508
Registriert: 04.11.2001 22:09:26
Wohnort: 32U 0294406 5629020
Kontaktdaten:

#5 Beitrag von Roland Ziegler »

Das sieht doch nach einer affinen Transformation aus? Ist das im Moment Scherung oder Rotation? Wenn es Scherung ist (Parallelogramm-Verzerrung), dann wird die Straße doch schmaler, als bei rechtwinkliger Kreuzung?

Benutzeravatar
Oliver Lamm
Beiträge: 3102
Registriert: 04.01.2002 15:02:17
Aktuelle Projekte: Aachen - Neuss für Zusi3
Wohnort: Essen
Kontaktdaten:

#6 Beitrag von Oliver Lamm »

Ich habe folgenden Ansatz gewählt:

Die Y-Koordiante bleibt unverändert - allein schon wegen der Spaltbreite für die Gleise. Das bedeutet aber auch das ich die X-Verschiebung um einen Korrekturwert ergänzen muss.

Also der Reihe nach:

Verschiebung von x_0 nach x_1:

Code: Alles auswählen

x_1 = x_0 + y_0 * sin(alpha)
y_1 = y_0*cos(alpha);
Der neue korrigierte Ausgangspunkt berechnet sich als

Code: Alles auswählen

x_2 = x_1 + x_k
x_k ist der Anteil in X-Richtung der Verschiebung des neuen Punktes auf der neuen Geraden bis die alte Y-Position wieder erreicht ist. Denach gilt:

Code: Alles auswählen

x_k = (y_0 - y_1)*tan(alpha)
      = (y_0 - y_1)*(sin(alpha)/cos(alpha))
      = (y_0 - y_0*cos(alpha))*(sin(alpha)/cos(alpha))
      = y_0*(sin(alpha)/cos(alpha) -sin(alpha))
      = y_0*(tan(alpha) - sin(alpha))
Eingesetzt:

Code: Alles auswählen

x_2 = x_0 + y_0*sin(alpha) + y_0(tan(alpha) - sin(alpha))
       = x_0 + y_0(tan(alpha))
Christian Gründler frage noch ob man die Anschlußstücke wieder parallel bekäme. Machbar ja - aber der einfachheit der Formel halber lasse ich sie "krumm" - sonnst müsste man zwischen Strassenanschluss und Mittelpolygonen unterscheiden. Vielleicht liefere ich einen "Korrekturrechner" für die Endpolygone nach - es darf aber auch gerne jemand anderes die Formeln anpassen.

Oli
Oliver Lamm
mail(AT)oliverlamm(DOT)de

Benutzeravatar
Roland Ziegler
Beiträge: 5508
Registriert: 04.11.2001 22:09:26
Wohnort: 32U 0294406 5629020
Kontaktdaten:

#7 Beitrag von Roland Ziegler »

Es mag jetzt sein, dass ich irgendetwas übersehe. Ich würde aber zunächst mal meinen, dass man das Problem durch eine Kombination von Scherung und eindimensionaler Skalierung lösen könnte.

Vorgabe: Die y-Koordinaten bleiben unverändert.

Scherung: Die x-Koordinaten werden entsprechend der Scherwinkels entlang einer Parallelen zur x-Achse verschoben, y also konstant.

alpha sei der Scherwinkel, der Winkel, der vom 90°-Kreuzungswinkel abweicht, also alpha = 0 sei eine 90°-Kreuzung.

dx1 sei die Verschiebung einer x-Koordinate x1 nach der Scherung.

Code: Alles auswählen

dx1 = y * tan (alpha)
Skalierung: Durch die Scherung werden Längen in x-Richtung gestaucht. Um das zu kompensieren, werden alle x-Koordinaten, bezogen auf die Vektorlänge, um einen Faktor gedehnt. Der Faktor ist:

Code: Alles auswählen

fx = 1 / cos (alpha)
x2 sei die endgültige Position von x1. x0 sei der Anfangspunkt des zu dehnenden Vektors.

Code: Alles auswählen

x2 = x1 + dx1 + (x1 - x0) * fx



Was übersehe ich bei diesem Ansatz?

Für Christians Wunsch muss man wohl in der Tat eine Fallunterscheidung machen. Dann könnten die "Außen"-Koordinaten per Rotation bestimmt werden. Man müsste also den Ursprung hier irgendwo hinpflanzen.

Benutzeravatar
Christian Gründler
Beiträge: 2209
Registriert: 04.10.2003 13:27:48
Wohnort: Brühl (Baden)

#8 Beitrag von Christian Gründler »

Hallo Roland,

im Prinzip gebe ich Dir recht, aber man kann die Lösung noch einfacher formulieren:

a) erst die gesamte Landschaft in x-Richtung um den Faktor 1/cos(alpha) skalieren (das ist ja schon als Funktion im Gebäudeeditor vorhanden)

b) dann nach der Formel x_neu = x_vorhanden + y_alt * tan (alpha) scheren

@Carsten: Scheren der gesamten Landschaft wäre offenbar eine sinnvolle Funktion für den neuen Gebäudeeditor (man sollte die Ebene wählen können, in der das passiert); gleiches gilt für Drehen (ist z.Zt. ja nur für verknüpfte Landschaften möglich).

@Oli: in die Formel für die Berechung des Versatzes gehört auch der Tangens rein (ist im Grunde das gleiche wie bei den anderen x-Kooordinaten).

Den Wunsch nach Abschluß senkrecht zur Straße ziehe ich zurück - es dürfte wohl einfacher sein, die Straße an die vorhandenen Koordinaten des Übergangs anzupassen.

M.f.G. Christian

Benutzeravatar
Oliver Lamm
Beiträge: 3102
Registriert: 04.01.2002 15:02:17
Aktuelle Projekte: Aachen - Neuss für Zusi3
Wohnort: Essen
Kontaktdaten:

#9 Beitrag von Oliver Lamm »

Werde es mir heute abend noch mal zu gemüte führen.

Oli
Oliver Lamm
mail(AT)oliverlamm(DOT)de

Benutzeravatar
Carsten Hölscher
Administrator
Beiträge: 33384
Registriert: 04.07.2002 00:14:42
Wohnort: Braunschweig
Kontaktdaten:

#10 Beitrag von Carsten Hölscher »

Scherung sollte sich auh im Handumdrehen in den aktuellen Editor einbauen lassen. Sonst stimme ich auch Rolands Ansatz zu.

Carsten

Benutzeravatar
Christian Gründler
Beiträge: 2209
Registriert: 04.10.2003 13:27:48
Wohnort: Brühl (Baden)

#11 Beitrag von Christian Gründler »

Carsten Hölscher hat geschrieben:Scherung sollte sich auch im Handumdrehen in den aktuellen Editor einbauen lassen.
:tup :applaus

Antworten