AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Spline Linien zeichnen

Ein Thema von Christian18 · begonnen am 8. Mai 2008 · letzter Beitrag vom 16. Mai 2008
Antwort Antwort
Seite 1 von 3  1 23   
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#1

Spline Linien zeichnen

  Alt 8. Mai 2008, 20:18
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
  Mit Zitat antworten Zitat
Benutzerbild von TonyR
TonyR

Registriert seit: 17. Jun 2006
Ort: Bautzen
503 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Spline Linien zeichnen

  Alt 8. Mai 2008, 21:05
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);
Es ist unmöglich, witzig zu sein ohne ein bisschen Bosheit. Die Bosheit eines guten Witzes ist der Widerhaken, der ihn haften lässt. - Georg Christoph Lichtenberg
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#3

Re: Spline Linien zeichnen

  Alt 8. Mai 2008, 21:07
nein, ich will diese linien so verbinden, das rundungen entstehen. bsp. die bei einer sin kurve.

lg chris
  Mit Zitat antworten Zitat
Benutzerbild von TonyR
TonyR

Registriert seit: 17. Jun 2006
Ort: Bautzen
503 Beiträge
 
FreePascal / Lazarus
 
#4

Re: Spline Linien zeichnen

  Alt 8. Mai 2008, 21:16
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.
Es ist unmöglich, witzig zu sein ohne ein bisschen Bosheit. Die Bosheit eines guten Witzes ist der Widerhaken, der ihn haften lässt. - Georg Christoph Lichtenberg
  Mit Zitat antworten Zitat
Phantom1

Registriert seit: 20. Jun 2003
282 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Spline Linien zeichnen

  Alt 8. Mai 2008, 21:20
Hier ein beispiel projekt, wo man per hand/maus einen spline zeichnen kann, mit sourcecode.
Angehängte Dateien
Dateityp: zip drawspline_130.zip (211,7 KB, 204x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Spline Linien zeichnen

  Alt 8. Mai 2008, 21:28
Also ich mache soetwas immer mit Bezierkurven. Ist ganz simpel. Hab auch mal schnell ein kleines Beispiel getippt
Angehängte Dateien
Dateityp: rar kurve_134.rar (162,0 KB, 187x aufgerufen)
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Spline Linien zeichnen

  Alt 8. Mai 2008, 23:00
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.
Angehängte Dateien
Dateityp: rar splines_205.rar (2,6 KB, 167x aufgerufen)
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Spline Linien zeichnen

  Alt 9. Mai 2008, 03:00
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Spline Linien zeichnen

  Alt 9. Mai 2008, 07:57
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
bitboy0

Registriert seit: 22. Jun 2006
Ort: Ladenburg
11 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Spline Linien zeichnen

  Alt 9. Mai 2008, 19:02
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ß
Miniaturansicht angehängter Grafiken
wav-fehler_171.gif  
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 Uhr.
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