Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Splines

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 26.12.2006, 17:28    Titel: Splines Antworten mit Zitat

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? lächeln Schon gleich beim ersten, großen Gleichungssystem auf der verlinkten Seite kann ich z.B. die Indizierung der Vorfaktoren a nicht richtig nachvollziehen. neutral

Ich poste das im FB-Forum, weil ich so eine Splinekurvenberechnung gerne in FB umsetzen würde. lächeln 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. happy

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 26.12.2006, 19:02    Titel: Antworten mit Zitat

ich würde fast vermuten, dass ganze läuft wie bei beziers auch. Ich verlink dir mal n aufgabenblatt von meinem studium, da sind quadratische und kubische beziers erklärt, das müsste sich mit n bisschen köpfchen auf splines übertragen lassen..
Aufgabe: http://www.mis.informatik.tu-darmstadt.de/Education/Courses/GDI1/uebungen/gdi-u04-a.pdf
Lösungvorschlag: http://www.mis.informatik.tu-darmstadt.de/Education/Courses/GDI1/uebungen/gdi-u04-m.pdf
Crashkurz zum Zeichen-package: http://www.mis.informatik.tu-darmstadt.de/Education/Courses/GDI1/templates/draw.pdf

das ist zwar alles in scheme, ein Lisp-verwandter (sichtbar an den vielen klammern happy ) aber das kriegst du denke ich nach basic portiert. bei fragen meld dich einfach
grundsätzlicher scheme-aufruf: (befehl/funktionsname [parameter1 [parameter2 [parameter3 [..]]]])
und ein (cond [a b] [c d]) ist übersetzt "if a then b elseif c then d" usw.
wie gesagt, bei fragen einfach melden.
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden
helium



Anmeldungsdatum: 10.09.2004
Beiträge: 397
Wohnort: Leverkusen

BeitragVerfasst am: 26.12.2006, 20:05    Titel: Antworten mit Zitat

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(cool = 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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 26.12.2006, 20:59    Titel: Antworten mit Zitat

@MisterD: Danke für das Material! lächeln 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! happy

@helium: Danke auch dir für die Tipps. Ich werd das alles mal durchsehen und melde mich dann wieder. lächeln
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. lächeln
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 27.12.2006, 00:47    Titel: Antworten mit Zitat

urgs warum vollbild durchgeknallt 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 lächeln
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz