Unendliche Bezier Kurve
Übersicht

klepto2Betreff: Unendliche Bezier Kurve |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Diesen Code habe ich mal aus dem englischen CodeArchiv herausgesucht und nach BMax konvertiert. Der Code erstellt eine Bezier kurve mit beliebig vielen Punkten.
Ich hoffe es gefällt euch und ist einigen nützlich. Code: [AUSKLAPPEN] Strict Type TBezier Global Bezier_List:TList Global Control_Point:Int Field x:Float[4] Field z:Float[4] Field a:TBezier Field B:TBezier Function Create:TBezier(x1#,z1#,vx1#,vz1#,x2#,z2#,vx2#,vz2#) Local Bezier:TBezier = New TBezier Bezier.x[0]=x1 Bezier.z[0]=z1 Bezier.x[1]=x2 Bezier.z[1]=z2 Bezier.x[2]=vx1 Bezier.z[2]=vz1 Bezier.x[3]=vx2 Bezier.z[3]=vz2 If TBezier.Bezier_List = Null Then TBezier.Bezier_List = New TList TBezier.Bezier_List.AddLast(Bezier) TBezier.BezierConnect() Return Bezier End Function Function BezierConnect() For Local Bezier:TBezier = EachIn TBezier.Bezier_List Bezier.a = Null Bezier.B = Null For Local bb:TBezier=EachIn TBezier.Bezier_List If bezier<>bb Local dx#=(bb.x[0]-Bezier.x[1]) Local dz#=(bb.z[0]-Bezier.z[1]) Local dist#=dx*dx+dz*dz If dist<16 Bezier.a=bb EndIf dx#=(bb.x[1]-Bezier.x[0]) dz#=(bb.z[1]-Bezier.z[0]) dist#=dx*dx+dz*dz If dist<16 Bezier.B=bb EndIf EndIf Next Next End Function Function bezierdraw(inc#=0.01) If TBezier.Bezier_List.IsEmpty() <> True Then Local B:TBezier=TBezier(TBezier.Bezier_List.First()) Local blink:TLink = TBezier.Bezier_List.FirstLink() Local t#=0 Local pointx# = B.x[0]*(1-t)^3 + 3*B.x[2]*(1-t)^2*t + 3*B.x[3]*(1-t)*t^2 + B.x[1]*t^3 Local pointz# = B.z[0]*(1-t)^3 + 3*B.z[2]*(1-t)^2*t + 3*B.z[3]*(1-t)*t^2 + B.z[1]*t^3 Local lpointx#=pointx# Local lpointz#=pointz# While b<>Null t#=0 For Local n=0 To 3 DrawOval B.x[n]-4,B.z[n]-4,8,8 DrawText (n+1),B.x[n]-8,B.z[n]+8 Next While t#<=1 pointx# = B.x[0]*(1-t)^3 + 3*B.x[2]*(1-t)^2*t + 3*B.x[3]*(1-t)*t^2 + B.x[1]*t^3 pointz# = B.z[0]*(1-t)^3 + 3*B.z[2]*(1-t)^2*t + 3*B.z[3]*(1-t)*t^2 + B.z[1]*t^3 DrawLine pointx,pointz,lpointx,lpointz lpointx#=pointx# lpointz#=pointz# t#=t#+inc# Wend t#=1 pointx# = B.x[0]*(1-t)^3 + 3*B.x[2]*(1-t)^2*t + 3*B.x[3]*(1-t)*t^2 + B.x[1]*t^3 pointz# = B.z[0]*(1-t)^3 + 3*B.z[2]*(1-t)^2*t + 3*B.z[3]*(1-t)*t^2 + B.z[1]*t^3 SetColor 255,0,0 DrawLine pointx,pointz,lpointx,lpointz SetColor 255,255,255 'b=After b bLink = BLink.NextLink() If Blink <> Null Then B = TBezier(BLink._value) Else B = Null EndIf Wend EndIf End Function Function bezierselect:TBezier(x,Y) For Local B:TBezier=EachIn TBezier.Bezier_List For Local n=0 To 3 DrawOval B.x[n]-4,B.z[n]-4,8,8 If x>b.x[n]-4 If Y>b.z[n]-4 If x<b.x[n]+4 If Y<b.z[n]+4 TBezier.Control_Point=n Return B EndIf EndIf EndIf EndIf Next Next End Function Function beziermovepoint(B:TBezier,x#,z#) Local dx# Local dz# B.x#[TBezier.Control_Point]=x# B.z#[TBezier.Control_Point]=z# Select TBezier.Control_Point Case 0 If B.b<>Null dx#=(B.x[0]-B.x[2]) dz#=(B.z[0]-B.z[2]) B.B.x#[3]=B.x[0]+dx# B.B.z#[3]=B.z[0]+dz# EndIf End Select If B.b<>Null Select TBezier.Control_Point Case 0 B.B.x#[1]=x# B.B.z#[1]=z# dx#=(B.x[0]-B.x[2]) dz#=(B.z[0]-B.z[2]) B.B.x#[3]=B.x[0]+dx# B.B.z#[3]=B.z[0]+dz# Case 2 dx#=(B.x[0]-B.x[2]) dz#=(B.z[0]-B.z[2]) B.B.x#[3]=B.x[0]+dx# B.B.z#[3]=B.z[0]+dz# End Select EndIf If B.a<>Null Select TBezier.Control_Point Case 1 B.a.x#[0]=x# B.a.z#[0]=z# dx#=(B.x[1]-B.x[3]) dz#=(B.z[1]-B.z[3]) B.a.x#[2]=B.x[1]+dx# B.a.z#[2]=B.z[1]+dz# Case 3 dx#=(B.x[1]-B.x[3]) dz#=(B.z[1]-B.z[3]) B.a.x#[2]=B.x[1]+dx# B.a.z#[2]=B.z[1]+dz# End Select EndIf End Function Function Remove(B:TBezier) TBezier.Bezier_List.Remove(B) End Function Function Clear() TBezier.Bezier_List.Clear() End Function End Type Graphics 800,600,0,60 Global B:TBezier = TBezier.Create(200,400,225,400,400,400,375,400) Global Event:Int = 0 Global Bezier:TBezier Global Smooth# = 0.01 While not KeyHit(KEY_ESCAPE) DrawText "Left Mouse Button : Select and Moving Bezier Point",20,20 DrawText "Right Mouse Button : Add New Bezierpoints",20,40 DrawText "Up and Down Arrows : Adjust Smoothness",20,60 DrawText "Key 'DELETE' : Deletes current selected Bezier",20,80 DrawText "Key 'Enter' : Deletes whole Bezier Construction" , 20,100 DrawText "Actual Smoothness : " + Smooth,20,140 If KeyDown(1) = True Select Event Case 0 Bezier=TBezier.bezierselect(MouseX(),MouseY()) If BEzier<>Null Event=1 EndIf Case 1 TBezier.beziermovepoint(Bezier,MouseX(),MouseY()) End Select Else Event=0 EndIf If KeyHit(2) = True If TBezier.Bezier_List.IsEmpty() = True Then TBezier.Create(MouseX(),MouseY(),MouseX()+25,MouseY(),MouseX()+100,MouseY(),MouseX()+75,MouseY()) Else Local lb:TBezier= TBezier(TBezier.Bezier_List.Last()) Local x=lb.x[1] Local Y=lb.z[1] TBezier.Create(x,Y,x+25,Y,x+100,Y,x+75,Y) EndIf EndIf If KeyDown(KEY_DELETE) And Bezier <> Null Then TBezier.Remove(Bezier) Bezier = Null End If If KeyDown(KEY_ENTER) Then TBezier.Clear() If KeyDown(Key_Down) Then Smooth:-0.001 If KeyDown(Key_Up) Then Smooth:+.001 If Smooth < 0 Then Smooth = 0.0001 TBezier.bezierdraw(Smooth) Flip FlushMem() Cls Wend |
||
Matrix Screensaver
Console Modul für BlitzMax KLPacker Modul für BlitzMax HomePage : http://www.brsoftware.de.vu |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group