TGC Codebase Backup



chain a quadratic curve bezier many times by Anonymous Coder

23rd May 2012 9:20
Summary

chain a quadratic curve bezier many times



Description



Code
                                    ` This code was downloaded from The Game Creators
                                    ` It is reproduced here with full permission
                                    ` http://www.thegamecreators.com
                                    
                                    rem make a vettor with 2d points
dim vettore(13,2)

x=1
y=2
nPunti=5
rem add 5 points
vettore(1,x)=100
vettore(1,y)=250

vettore(3,x)=200
vettore(3,y)=350

vettore(5,x)=300
vettore(5,y)=250

vettore(7,x)=400
vettore(7,y)=350

vettore(9,x)=500
vettore(9,y)=250

rem calcola i punti intermedi
sistema_vettore(nPunti)

sync on : sync rate 60

tempo=0
repeat

   if tempo<(nPunti-1)*100
      tempo=tempo+1
   else
      tempo=0
   endif

   rem pulisci lo schermo
   cls

   rem disegna prima i punti secondari così che vengano in secondo piano
   ink rgb(250,250,0),0
   for t=0 to nPunti-1
      circle vettore(t*2,x),vettore(t*2,y), 2
   next t

   rem disegna i 4 punti chiave
   ink rgb(250,0,0),0
   for t=0 to nPunti-1
      circle vettore(t*2+1,x),vettore(t*2+1,y), 2
   next t

   if inkey$()="1"
      vettore(1,x)=mousex()
      vettore(1,y)=mousey()
      sistema_vettore(nPunti)
   endif
   if inkey$()="2"
      vettore(3,x)=mousex()
      vettore(3,y)=mousey()
      sistema_vettore(nPunti)
   endif
   if inkey$()="3"
      vettore(5,x)=mousex()
      vettore(5,y)=mousey()
      sistema_vettore(nPunti)
   endif
   if inkey$()="4"
      vettore(7,x)=mousex()
      vettore(7,y)=mousey()
      sistema_vettore(nPunti)
   endif
   if inkey$()="5"
      vettore(9,x)=mousex()
      vettore(9,y)=mousey()
      sistema_vettore(nPunti)
   endif

   rem disegna
   ink rgb(250,250,250),0
   print "press a number from 1 to 5 to move red points in the screen"
   print "red = fixed points"
   print "yellow = calculated points"

   disegna_frame_vettore(tempo)

   sync
until escapekey()=1

end

function graduale(a,b,perc)
   ris= ( a*(100-perc) + b*perc ) / 100
endfunction ris

function triangolo_bezier_x(ax,ay, bx,by, cx,cy, perc)
   ris=graduale( graduale(ax,cx,perc), graduale(cx,bx,perc), perc)
endfunction ris

function triangolo_bezier_y(ax,ay, bx,by, cx,cy, perc)
   ris=graduale( graduale(ay,cy,perc), graduale(cy,by,perc), perc)
endfunction ris

function sistema_vettore(nPunti)
   x=1
   y=2
   rem il secondo punto è la media aritmetica tra il primo e il terzo punto
   vettore(2,x)=vettore(1,x)
   vettore(2,y)=vettore(1,y)

   for numero_indice=1 to nPunti-2
      rem ottieni x e y
      ax=vettore(numero_indice*2,x)
      ay=vettore(numero_indice*2,y)

      bx=vettore(numero_indice*2+1,x)
      by=vettore(numero_indice*2+1,y)

      cx=vettore(numero_indice*2+3,x)
      cy=vettore(numero_indice*2+3,y)

      rem calcola la distanza tra il punto e il successivo
      lung=sqrt( (ax-bx)^2+(ay-by)^2 )
      rem calcola la distanza tra i punti successivi
      lung2=sqrt( (ax-bx)^2+(ay-by)^2 )

      rem calcola la posizione del punto nuovo
      vettore(numero_indice*2+2,x)=bx +(sqrt( 1.0 - ((ax-bx)/(1.0*lung^2)) )* (lung2/4.0) * (bx-ax)/abs(bx-ax))
      vettore(numero_indice*2+2,y)=by +(sqrt( 1.0 - ((ay-by)/(1.0*lung^2)) )* (lung2/4.0) * (by-ay)/abs(by-ay))

   next numero_indice
endfunction

function disegna_frame_vettore(tempo)
   x=1
   y=2
   numero_indice=(int(tempo/100)*2)+1

   ax=vettore(numero_indice,x)
   ay=vettore(numero_indice,y)

   bx=vettore(numero_indice+2,x)
   by=vettore(numero_indice+2,y)

   cx=vettore(numero_indice+1,x)
   cy=vettore(numero_indice+1,y)

   posx=triangolo_bezier_x(ax,ay, bx,by, cx,cy, tempo-(int(tempo/100)*100) )
   posy=triangolo_bezier_y(ax,ay, bx,by, cx,cy, tempo-(int(tempo/100)*100) )

   circle posx,posy,4
   print "speed X : ";
   for t=1 to abs(posx-triangolo_bezier_x(ax,ay, bx,by, cx,cy, (tempo-1)-(int(tempo/100)*100) ))
      print "|";
   next t
   print ""
   print "speed Y : ";
   for t=1 to abs(posy-triangolo_bezier_y(ax,ay, bx,by, cx,cy, (tempo-1)-(int(tempo/100)*100) ))
      print "|";
   next t
   print ""
endfunction