Berzier-Kurven in 2D von walski / |
Da ich kaum Infos zu Bezier-Kurven in ner 2D Darstellung gefunden hab und Wunderkind mich drauf ansprach habe ich nach vielem rumfragen und fummeln mal das hier gebastelt: [code:1:5b1e1e21c5] ;eine kleine Bezier-Kurven 2D Demo ;(c) 2003 by walski ;Type der Kontroll Punkte ;X und Y sollten klar sein :) ;OX und OY sind die Originalen X- und Y-Werte, da X# und Y# später verändert werden ;und ich die eben backuppen muss. Kann man natürlich auch anders lösen... ;aber das is ne andre Geschichte! Type KontrollPunkt Field X#,Y# Field OX#,OY# End Type ;Hier speiße ich jetzt mal ein paar Punkte ein. Wichtig bei diesem System ist nur: ;Der erste Punkt der Liste ist der StartPunkt. ;Der letzte Punkt der Liste ist der EndPunkt. ;Alle andren Punkte dazwischen sind die sogenannten Kontrollpunkte zwischen denen die Linie ;verläuft KP.KontrollPunkt = New KontrollPunkt KPX# = 100 KPY# = 100 KPOX# = 100 KPOY# = 100 KP.KontrollPunkt = New KontrollPunkt KPX# = 500 KPY# = 100 KPOX# = 500 KPOY# = 100 KP.KontrollPunkt = New KontrollPunkt KPX# = 300 KPY# = 200 KPOX# = 300 KPOY# = 200 KP.KontrollPunkt = New KontrollPunkt KPX# = 500 KPY# = 400 KPOX# = 500 KPOY# = 400 ;So, damit man auch was sieht: Graphics 800,600,32,1 ;Der Paramter gibt die Auflösung an! Also wieviel Punkte gezeichnet werden von der Linie DrawBezier(1000) WaitKey() Function DrawBezier(res#) ;Ein BlitzArray das eben am Anfang die Types einmal aufnimmt. ;Das macht die Organisation einfacher, da später das jewils nachfolgende Objekt gefragt ist ;und ich das mit Before usw nicht so schön finde. Deshalb hier das TemporäreArray Local XTemp[10000],YTemp[10000] ;n gibt die Gesammtzahl aller Punkte an. n = 0 For KP.KontrollPunkt = Each KontrollPunkt n=n+1 XTemp[n] = KPOX# YTemp[n] = KPOY# ;Hier markiere ich mal die Punkte mitm Kreis Oval XTemp[n]-2,YTemp[n]-2,5,5,0 Next ;O.k. glaubt mir einfach das man n-1 nehmen muss :) n=n-1 ;Hier beginnt der eigentliche Algo des netten Herren "de Casteljau" ;Bitte fragt mich nicht wie er funktioniert *g ;Ich lege euch http://www.apm.tuwien.ac.at/docs/lva/mmgdv/k1___013.htm dafür ans Herz! For t = 1 To res - 1 For m = 1 To n For i = 1 To n - m + 1 XTemp[i] = t / res * XTemp[i + 1] + (1 - t / res) * XTemp[i] YTemp[i] = t / res * YTemp[i + 1] + (1 - t / res) * YTemp[i] Next Next ;Hier wird dann eben der Punkt gemalt. Plot XTemp[1],YTemp[1] ;Jetzt wird noch das oben angesprochene Backup zurückgeholt. n = 0 For KP.KontrollPunkt = Each Kontrollpunkt n=n+1 XTemp[n] = KPOX# YTemp[n] = KPOY# Next n=n-1 ;Und tada, Funktion durch! Next End Function [/code:1:5b1e1e21c5] Ich hoffe ich konnte wem helfen. walski |
von ??? |
hmm tja... http://www.blitzbase.de/quellcode/bezierspline.bb aber toll das du auch eine implementierung gemacht hast ^^ |
von ??? |
Das Beispiel bezieht nur 2 Kontrollpunkte ein, oder? Meins kann unendlich viele aufnehmen! walski |
Bezier 4 Punkt und über alle Punkte in 3D/2D von ??? |
Hab auch noch was dazu aber in 3D . 4 Punkt oder über alle wie man es braucht . Ist auch direkt mit Beispiel ohne das Z benutzt wird . [code:1:adaf25ab49] ;Bezier Interpolation BlitzBasic 3D Example from Markus Rauch ;MR 14.04.2003 ;-------------------------------------------------------- Graphics3D 800,600,16,0 SetBuffer BackBuffer() AppTitle " Bezier Interpolation BlitzBasic 3D Example from Markus Rauch" ;-------------------------------------------------------- Global camp=CreatePivot() Global cam=CreateCamera(camp) CameraZoom cam,1 CameraRange cam,1,10000 ;PositionEntity camp,-200,0,-200 ;TurnEntity camp,0,-45,0 PositionEntity camp,0,0,-200 TurnEntity camp,0,0,0 ;-------------------------------------------------------- Type Vector3D Field x#,y#,z# Field nx# Field ny# Field nz# End Type Dim ve.Vector3D(100) ve.Vector3D(0)=New Vector3D ve.Vector3D(1)=New Vector3D ve.Vector3D(2)=New Vector3D ve.Vector3D(3)=New Vector3D Global VectorMax=4 Global p.Vector3D=New Vector3D ve(0)x=-100 ve(0)y=-25 ve(0)z=0 VectorNormal ve(0),45,0,0 ve(1)x=-50 ve(1)y=25 ve(1)z=0 VectorNormal ve(1),45,0,0 ve(2)x=50 ve(2)y=-25 ve(2)z=0 VectorNormal ve(2),-45,0,0 ve(3)x=100 ve(3)y=25 ve(3)z=0 VectorNormal ve(3),-45,0,0 While Not KeyHit(1) RenderWorld ;-------------------- Moving Point (3) ;Local w# ;ve(3)x=50+Sin(w)*100 ;ve(3)y= 0+Cos(w)*100 ;w#=w#+1 :If w>360.0 Then w=w-360.0 ;-------------------- Color 255,255,0 Local mu# Local st#=0.01 mu=0.0 Repeat Bezier4 p,ve(0),ve(1),ve(2),ve(3),mu ;Only 4 Points ;Bezier p,mu ;All Points Plot3D p mu=mu+st If mu>1.0 Then Exit Forever ;Show all Points For v=0 To VectorMax-1 Color 128,128,128 Text3D ve(v),"V "+V Color 255,0,0 Plot3D ve(v) Next Flip Wend End ;########################################################################## Function Bezier3(p.Vector3D,p1.Vector3D,p2.Vector3D,p3.Vector3D,mu#) ;MR 13.04.2003 ;Three control point Bezier interpolation ;mu ranges from 0 To 1, start To End of curve Local mum1#,mum12#,mu2# mu2 = mu * mu mum1 = 1 - mu mum12 = mum1 * mum1 px = p1x * mum12 + 2 * p2x * mum1 * mu + p3x * mu2 py = p1y * mum12 + 2 * p2y * mum1 * mu + p3y * mu2 pz = p1z * mum12 + 2 * p2z * mum1 * mu + p3z * mu2 End Function Function Bezier4(p.Vector3D,p1.Vector3D,p2.Vector3D,p3.Vector3D,p4.Vector3D,mu#) ;MR 13.04.2003 ;Four control point Bezier interpolation ;mu ranges from 0 To 1, start To End of curve Local mum1#,mum13#,mu3# mum1 = 1.0 - mu mum13 = mum1 * mum1 * mum1 mu3 = mu * mu * mu px = mum13*p1x + 3.0*mu*mum1*mum1*p2x + 3.0*mu*mu*mum1*p3x + mu3*p4x py = mum13*p1y + 3.0*mu*mum1*mum1*p2y + 3.0*mu*mu*mum1*p3y + mu3*p4y pz = mum13*p1z + 3.0*mu*mum1*mum1*p2z + 3.0*mu*mu*mum1*p3z + mu3*p4z p x = mum13*p1 x + 3.0*mu*mum1*mum1*p2 x + 3.0*mu*mu*mum1*p3 x + mu3*p4 x p y = mum13*p1 y + 3.0*mu*mum1*mum1*p2 y + 3.0*mu*mu*mum1*p3 y + mu3*p4 y p z = mum13*p1 z + 3.0*mu*mum1*mum1*p2 z + 3.0*mu*mu*mum1*p3 z + mu3*p4 z End Function ;########################################################################## Function Bezier(p.Vector3D,mu#) ;MR 14.04.2003 ;General Bezier curve ;Number of control points is n+1 ;mu 0 bis 1 IMPORTANT, the Last point is Not computed Local k,kn,nn,nkn Local blend#,muk#,munk# Local px#,py#,pz# Local n=VectorMax-1 px=0.0 py=0.0 pz=0.0 muk = 1.0 munk = pow(1.0-mu,Float(n)) For k=0 To n nn = n kn = k nkn = n - k blend = muk * munk muk =muk * mu munk = munk / (1.0-mu) While nn => 1 blend=blend * nn nn=nn-1 If kn > 1 Then blend=blend / Float(kn) kn=kn-1 EndIf If nkn > 1 Then blend=blend / Float(nkn) nkn=nkn-1 EndIf Wend px=px+ve(k)x * blend py=py+ve(k)y * blend pz=pz+ve(k)z * blend Next End Function ;########################################################################## Function pow#(a#,b#) ;MR 14.04.2003 ;C Like :-) Return a^b End Function ;########################################################################## Function Plot3D(p.Vector3D) ;MR 16.04.2003 ;cam ist Global und das Handle der Camera Local x1,y1 Local x2,y2 Local l#=20.0 CameraProject cam,px,py,pz x1=ProjectedX() y1=ProjectedY() CameraProject cam,px+p x*l,py+p y*l,pz+p z*l x2=ProjectedX() y2=ProjectedY() Line x1,y1,x2,y2 Color 0,255,0 Plot x1,y1 End Function ;########################################################################## Function Text3D(p.Vector3D,t$) ;MR 14.04.2003 ;cam ist Global und das Handle der Camera Local x,y CameraProject cam,px,py,pz x=ProjectedX() y=ProjectedY() Text x,y,t$,True,True End Function ;########################################################################## Function CubicInterpolate#(y0#,y1#,y2#,y3#,mu#) ;MR 13.04.2003 Local a0#,a1#,a2#,a3#,mu2# mu2 = mu*mu a0 = y3 - y2 - y0 + y1 a1 = y0 - y1 - a0 a2 = y2 - y0 a3 = y1 Return (a0*mu*mu2+a1*mu2+a2*mu+a3) End Function ;########################################################################## Function VectorNormal(n.Vector3D,pitch,yaw,roll) ;MR 16.04.2003 Local piv=CreatePivot() RotateEntity piv,pitch,yaw,roll MoveEntity piv,0,1.0,0 n x=EntityX(piv) n y=EntityY(piv) n z=EntityZ(piv) FreeEntity piv End Function ;########################################################################## [/code:1:adaf25ab49] |
von ??? |
Irre ich ich oder hattest du den Code schonmal gepostet? Ich bin sicher er funzt super, aber ist eben doch sehr komplex! Um einen leichteren Einstieg zu finden habe ich eben versucht es so schmal wie möglich zu halten. walski |
von ??? |
Weiß ich auch nicht mehr . Komplex ist der nicht wenn man das Beispiel zum anzeigen wegläßt . Und man kann ihn ja auch für 2d benutzen wenn man Z wegläßt . Hatte nur gesehen das man bei deiner Funk. nicht von 0-1 angeben kann . Naja , egal , wenn du mein Source in einem anderen Thread wieder findest sag bescheid dann lösche ich ihn hier wieder ... |
von ??? |
Dieses Mu könnt man bei mir auch einabauen. Muss man halt an der res n bissel was ändern oder so. Naja, was solls :) walski |