 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 26.12.2006, 17:28 Titel: Splines |
|
|
Hallo,
ich habe mal versucht, mich in das Thema Splines einzulesen, komme dabei aber momentan nicht richtig weiter. Ich beziehe mich auf folgendes Tutorial: mathematik.de - Splines in Theorie und Praxis
Könnte mir jemand, der da einen etwas besseren Durchblick hat als ich, mal Schritt für Schritt erklären, wie man letztlich die Koordinaten des Splines berechnen kann? Also nicht unbedingt Code schreiben, sondern die Vorgehensweise ein bisschen idiotensicherer erklären? Schon gleich beim ersten, großen Gleichungssystem auf der verlinkten Seite kann ich z.B. die Indizierung der Vorfaktoren a nicht richtig nachvollziehen.
Ich poste das im FB-Forum, weil ich so eine Splinekurvenberechnung gerne in FB umsetzen würde. In meiner Wunschvorstellung würde ich gerne sowas hier gebastelt bekommen:
Sprich zuerst Punkte festlegen und das Programm macht dann so eine schöne Splinekurve dadurch.
Viele Grüße & danke schon mal!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
|
Nach oben |
|
 |
helium

Anmeldungsdatum: 10.09.2004 Beiträge: 397 Wohnort: Leverkusen
|
Verfasst am: 26.12.2006, 20:05 Titel: |
|
|
Was verstehst du an den Indizes nicht. a eins drei mal x eins hoch drei plus a eins zwei mal x eins hoch 2 ...
a eins drei z.B. weil die Gleichung zum Punkt (x eins, y eins) gehört. die zweite Ziffer ist einfach eine Durchnummerierung, passend zum exponenten des x.
Wenn ich mich richtig erinnere bist du noch recht jung. Hattest du in der Schule schon Differenzialrechnung? Sonst wirst du mit den Aussagen über die Ableitungen vermutlich wenig anfangen können.
Ich weiß allerdings nicht, ob dich das ganze wirklich weiterbringt oder du nicht einfach nach fertigem Code für B-Splines suchen solltest und ihn dann gegebenenfalls nach Basic portierst.
Oder such einfach mal bei Wikipedia. Da findest du dann unter anderem:
Daraus bastelst du dann eine Funktion
Code: |
function b (j, n, t, k())
if n = 0 then
if k(j) <= t and t < k(j+1) ' habs k genannt, weil mir in basic t als variable und array nicht gefällt
b = 1
else
b = 0
else
b = ... ' suchs dir selbst zu sammen
end if
end function
|
Damit kannst du dir dann die Gewichtung für jeden Punkt berechnen lassen.
function berechnePunkt (u, punkteAnzahl, k(), punkt() as Punkt, p as Punkt) ' p ist die Ausgabe der Funktion, ich glaub in FB kann man auch direkt UDTs zurückgeben, kenn mich mit FB nicht aus
p.x=0
p.y=0
for i = 0 to punkteAnzahl
tmp = b(i, grad, u, k)
p.x = p.x + punkt(i).x * tmp
p.y = p.y + punkt(i).y * tmp
next
end function
Den Parameter u lässt du einfach von 0 bis 1 laufen. Ein bischen tricky ist das Array k.
Hab gerade leider keine Zeit das näher auszuführen. Es hat jedenfalls (Anzahl der Punkte) + (Grad der B-Splinekurve + 1) Elemente und die Werte sollten integes sein, die aufsteigend von 0 bis (Anzahl der Punkte) laufen.
bei sagen wir 8 Punkten und einer B-Spline dritten grades könnte das Beispiel so aussehen.
k(0) = 0
k(1) = 0
k(2) = 0
k(3) = 0
k(4) = 1
k(5) = 2
k(6) = 3
k(7) = 2
k( = 7
k(9) = 8
k(10) = 8
k(11) = 8
k(12) = 8
Experimentier damit einfach mal ein bischen rum. _________________ Bevor Sie aufhören sich körperlich zu betätigen sollten Sie ihren Doktor befragen. Körperliche Inaktivität ist abnormal und gefährlich für Ihre Gesundheit. |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 26.12.2006, 20:59 Titel: |
|
|
@MisterD: Danke für das Material! Die Programmiersprache auf den Seiten ist ...naja... alles andere als übersichtlich, aber ich hab's portiert bekommen: *freu*
Code: | TYPE Punkt
X AS Single
Y AS Single
END TYPE
DECLARE Sub ZeichneDreieck(P1 As Punkt, P2 As Punkt, P3 AS Punkt)
DECLARE FUNCTION Mittelpunkt(byval P1 As Punkt, byval P2 As Punkt) As Punkt
DECLARE FUNCTION KleinGenug(P1 As Punkt, P2 As Punkt, P3 As Punkt) As Integer
DECLARE SUB ZeichneBezier(byval P1 As Punkt, byval P2 As Punkt, byval P3 As Punkt)
DIM p(1 to 3) as punkt
p(1).x = 50: p(1).y = 50
p(2).x = 150: p(2).y = 150
p(3).x = 250: p(3).y = 100
SCREEN 13,,,1
ZeichneBezier p(1),p(2),p(3)
SLEEP 3000
beep
ZeichneDreieck p(1),p(2),p(3)
SLEEP: END
SUB ZeichneDreieck(P1 As Punkt, P2 As Punkt, P3 AS Punkt)
LINE (FIX(P1.x),FIX(P1.y))-(FIX(P2.x),FIX(P2.y))
LINE (FIX(P2.x),FIX(P2.y))-(FIX(P3.x),FIX(P3.y))
LINE (FIX(P1.x),FIX(P1.y))-(FIX(P3.x),FIX(P3.y))
END SUB
FUNCTION Mittelpunkt(byval P1 As Punkt, byval P2 As Punkt) As Punkt
DIM result AS Punkt
result.x = P1.x + ((P2.x-P1.x)/2)
result.y = P1.y + ((P2.y-P1.y)/2)
Mittelpunkt = result
END FUNCTION
FUNCTION KleinGenug(P1 As Punkt, P2 As Punkt, P3 As Punkt) As Integer
DIM As Single a,b,c
a = SQR(ABS(P3.x-P2.x)^2+ABS(P3.y-P2.y)^2)
b = SQR(ABS(P2.x-P1.x)^2+ABS(P2.y-P1.y)^2)
c = SQR(ABS(P3.x-P1.x)^2+ABS(P3.y-P1.y)^2)
IF (a<=2) or (b<=2) or (c<=2) Then
KleinGenug = -1
ELSE
KleinGenug = 0
END IF
END FUNCTION
SUB ZeichneBezier(byval P1 As Punkt, byval P2 As Punkt, byval P3 As Punkt)
If KleinGenug(P1,P2,P3) Then
ZeichneDreieck P1,P2,P3
ELSE
'Hier wäre es bestimmt effizienter, die mehrfach benötigten Mittelpunkte zwischenzuspeichern.
ZeichneBezier P1,Mittelpunkt(P1,P2),Mittelpunkt(Mittelpunkt(P1,P2),Mittelpunkt(P2,P3))
ZeichneBezier Mittelpunkt(Mittelpunkt(P1,P2),Mittelpunkt(P2,P3)),Mittelpunkt(P2,P3),P3
END IF
END SUB |
Sieht doch auch schon mal nicht schlecht aus!
@helium: Danke auch dir für die Tipps. Ich werd das alles mal durchsehen und melde mich dann wieder.
Zitat: | Wenn ich mich richtig erinnere bist du noch recht jung. Hattest du in der Schule schon Differenzialrechnung? Sonst wirst du mit den Aussagen über die Ableitungen vermutlich wenig anfangen können. |
Ja, ich bin noch recht jung, aber die Grundlagen hatten wir schon.  _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 27.12.2006, 00:47 Titel: |
|
|
urgs warum vollbild aber gut, scheint ja geklappt zu haben. Und jetzt könntest du eben mehrere von den dingern so jeweils mit den mit mittel und endpunkt ineinander "verhaken" und damit versuchen, n spline zu erstellen.. dürfte funktionieren, hab aber kA wie's ergebnis dann ausschaut  _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|