chain a quadratic curve bezier many times by Anonymous Coder23rd 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 |