Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Spline Linien zeichnen (https://www.delphipraxis.net/113502-spline-linien-zeichnen.html)

Christian18 8. Mai 2008 19:18


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

TonyR 8. Mai 2008 20:05

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);

Christian18 8. Mai 2008 20:07

Re: Spline Linien zeichnen
 
nein, ich will diese linien so verbinden, das rundungen entstehen. bsp. die bei einer sin kurve.

lg chris

TonyR 8. Mai 2008 20:16

Re: Spline Linien zeichnen
 
Achso, jetzt verstehe ich was du meinst ...

Musst mal die Suche anwerfen, da hast du dir ja was vorgenommen: http://www.delphipraxis.net/internal...ghlight=spline

Hier im Forum suchenspline

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.

Phantom1 8. Mai 2008 20:20

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.

Fussball-Robby 8. Mai 2008 20:28

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:

alzaimar 8. Mai 2008 22:00

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.

Medium 9. Mai 2008 02:00

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 diese Seite z.B. recht informativ.

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 dieser Seite des gleichen Autors schön beschrieben sind. Zudem gibts zu jeder Variante auch noch C-Fetzen, die sich mit minmalem Aufwand übersetzen lassen. Das wäre für deinen Fall denke ich der sinnvollste Weg. Beziér-Splines setzt man üblicherweise dort ein, wo man durch die Kontrollpunkte dem User ein Maß an Interaktivität bieten will, wie z.B. in Grafikprogrammen bzw. DTP, oder im CAD Bereich. Für "nur" interpolieren finde ich sie etwas Overkill.

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.

alzaimar 9. Mai 2008 06:57

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.

bitboy0 9. Mai 2008 18:02

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 06:19 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz