Seite 1 von 1

Frage: Umwandlung Spline in Bezierkurve?

Verfasst: 01.04.2019 09:36:28
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

Re: Frage: Umwandlung Spline in Bezierkurve?

Verfasst: 01.04.2019 13:47:58
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

Re: Frage: Umwandlung Spline in Bezierkurve?

Verfasst: 01.04.2019 15:59:39
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...

Re: Frage: Umwandlung Spline in Bezierkurve?

Verfasst: 01.04.2019 18:18:34
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