Frage: Umwandlung Spline in Bezierkurve?

Über alles nicht so Wichtige was aber irgendwie mit Bahn und Zusi zu tun hat. Viel Spaß beim Plaudern.
Antworten
Nachricht
Autor
Benutzeravatar
Jens Haupert
Beiträge: 4920
Registriert: 23.03.2004 14:44:34
Aktuelle Projekte: http://www.zusidisplay.de
Wohnort: Berlin
Kontaktdaten:

Frage: Umwandlung Spline in Bezierkurve?

#1 Beitrag von Jens Haupert »

Hallo,

ich habe eine mathematisch/technische Frage, die ich hier stellen möchte. Zum Hintergrund: im Augenblick entsteht eine neue Version des Gleisplaneditors, der nicht mehr auf dem veralteten .net 1.1-Framework aufsetzt. Zu diesem Zweck wurde auch die Darstellung des Gleisplans von GDI(+) auf Direct2D umgestellt.

Hierbei ergibt sich nun allerdings folgendes Problem. Der bisherige Gleisplaneditor speichert und verarbeitet Weichen als sog. „cardinal spline“. Dabei handelt sich um eine Punktliste und einen „tension“-Wert, der angibt wie ausgerundet sich die Kurve um die Punktliste schlängelt.
Hierzu hat der alte Editor unter .net die Funktion Graphics.DrawCurve(Pen, Point[], Single) benutzt (siehe hier: https://docs.microsoft.com/de-de/dotnet ... em_Single_" target="_blank).

Diese Funktion steht unter Direct2D allerdings nicht mehr zur Verfügung. Die dort genutzt Repräsentation ID2D1GeometrySink (siehe hier: https://docs.microsoft.com/en-us/window ... ometrysink" target="_blank) kann nur sog. „cubic bezier“-Kurven darstellen.
Daraus folgt (und ist damit auch die Empfehlung, die man überall liest), dass man die Zusi-Darstellung der Spline in eine Bezier Kurve umwandeln muss, um diese darzustellen. Diese Umwandlung ist mathematisch wohl vom Prinzip her kein Problem, mir erscheint es allerdings sehr kompliziert zu sein.

Daher die Frage an unsere Experten: gibt es (a) eine Bibliothek, die die Umwandung in Delphi durchführen kann oder (b) kann jemand eine Delphi-Funktion erstellen und bereitstellen, die die Umwandlung durchführen kann?

Besten Dank.

Viele Grüße
Jens

Benutzeravatar
Max Senft
Administrator
Beiträge: 3004
Registriert: 04.11.2001 14:01:40
Aktuelle Projekte: Dies und das
Wohnort: Blieskastel, Saarland, Deutschland
Kontaktdaten:

Re: Frage: Umwandlung Spline in Bezierkurve?

#2 Beitrag von Max Senft »

Hi.

Schau dir Mal den Wine-Sourcecode der GDI+ Funktion GdipDrawCurve2 an. Der gibt die vielleicht schon die notwendigen Denkanstöße!?

Gruß
Max
Administrator, Programmierer, Ansprechpartner bei Problemen mit dem Board

Benutzeravatar
F. Schn.
Beiträge: 6686
Registriert: 24.10.2011 18:58:26

Re: Frage: Umwandlung Spline in Bezierkurve?

#3 Beitrag von F. Schn. »

Ehrlich gesagt: Wo genau siehst du denn den Aufwand bei der Umwandlung? Wenn ich den WP-Artikel lese, ist das doch nur etwa 5 Zeilen Code?

Man definiert sich zuerst die "Steigung": M := (P - P[i-1]) / 2 + (P[i+1] - P) / 2
Bzw vereinfacht: M := (P[min(count-1, i+1)] - P[max(0, i-1)]) / 2

Und hat dann für die Kurve zwischen den Punkten i und i+1 die vier Punkte
P
P + M/3
P[i+1] - M[i+1]/3
P[i+1]

PS: Interessant zu sehen, dass man mit Direct2D Windows XP jetzt doch allmählich abschafft. :) Aber wie gesagt, bei den Editoren und Zusi selbst habe ich damit kein Problem, nur ZD ist so ein Thema...
Diese Signatur möchte folgendes bekannter machen: ZusiWiki · ZusiSK: Streckenprojekte · YouTube: Objektbau für Zusi · euirc: Zusi-Chat

Benutzeravatar
Jens Haupert
Beiträge: 4920
Registriert: 23.03.2004 14:44:34
Aktuelle Projekte: http://www.zusidisplay.de
Wohnort: Berlin
Kontaktdaten:

Re: Frage: Umwandlung Spline in Bezierkurve?

#4 Beitrag von Jens Haupert »

Hallo,

besten Dank an Max und F. Schn. für die Hinweise. Ich konnte die Umwandlung nun umsetzen.

Anbei ein Beispiel mit der Darstellung als Spline (schwarz) und Bezierkurve (rot):
Bild

Da man eine komplette Überdeckung hat, halte ich das Problem für gelöst.

Grüße
Jens

Antworten