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
Frage: Umwandlung Spline in Bezierkurve?
- Jens Haupert
- Beiträge: 4927
- Registriert: 23.03.2004 14:44:34
- Aktuelle Projekte: http://www.zusidisplay.de
- Wohnort: Berlin
- Kontaktdaten:
- 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?
Hi.
Schau dir Mal den Wine-Sourcecode der GDI+ Funktion GdipDrawCurve2 an. Der gibt die vielleicht schon die notwendigen Denkanstöße!?
Gruß
Max
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
Re: Frage: Umwandlung Spline in Bezierkurve?
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...
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
- Jens Haupert
- Beiträge: 4927
- Registriert: 23.03.2004 14:44:34
- Aktuelle Projekte: http://www.zusidisplay.de
- Wohnort: Berlin
- Kontaktdaten: