Unendliche Bezier Kurve

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

 

klepto2

Betreff: Unendliche Bezier Kurve

BeitragMi, Okt 26, 2005 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group