kurven bzw. interpolation

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

DivineDominion

Betreff: kurven bzw. interpolation

BeitragDo, Dez 30, 2004 2:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Hebe bei der Suche nach "Kurven" Bezierkurven und Wurfparabeln gefunden, aber sowas wil ich eigentlich überhaupt nicht. Geht nämlich darum, dass von Punkt zu Punkt eine Bewegung in einer Kurve stattfindet.
Da ich Zeit meines Lebens noch keine Vektoren in der Schule gesehen habe, und daher meine Erfahrungen mit ebendiesen gleich 0 ist, und weil ich unter Polynom ein "Mehr-Substantiv" verstehe, wende ich mich einfach mal hierhin.

Im Chat gabs folgenden Link dazu:
http://astronomy.swin.edu.au/~...rpolation/
Sieht klasse aus.
Verstehe nur kein einziges Wort. Ich weiß nicht mal, was bei der linearen interpolation überhaupt zurückgeliefert wird und was zum Henker "mu" darstellt - abgesehen von etwas zwischen 1 und -1.

Sowas treibt mich zur weißglut, vor allem, wenn ich dann Kommentare wie "tja, bist halt dumm" bekomme statt Antworten. Darum Danke schon mal für jedwede Hilfe!
christian.tietze@gmail.com - https://christiantietze.de
macOS

Triton

BeitragDo, Dez 30, 2004 3:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ohne mir den Link durchgelesen und derartiges schonmal probiert zu haben:

Ich würde wohl als erstes diese linearen Linien zwischen den Punkten als
Ableitungen (3. Grades) von kubischen Funktionen sehen und dann versuchen daraus rückwirkend die Kurve zu ermitteln.

Muss ich morgen/heute mal auf nem Blatt Papier testen user posted image

gn8 erstma. Rolling Eyes
Coding: silizium-net.de | Portfolio: Triton.ch.vu

Vertex

BeitragDo, Dez 30, 2004 3:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Such mal bei BB.com da habe ich mit Markus die Beispiele dazu geschrieben. Da du mich gekickt hast, verlinke ich nicht direkt!
vertex.dreamfall.at | GitHub

Triton

BeitragDo, Dez 30, 2004 3:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach wie nett. Rolling Eyes
Coding: silizium-net.de | Portfolio: Triton.ch.vu

TheShadow

Moderator

BeitragDo, Dez 30, 2004 12:41
Antworten mit Zitat
Benutzer-Profile anzeigen
es gab einen sourcecode auf bb.com...

damit konnte man sogar soweit ich weiß das ganze inkl. beschleunigung berechnen

übrigens auf blitzbase.de - quellcodes ist es auch drauf

bezierspline.bb

nennt sich cubicspline

cubicspline(Xold,Yold,Xvelold,Yvelold,XNew,YNew,Xvelnew,Yvelnew,XAccelNew,YAccelNew,Time=3)
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

Ctuchik

BeitragDo, Dez 30, 2004 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Also hab mir den Text mal durchgelesen und schnell ein Beispiel gecodet!
Mit den Pfeiltasten rechts und links kann man zwischen linear und cosinus Methode umschalten! Die restlichen bau ich später ein!

EDIT: So, jetzt ist noch Cubic dabei!
EDIT2: und Hermite ist auch drin! Mit 1 und 2 lässt sich tension erhöhen und senken, mit 3 und 4 bias!

MfG Ctuchik

Code: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()

Type Point
  Field x%,y%
End Type

n.Point = New Point
n\x = 100
n\y = 100

n.Point = New Point
n\x = 200
n\y = 500

n.Point = New Point
n\x = 350
n\y = 200

n.Point = New Point
n\x = 400
n\y = 320

n.Point = New Point
n\x = 480
n\y = 555

n.Point = New Point
n\x = 610
n\y = 230

count = 0
fps$ = 0
t# = 0
b# = 0
timer = MilliSecs() + 1000
method = 1
name$ = "linear"

While Not KeyHit(1)

If MilliSecs() > timer Then
  fps$ = Str(count)
  count = 0
  timer = MilliSecs() + 1000
End If

Color 255,255,255
Text 10,30,"Fps: " + fps$
Text 10,50,"Methode: " + name$

If KeyHit(203)
  method = method - 1
  If method < 1 Then method = 1
End If
If KeyHit(205)
  method = method + 1
  If method > 4 Then method = 4
End If
If method = 4
 Text 200,30,"Tension: " + Str(t)
 Text 200,50,"Bias: " + Str(b)
 If KeyHit(2)
  t = t + 0.1
  If t > 1.0 t = 1.0
 End If
 If KeyHit(3)
  t = t - 0.1
  If t < -1.0 t = -1.0
 End If
 If KeyHit(4)
  b = b + 0.25
 End If
 If KeyHit(5)
  b  = b - 0.25
 End If
End If

Color 255,255,255
For p.Point = Each Point
  lastx = p\x
  lasty = p\y
  p2.Point = After p
  If p2 = Null Then Exit
  For x = p\x+4 To p2\x Step 4
    m# = 1.0 * (x-p\x) / (p2\x - p\x)
    Select method
    Case 1
      name$ = "linear"
      y = LinearInterpolate%(p\y,p2\y,m)
    Case 2
      name$ = "cosine"
      y = CosineInterpolate%(p\y,p2\y,m)
    Case 3
      name$ = "cubic"
      p0.Point = Before p
      If p0 = Null Then p0 = p
      p3.Point = After p2
      If p3 = Null Then p3 = p2
      y = CubicInterpolate(p0\y,p\y,p2\y,p3\y,m)
    Case 4
      name$ = "hermite"
      p0.Point = Before p
      If p0 = Null Then p0 = p
      p3.Point = After p2
      If p3 = Null Then p3 = p2
      y = HermiteInterpolate(p0\y,p\y,p2\y,p3\y,m,t,b)
    End Select
    Line lastx, lasty,x,y
    lastx = x
    lasty = y
    If x+4 > p2\x And x+4 < p2\x+4 Then x = p2\x-4
  Next
Next

For p.Point = Each Point
 Color 255,0,0
  Rect p\x-3,p\y-3,5,5
Next

Flip 0
Cls

count = count + 1

Wend

End

Function CosineInterpolate%(y1,y2,mu#)
  mu2# = (1-Cos(mu*180))/2
  py# = y1*(1-mu2)+y2*mu2
  Return Int(py)
End Function

Function LinearInterpolate%(y1,y2,mu#)
  py# = y1*(1-mu)+y2*mu
  Return Int(py)
End Function

Function CubicInterpolate(y0,y1,y2,y3,mu#)
   mu2# = mu*mu
   a0# = y3 - y2 - y0 + y1
   a1# = y0 - y1 - a0
   a2# = y2 - y0
   a3# = y1

   py# = a0*mu*mu2+a1*mu2+a2*mu+a3
   Return Int(py)
End Function

;   Tension: 1 is high, 0 normal, -1 is low
;   Bias: 0 is even,
;         positive is towards First segment,
;         negative towards the other

Function HermiteInterpolate%(y0,y1,y2,y3,mu#,tension#,bias#)
   mu2# = mu * mu
   mu3# = mu2 * mu
   m0#  = (y1-y0)*(1+bias)*(1-tension)/2
   m0# = m0# + (y2-y1)*(1-bias)*(1-tension)/2
   m1#  = (y2-y1)*(1+bias)*(1-tension)/2
   m1# = m1# +  (y3-y2)*(1-bias)*(1-tension)/2
   a0# =  2*mu3 - 3*mu2 + 1
   a1# =    mu3 - 2*mu2 + mu
   a2# =    mu3 -   mu2
   a3# = -2*mu3 + 3*mu2

   py# = a0*y1+a1*m0+a2*m1+a3*y2
   Return Int(py)
End Function
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle!
Fraget euren Arzt oder Apotheker!

DivineDominion

BeitragFr, Dez 31, 2004 0:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Und das kam dir einfach mal so, ganz spontan?! Shocked Oh je, langsam habe ich das Gefühl, vertex Urnecht getan zu haben, als er behauptete, dass ich dumm sei Wink BladeRunner machte mir auch schon solche Beispiele, ganz spontan. Hmm wahrscheinlich ist's mir vergönnt. Verstehe nicht was da passiert, diese kryptischen 3-zeichen-variablen verwirren mich dann nur vollends.
Danke für die Mühe aber! Ich werd mich wohl mal damit auseinandersetzen. Vielleicht hilft ja ausdrucken.
christian.tietze@gmail.com - https://christiantietze.de
macOS
 

feider

ehemals "Decelion"

BeitragFr, Dez 31, 2004 0:42
Antworten mit Zitat
Benutzer-Profile anzeigen
WOW Shocked

Vertex

BeitragFr, Dez 31, 2004 0:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Ahh, das war sarkastisch gemeint! Eine normale Linienformel ist z. B. g : x = p+s*u
Wobei p der Startpunkt der Linie ist(2D Vektor mit X und Y Koordinaten) und u der Richtungsvektor der die Richtung sowie die Länge angibt(über x, p und u fehlen solche pfeile die einen Vektor kennzeichnen).
Bei p = (2, 3) und u = (6, 8) startet die Linie ab dem Punkt 2, 3 und endet bis zum Endpunkt 2+6, 3+8. Der Parameter s geht von 0.0 bis 1.0. Zeichnest du den Vektor x ein (also in der Art plot x.x x.y)in einer Schleife die s von 0.0 bis 1.0 zählt, zeichnest du damit die komplette Linie.

Genauso funktioniert das auch mit den Funktionen für Cosineinterpolation usw.

MU# geht von 0.0 bis 1.0 und zeichnet in diesem Interval die komplette Kurve. Die Y Variablen sind halt die Stützpunkte für die jeweiligen Kurven, MU# steht dann für das Parameter s, Bias gibt dann an wie sich die Kurve um den Stützpunkt legt, ob mehr hinter < 0 oder mehr vor > 0 dem Stützpunkt(so eine Art Verschiebung). Tension dürfte dann eine Art Auschlagsamplitude für die Kurve sein.

mfg olli
vertex.dreamfall.at | GitHub

Ctuchik

BeitragFr, Dez 31, 2004 2:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Und das kam dir einfach mal so, ganz spontan?! Oh je, langsam habe ich das Gefühl, vertex Urnecht getan zu haben, als er behauptete, dass ich dumm sei BladeRunner machte mir auch schon solche Beispiele, ganz spontan. Hmm wahrscheinlich ist's mir vergönnt. Verstehe nicht was da passiert, diese kryptischen 3-zeichen-variablen verwirren mich dann nur vollends.

Also ich fand das auf der Seite gut erklärt und die eigentlichen Funktionen musst du ja auch nicht verstehen, die sind ja da angegeben und ich hab sie einfach in BB übernommen! Man muss nur die generelle Vorgehensweise verstehen, nämlich, dass jeweils der Bereich zwischen zwei Punkten betrachtet wird. mu ist dann quasi die x-Achse in diesem Bereich und die y-Werte werden von der Funktion berechnet, die wiederum zur Berechnung noch die y-Werte der beiden Punkte (bzw. 4 Punkte bei Cubic und Hermite) benötigt!
Wenn man das verstanden hat ist das coden eigentlich kein Problem mehr!
Zu den Nebenwirkungen gehören trockener Mund, Übelkeit, Erbrechen, Harnstau, schmerzhafter rektaler Juckreiz, Halluzinationen, Demenz, Psychose, Koma, Tod und Mundgeruch!
Magie eignet sich nicht für alle!
Fraget euren Arzt oder Apotheker!

TheShadow

Moderator

BeitragFr, Dez 31, 2004 15:48
Antworten mit Zitat
Benutzer-Profile anzeigen
manche funktionen muss man nicht verstehen (auch wenn diese hier nicht gerade kompliziert sind - es ist einfach eine "Formel") - idealerweise benutzt man solche Funktionen nur nach black-box-prinzip. Eingabe rein, Ausgabe raus... Was da genau passiert kann man vernachlässigen - es sei denn, man möchte bestimmte Teile davon verstehen...
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

DivineDominion

BeitragFr, Dez 31, 2004 21:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, ja gut, ich finde es nur irgendwie etwas umständlich, so viel Code um ein bild eine Kurve fliegen zu lassen, da muss doch Sinn hinter stecken Smile
christian.tietze@gmail.com - https://christiantietze.de
macOS

Vertex

BeitragSa, Jan 01, 2005 14:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich erklähr dir ersteinmal die Linearinterpoaltion, denn das ist ja die einfachste Form die Interpolation die z. B. bei Milkshape3D zwischen den Keyframes auch benutzt wird.

Y1*(1-MU#)+Y2*MU#

Als erstes klähren wir, was die Variablen zu bedeuten haben:
user posted image

Y1 ist die Y Koodinate vom Punkt1 und Y2 ist die Y Koordinate vom Punkt2

MU# ist der Interpolationsparameter. Die Interpolationskurven erstrecken sich in einem Interval von [0.0 ; 1.0] (d. h. 0.0 und 1.0 sind mit in dem Intervall eingeschlossen). MU# fährt dann die Kurve(Linie hier) von 0.0 bis 1.0 komplett ab.
Das erreichst du in Blitz mit einer For - Next - Schleife:
Code: [AUSKLAPPEN]
For MU# = 0.0 To 1.0 Step 0.01
   ; Zeichne interpolierten Kurvenpunkt zum Zeitpunkt MU#
Next


Weiter geht es zu der Formel selbst. Sie beinhaltet 2 Teilterme: Y1*(1-MU#) und Y2*MU#

user posted image

Wenn wir das ganze mal im Interval [0.0 ; 1.0] betrachten, hat der erste Term zum Zeitpunkt MU# = 0.0 den Wert Y1. Zum Zeitpunkt MU# = 0.5 den Wert Y1/2 und zum Zeitpunkt MU# = 1.0 den Wert 0.
1.0-MU# bedeutet, das MU# umgekehrt wird. MU# geht ja nur von 0.0 bis 1.0. Bei MU# = 1.0 ergibt das 1.0 - 1.0 = 0.0 und bei MU# = 0.0 ergibt 1.0 - 0.0 = 1.0 das.

Beim zweitem wird MU# nicht umgekehrt, er wird einfach so gelassen(der Zeitpunkt oder Parameter wie man es nennen mag). Wenn MU# = 0.0 ist, dann liefert der zweite Term den Wert 0. Bei MU# = 0.5 liefert der term den Wert Y2/2 und bei MU# = 1.0 den Wert Y2.

Wo der erste Term bei ansteigenden MU# abnimmt, steigt der zweite Term auf.

Um aus den beiden Termen wieder eine Einheit zu bilden, addiert man sie miteinander. Was praktisch bei dem einem zu wneig ist, wird vom anderen dazu addiert. Bei MU# < 0.5 ist der erste Term dominierend und bei MU# > 0.5 ist der zweite Term dominierend.

So ich hoffe du hast es jetzt so verstanden.

mfg olli

Edit:
Hier noch der Code dazu:
Code: [AUSKLAPPEN]
Graphics 640, 480, 32, 2
SetBuffer FrontBuffer()

X1 =  50 : Y1 = 132
X2 = 130 : Y2 = 110

Oval X1-2, Y1-2, 4, 4
Oval X2-2, Y2-2, 4, 4

For MU# = 0.0 To 1.0 Step 0.001
   X = (X2-X1)*MU# + X1
   Y = Y1*(1.0-MU#) + (Y2*MU#)
   
   Plot X, Y
   Delay 1
Next

WaitKey
vertex.dreamfall.at | GitHub

DivineDominion

BeitragSa, Jan 01, 2005 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Super erklärung, danke sehr! Ich mach mich heute Nachmittag dann mal ernsthaft dran!
christian.tietze@gmail.com - https://christiantietze.de
macOS

TheShadow

Moderator

BeitragSo, Jan 02, 2005 19:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Y1*(1-MU#)+Y2*MU#

ist schwerer zu verstehen als das hier:

Y1+(Y2-Y1)*MU#
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2

faeX

Betreff: Kleine, aber unwichtige Verbesserung

BeitragSa, Dez 20, 2008 21:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab' als ich mich an den alten Thread gesehen mich kurz drangesetzt und das ganze etwas benutzerfreundlicher gemacht (man kann die Koordinaten jetzt selbst bestimmen).

Das geht ganz einfach:

1. Cursor zur neuen Stelle bewegen
2. Klicken

Dies wiederholt man bis alle Punkte gesetzt sind. Dann drückt man ENTER oder ESC um ins bekannte zu kommen.

Code: [AUSKLAPPEN]
Graphics 800,600,16,2
SetBuffer BackBuffer()

Type Point
  Field x%,y%
End Type

Print "Bitte auf den Bildschirm klicken, um einen neuen Punkt zu platzieren!"

While Not KeyHit(1) Or KeyHit(28)

   If MouseHit(1) Then
      n.Point = New Point
      n\x = MouseX()
      n\y = MouseY()
      Color 255, 0, 0
        Rect MouseX()-3, MouseY()-3,5,5
      Color 255, 255, 255
      Print "Neuer Punkt an " + MouseX() + ", " + MouseY()
   EndIf

Wend

count = 0
fps$ = 0
t# = 0
b# = 0
timer = MilliSecs() + 1000
method = 1
name$ = "linear"

While Not KeyHit(1)

If MilliSecs() > timer Then
  fps$ = Str(count)
  count = 0
  timer = MilliSecs() + 1000
End If

Color 255,255,255
Text 10,30,"Fps: " + fps$
Text 10,50,"Methode: " + name$

If KeyHit(203)
  method = method - 1
  If method < 1 Then method = 1
End If
If KeyHit(205)
  method = method + 1
  If method > 4 Then method = 4
End If
If method = 4
 Text 200,30,"Tension: " + Str(t)
 Text 200,50,"Bias: " + Str(b)
 If KeyHit(2)
  t = t + 0.1
  If t > 1.0 t = 1.0
 End If
 If KeyHit(3)
  t = t - 0.1
  If t < -1.0 t = -1.0
 End If
 If KeyHit(4)
  b = b + 0.25
 End If
 If KeyHit(5)
  b  = b - 0.25
 End If
End If

Color 255,255,255
For p.Point = Each Point
  lastx = p\x
  lasty = p\y
  p2.Point = After p
  If p2 = Null Then Exit
  For x = p\x+4 To p2\x Step 4
    m# = 1.0 * (x-p\x) / (p2\x - p\x)
    Select method
    Case 1
      name$ = "linear"
      y = LinearInterpolate%(p\y,p2\y,m)
    Case 2
      name$ = "cosine"
      y = CosineInterpolate%(p\y,p2\y,m)
    Case 3
      name$ = "cubic"
      p0.Point = Before p
      If p0 = Null Then p0 = p
      p3.Point = After p2
      If p3 = Null Then p3 = p2
      y = CubicInterpolate(p0\y,p\y,p2\y,p3\y,m)
    Case 4
      name$ = "hermite"
      p0.Point = Before p
      If p0 = Null Then p0 = p
      p3.Point = After p2
      If p3 = Null Then p3 = p2
      y = HermiteInterpolate(p0\y,p\y,p2\y,p3\y,m,t,b)
    End Select
    Line lastx, lasty,x,y
    lastx = x
    lasty = y
    If x+4 > p2\x And x+4 < p2\x+4 Then x = p2\x-4
  Next
Next

For p.Point = Each Point
 Color 255,0,0
  Rect p\x-3,p\y-3,5,5
Next

Flip 0
Cls

count = count + 1

Wend

End

Function CosineInterpolate%(y1,y2,mu#)
  mu2# = (1-Cos(mu*180))/2
  py# = y1*(1-mu2)+y2*mu2
  Return Int(py)
End Function

Function LinearInterpolate%(y1,y2,mu#)
  py# = y1*(1-mu)+y2*mu
  Return Int(py)
End Function

Function CubicInterpolate(y0,y1,y2,y3,mu#)
   mu2# = mu*mu
   a0# = y3 - y2 - y0 + y1
   a1# = y0 - y1 - a0
   a2# = y2 - y0
   a3# = y1

   py# = a0*mu*mu2+a1*mu2+a2*mu+a3
   Return Int(py)
End Function

;   Tension: 1 is high, 0 normal, -1 is low
;   Bias: 0 is even,
;         positive is towards First segment,
;         negative towards the other

Function HermiteInterpolate%(y0,y1,y2,y3,mu#,tension#,bias#)
   mu2# = mu * mu
   mu3# = mu2 * mu
   m0#  = (y1-y0)*(1+bias)*(1-tension)/2
   m0# = m0# + (y2-y1)*(1-bias)*(1-tension)/2
   m1#  = (y2-y1)*(1+bias)*(1-tension)/2
   m1# = m1# +  (y3-y2)*(1-bias)*(1-tension)/2
   a0# =  2*mu3 - 3*mu2 + 1
   a1# =    mu3 - 2*mu2 + mu
   a2# =    mu3 -   mu2
   a3# = -2*mu3 + 3*mu2

   py# = a0*y1+a1*m0+a2*m1+a3*y2
   Return Int(py)
End Function

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group