![]() |
Spline Linien zeichnen
Hallo,
ich habe punkte und möchte zu diesen punkten Spline Linien ziehen. Wie kann ich das machen? Gibt es in Delphi schon eine fertige funktion dafür? MFG Christian18 |
Re: Spline Linien zeichnen
Wie meinst du das mit den Punkten?
Willst du graphisch in einer Art Koordinatensystem Linien zeichnen? Wenn ja dann müsstest du das mit dem Canvas eines Images oder gleich der Form machen.
Delphi-Quellcode:
image1.canvas.moveto(x,y);
image1.canvas.lineto(x,y); |
Re: Spline Linien zeichnen
nein, ich will diese linien so verbinden, das rundungen entstehen. bsp. die bei einer sin kurve.
lg chris |
Re: Spline Linien zeichnen
Achso, jetzt verstehe ich was du meinst ...
Musst mal die Suche anwerfen, da hast du dir ja was vorgenommen: ![]() ![]() Edit: Wenn es bloß so wie sinus sein soll, dann wär das ja einfach denke ich ... erster Punkt ist der start-Punkt und der zweite die erste Nullstelle ... dann nur noch die Sinud-Funktion vershcieben und du kannst zu beliebigen X die Y-Werte auslesen. |
Re: Spline Linien zeichnen
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ein beispiel projekt, wo man per hand/maus einen spline zeichnen kann, mit sourcecode.
|
Re: Spline Linien zeichnen
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich mache soetwas immer mit Bezierkurven. Ist ganz simpel. Hab auch mal schnell ein kleines Beispiel getippt :wink:
|
Re: Spline Linien zeichnen
Liste der Anhänge anzeigen (Anzahl: 1)
Zwischen je zwei Punkten wird ein Polynom 3.Grades gelegt. Die einzelnen Polynome berühren sich also an den Punkten. Wenn man für den ersten und letzten Punkt der Punkteschar eine Vereinfachung vornimmt, erhält man ein Gleichungssystem, mit dem man die Koeffizienten der N-1 Polynome berechnen kann.
Dann hat man bei N Punkten also N-1 Polynome mit jeweils 4 Koeffizienten. Damit lässt sich wunderbar eine glatte Kurve zeichnen, die durch alle Punkte geht. Ich habe ein uralt-Projekt aus DOS-Zeiten, wo ich das mal implementiert habe. Ich habs eben mal an Delphi angepasst, aber nur wenig getestet. Probierts aus. Edit: Eben den Code von Fussball-Robby gesehen. Eine Bezier-Kurve ist eine Ausgleichskurve, sie berührt nur den ersten und letzten Punkt. |
Re: Spline Linien zeichnen
Aber Vorsicht mit der Polynominterpolation! Sie wird zum einen ziemlich aufwendig mit steigender Punktzahl, und neigt zum anderen sehr zum "Überschwingen" je weiter ein Bereich vom Ursprung weg liegt. Sie lohnt sich im Grunde nur dann wirklich, wenn man vorher schon weiss, dass die Punkte Teile eines Polynoms n-ten Grades ist. Im allgemeinen Fall bietet sie mit steigender Wertemenge eine schlechtere Rekonstruktion.
Beziér-Splines eignen sich schon recht gut dafür, allerdings legt man normalerweise nicht ein Spline durch alle Punkte (eben weil die inneren nur approximiert werden), sondern man stückelt zwischen je 2 benachbarten Punkten. Die dann fehlenden (zwei inneren) "Kontrollpunkte" werden dann aus den je umgebenden Punkten abgeleitet, um zum einen differenzierbare Übergänge zu erhalten, und zum anderen möglichst gut die Tangente an den Grenzen nachzubilden. Zu Splines finde ich ![]() Für eindimensionale Reihen von Messwerten eignen sich, nicht zuletzt wegen deutlicher Einfachheit im Vergleich, ein paar andere Interpolationsverfahren, von denen die mit wichtigsten auf ![]() Edit: Die letztgenannten Varianten sind allerdings auch nicht alle immer generell geeignet. Bei der Kosinusinterpolation z.B. ergeben sich manchmal unschöne Übergänge, da die Kurve an den Messpunkten stets waagerecht verläuft. Daher eignet sie sich eigentlich nur für Fälle, in denen die Messpunkte lokale Extrema oder Wendestellen sind. Auch schwingt die kubische Variante mitunter gelegentlich über, wenn die Werte in Y-Richtung stark schwanken. |
Re: Spline Linien zeichnen
Hallo Medium, meine Demo verwendet kein Polynom N-1.ten Grades sondern N-1 Polynome 3.ten Grades, da kann nur dann etwas 'überschwingen', wenn die Punkte auseinanderiegen und(!) eine starker Wechsel in der 1.Ableitung zu verzeichnen ist (z.B. erst geradeaus, dann steil nach oben). Wenn man innerhalb des Wechsels zu wenig Punkte hat, holt der Spline quasi von unten Schwung...
Grundsätzlich gilt: Wer eine Regression wagt, ohne die mathematisch/physikalischen Zusammenhänge zu kennen, gehört geteert und gefedert. Deine Anmerkungen zu Bezier-Splines decken sich mit dem von mir geposteten Verfahren, nur das nicht die 1.Ableitung (Kontrollpunkte) interpoliert werden, sondern die 2.Ableitung. Im Grunde genommen genau das Gleiche, nur eben analytisch und nicht geometrisch. |
Re: Spline Linien zeichnen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo erstmal... ;)
Ich bin zwar immer mal wieder mit Delphi in Berührung gekommen, aber ich habe nur wenig Erfahrung. Ich muss auch relativ oft nach Befehlen und Objekteigenschaften suchen weil ich einfach zu wenig Routine habe... Aktuell möchte ich ein Tool basteln mit dem man fehlende Samples in RIFF/WAV-Dateien "repariert" ... ich bin jetzt so weit das ich die Stellen finde an denen mein DAT-Recorder aufgrund von kleineren Bandfehlern einfach ein paar mal nacheinander das gleiche Sample schickt und dann plötzlich wieder richtig weiter macht ... Die Fehlstellen sind meist nur 5-20 Samples lang und die Form der Kurve ist dadurch nicht besonders komplex. Ich habe also ZWEI Punkte und jeweils auch einen gültigen Punkt jeweils vor dem ersten Punkt und nach dem zweiten Punkt ... so kann ich die Steigung bestimmen die die Reparaturkurve dort jeweils haben soll. es gibt nun folgende Möglichkeit: 1. Es fehlt die "Bergkuppe" der Wellenform ... also wie digitales Klipping. 2. Es fehlt ein Teil des "Berghanges" der Wellenform. 3. es fehlt ein Teil des "Berghanges" der Wellenform in dem die Kurve noch zwei mal die Richtung geändert hat. Ich hab das mal als Bild angehängt damit man versteht was ich meine. Mathe ist wirklich nicht so meine Sache ... und wenn überhaupt dann eher die linearen Sachen... Also ob man jetzt Splines ziehen muss oder Beziers oder ob es noch andere Ideen gibt weis ich nicht. Ganz prima wäre ein bisschen "Nachhilfe" in Mathe ;) Wenn ich erst mal eine Funktion habe kann ich die auch umsetzten ... aber alleine werde ich sicher nicht zu so einer Funktion kommen. gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz