Frage: Umwandlung Spline in Bezierkurve?
Verfasst: 01.04.2019 09:36:28
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
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