kurven bzw. interpolation
Übersicht

![]() |
DivineDominionBetreff: kurven bzw. interpolation |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() gn8 erstma. ![]() |
||
Coding: silizium-net.de | Portfolio: Triton.ch.vu |
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ach wie nett. ![]() |
||
Coding: silizium-net.de | Portfolio: Triton.ch.vu |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Und das kam dir einfach mal so, ganz spontan?! ![]() ![]() 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 |
feiderehemals "Decelion" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
WOW ![]() |
||
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
![]() |
Vertex |
![]() Antworten mit Zitat ![]() |
---|---|---|
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: ![]() 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# ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Super erklärung, danke sehr! Ich mach mich heute Nachmittag dann mal ernsthaft dran! | ||
christian.tietze@gmail.com - https://christiantietze.de
macOS |
![]() |
TheShadowModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Y1*(1-MU#)+Y2*MU#
ist schwerer zu verstehen als das hier: Y1+(Y2-Y1)*MU# |
||
AMD64 3500+ | GeForce6600GT 128MB | 1GB DDR | WinXPsp2 |
![]() |
faeXBetreff: Kleine, aber unwichtige Verbesserung |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group