home *** CD-ROM | disk | FTP | other *** search
Wrap
File List | 1996-02-10 | 12.3 KB | 489 lines
' ******************************************************************************* ' Programme de Morphing filaire 2D §upeRnovA Décembre 95 ' GFA ver 3.5E ' pour TOXIC MAG 11 ' ' Procédures: ' @init: a appeler en debut de programme ' @demander_points_depart: pour entrer les coordonnées de l'objet ' de depart avec la souris ' @sauver_objet_depart: stocker sur disque l'objet de depart ' @charger_objet_depart: pour charger l'objet de depart ' (ne pas utiliser avec demander_points_depart!) ' @calcule_droites: calcule du morphing ' @optimise: a utiliser pour que le deplacement des points ' se fasse progressivement. Tous les points ' arrivent a destination en meme temps. ' @store: sauvegarde des calculs sur disc ' @anime: replay des calculs ' ' ****************************************************************************** ' @init @demander_points_depart ' @sauver_objet_depart ' @charger_objet_depart ' @charger_objet_arrivee @demander_points_arrivee ' @sauver_objet_arrivee @calcule_droites @optimise ' @store @anime ' > PROCEDURE anime ' **************************************************************************** ' Entrees: rien ' ' Role: joue l'animation des deux objet morphes en mode ping-pong. appuyer ' sur le bouton gauche de la souris pour passer d'un objet a l'autre ' **************************************************************************** COLOR 1 loop: FOR t=1 TO distance_max+1 FOR pt=1 TO nbliens STEP 2 LINE bufferx(liens(pt),t),buffery(liens(pt),t),bufferx(liens(pt+1),t),buffery(liens(pt+1),t) NEXT pt SWAP e1%,e2% ~XBIOS(5,L:e1%,L:e2%,-1) ~XBIOS(37) CLS NEXT t REPEAT UNTIL MOUSEK=1 FOR n=t TO 1 STEP -1 FOR pt=1 TO nbliens STEP 2 LINE bufferx(liens(pt),n),buffery(liens(pt),n),bufferx(liens(pt+1),n),buffery(liens(pt+1),n) NEXT pt SWAP e1%,e2% ~XBIOS(5,L:e1%,L:e2%,-1) ~XBIOS(37) CLS NEXT n REPEAT UNTIL MOUSEK=1 GOTO loop RETURN > PROCEDURE calcule(xa,ya,xb,yb) ' **************************************************************************** ' Entrees: xa: abcsisse du point source ' ya: ordonnee " ' xb: abcsisse du point destination ' yb: ordonnee " ' ' Role: trace virtuellement la droite reliant les deux points et stocke les ' coordonnees successive dans bufferx() et buffery() ' **************************************************************************** IF xa=xb AND ya=yb THEN xb=xa+1 ENDIF t=1 IF xb>xa THEN a=(yb-ya)/(xb-xa) b=ya-xa*a x=xa WHILE xb>=x y=a*x+b bufferx(pt,t)=x buffery(pt,t)=y x=x+precision INC t ' PSET x,y,1 WEND ENDIF ' IF xb<xa THEN SWAP xb,xa SWAP yb,ya a=(yb-ya)/(xb-xa) b=ya-xa*a x=xb WHILE x>xa y=a*x+b bufferx(pt,t)=x buffery(pt,t)=y x=x-precision INC t ' PSET x,y,1 WEND ENDIF ' distances(pt)=t IF t>distance_max THEN distance_max=t ENDIF ' FOR w=t TO max_transitions bufferx(pt,w)=xarrivee(pt) buffery(pt,w)=yarrivee(pt) NEXT w ' RETURN > PROCEDURE demander_points_depart ' **************************************************************************** ' Entrees: rien ' ' Role: tracage de l'objet de depart en fil de fer. ' bouton gauche: relier le dernier point entrer au point actuel ' bouton droit: nouveau point de depart. ' **************************************************************************** liens(1)=1 liens(2)=2 pt=2 n=2 ' @ask_plot xdepart(1)=x ydepart(1)=y ' REPEAT xdepart(2)=MOUSEX ydepart(2)=MOUSEY COLOR 4 LINE xdepart(1),ydepart(1),xdepart(2),ydepart(2) COLOR 0 LINE xdepart(1),ydepart(1),xdepart(2),ydepart(2) UNTIL MOUSEK=1 REPEAT UNTIL MOUSEK=0 COLOR 4 LINE xdepart(1),ydepart(1),xdepart(2),ydepart(2) ' REPEAT REPEAT a$=INKEY$ x=MOUSEX y=MOUSEY k=MOUSEK EXIT IF ASC(a$)=27 UNTIL k<>0 ' EXIT IF ASC(a$)=27 ' IF k=1 INC n liens(n)=liens(n-1) INC n INC pt liens(n)=pt @elastik ENDIF ' IF k=2 PRINT CHR$(7); INC n INC pt liens(n)=pt ask_plot xdepart(pt)=x ydepart(pt)=y INC n INC pt liens(n)=pt @elastik ENDIF UNTIL pt=nbpts nbliens=n nbpts=pt RETURN > PROCEDURE ask_plot ' *************************************************************************** ' Attend un front montant de la souris pour afficher un point ' *************************************************************************** REPEAT x=MOUSEX y=MOUSEY UNTIL MOUSEK=1 REPEAT UNTIL MOUSEK=0 PLOT x,y RETURN > PROCEDURE elastik ' **************************************************************************** ' Permet de tracer une droite entre le dernier point entré et le point actuel ' tant que le bouton gauche de la souris n'a pas ete relache ' **************************************************************************** REPEAT xdepart(pt)=MOUSEX ydepart(pt)=MOUSEY COLOR 4 ' LINE xdepart(pt-1),ydepart(pt-1),xdepart(pt),ydepart(pt) LINE xdepart(liens(n-1)),ydepart(liens(n-1)),xdepart(liens(n)),ydepart(liens(n)) COLOR 0 LINE xdepart(pt-1),ydepart(pt-1),xdepart(pt),ydepart(pt) UNTIL MOUSEK=0 COLOR 4 LINE xdepart(pt-1),ydepart(pt-1),xdepart(pt),ydepart(pt) RETURN > PROCEDURE demander_points_arrivee FOR pt=1 TO nbpts xarrivee(pt)=xdepart(pt) yarrivee(pt)=ydepart(pt) NEXT pt test: REPEAT COLOR 1 FOR pt=1 TO nbpts BOX xarrivee(pt)-2,yarrivee(pt)-2,xarrivee(pt)+2,yarrivee(pt)+2 NEXT pt REPEAT x=MOUSEX y=MOUSEY IF ASC(INKEY$)=27 THEN GOTO done ENDIF UNTIL MOUSEK=1 FOR pt=1 TO nbpts IF x>xarrivee(pt)-3 AND x<xarrivee(pt)+3 AND y<yarrivee(pt)+3 AND y>yarrivee(pt)-3 THEN trouve=TRUE ENDIF EXIT IF trouve NEXT pt IF trouve THEN n=1 WHILE liens(n)<>pt INC n WEND IF liens(n+1)=pt link=2 b=liens(n-1) c=liens(n+2) ENDIF IF liens(n+1)<>pt IF n/2=INT(n/2) THEN b=liens(n-1) ELSE b=liens(n+1) ENDIF link=1 ENDIF WHILE MOUSEK=1 x=MOUSEX y=MOUSEY xarrivee(pt)=x yarrivee(pt)=y IF link=1 COLOR 4 LINE x,y,xarrivee(b),yarrivee(b) COLOR 0 LINE x,y,xarrivee(b),yarrivee(b) ENDIF IF link=2 COLOR 4 LINE x,y,xarrivee(b),yarrivee(b) LINE x,y,xarrivee(c),yarrivee(c) COLOR 0 LINE x,y,xarrivee(b),yarrivee(b) LINE x,y,xarrivee(c),yarrivee(c) ENDIF WEND trouve=FALSE COLOR 4 CLS FOR pt=1 TO nbliens STEP 2 LINE xarrivee(liens(pt)),yarrivee(liens(pt)),xarrivee(liens(pt+1)),yarrivee(liens(pt+1)) NEXT pt COLOR 1 BOX xmin,ymin,xmax,ymax ENDIF a$=INKEY$ UNTIL 1=2 done: RETURN > PROCEDURE calcule_droites ' **************************************************************************** ' Cette procedure se charge d'appeler @calcule pour effectuer les liens entre ' tous les points de depart et les points d'arrivee correspondant ' **************************************************************************** PRINT AT(1,18);"Calcul de la transformation:"; PRINT AT(1,19);vum$; PRINT AT(1,20);"Optimisation:"; PRINT AT(1,21);vum$; PRINT AT(1,22);"Stockage des coordonnees finales:"; PRINT AT(1,23);vum$; FOR pt=1 TO nbpts v=(pt*LEN(st$))/nbpts PRINT AT(1,19);MID$(st$,1,v); @calcule(xdepart(pt),ydepart(pt),xarrivee(pt),yarrivee(pt)) NEXT pt RETURN > PROCEDURE init ' **************************************************************************** ' Reserve la memoire necessaire et les tableaux de coordonnees ' **************************************************************************** e1%=XBIOS(2) e2$=STRING$(32000,0) e2%=V:e2$ max_transitions=150 nbpts=100 precision=2 DIM xdepart(nbpts),ydepart(nbpts),xarrivee(nbpts),yarrivee(nbpts),bufferx(nbpts,max_transitions),buffery(nbpts,max_transitions),liens(nbpts*2),distances(nbpts),bufferx2(nbpts,max_transitions),buffery2(nbpts,max_transitions),donnee$(nbpts*4) st$=STRING$(40,"*") vum$=STRING$(40,".") ON BREAK GOSUB braik xmin=96 xmax=224 ymin=50 ymax=170 BOX xmin,ymin,xmax,ymax RETURN > PROCEDURE store xy$=xy$+SPACE$(distance_max*nbpts) xy%=V:xy$ ixy%=xy% FOR pt=1 TO nbpts FOR t=1 TO distance_max+1 x=bufferx(pt,t) y=buffery(pt,t) DPOKE xy%,x ADD xy%,2 DPOKE xy%,y ADD xy%,2 NEXT t NEXT pt CLS PRINT "Sauver coordonnees" FILESELECT "a:\*.xy","",f$ BSAVE f$,ixy%,xy%-ixy% ' liens$=SPACE$(nbliens) liens%=V:liens$ iliens%=liens% DPOKE liens%,nbliens/2 ADD liens%,2 DPOKE liens%,(distance_max+1)*4 ADD liens%,2 FOR n=1 TO nbliens DPOKE liens%,liens(n)-1 ADD liens%,2 NEXT n CLS PRINT "Sauver fichier d'info." FILESELECT "a:\*.dat","",f$ BSAVE f$,iliens%,liens%-iliens% RETURN > PROCEDURE optimise FOR pt=1 TO nbpts v=(pt*LEN(st$))/nbpts PRINT AT(1,21);MID$(st$,1,v); coeff=ROUND(distance_max/distances(pt)) t=0 FOR coordonnee=1 TO distances(pt) FOR n=1 TO coeff INC t bufferx2(pt,t)=bufferx(pt,coordonnee) buffery2(pt,t)=buffery(pt,coordonnee) NEXT n NEXT coordonnee FOR n=t TO distance_max bufferx2(pt,n)=xarrivee(pt) buffery2(pt,n)=yarrivee(pt) NEXT n NEXT pt FOR pt=1 TO nbpts FOR t=1 TO distance_max v=(pt*LEN(st$))/nbpts PRINT AT(1,23);MID$(st$,1,v); bufferx(pt,t)=bufferx2(pt,t) buffery(pt,t)=buffery2(pt,t) NEXT t bufferx(pt,t)=xarrivee(pt) buffery(pt,t)=yarrivee(pt) bufferx(pt,t+1)=xarrivee(pt) buffery(pt,t+1)=yarrivee(pt) NEXT pt RETURN > PROCEDURE braik END RETURN > PROCEDURE sauver_objet_depart donnee$(1)=STR$(nbpts) donnee$(2)=STR$(nbliens) n=3 FOR pt=1 TO nbpts donnee$(n)=STR$(xdepart(pt)) INC n donnee$(n)=STR$(ydepart(pt)) INC n NEXT pt FOR pt=1 TO nbliens donnee$(n)=STR$(liens(pt)) INC n NEXT pt CLS PRINT "Sauver objet depart" FILESELECT "a:\*.obj","",f$ OPEN "o",#1,f$ STORE #1,donnee$(),nbpts*2+4+nbliens CLOSE #1 RETURN > PROCEDURE charger_objet_depart CLS PRINT "Charger objet depart" FILESELECT "a:\*.obj","",f$ OPEN "i",#1,f$ RECALL #1,donnee$(),5000,size CLOSE #1 nbpts=VAL(donnee$(1)) nbliens=VAL(donnee$(2)) n=3 FOR pt=1 TO nbpts xdepart(pt)=VAL(donnee$(n)) INC n ydepart(pt)=VAL(donnee$(n)) INC n NEXT pt FOR pt=1 TO nbliens liens(pt)=VAL(donnee$(n)) INC n NEXT pt RETURN > PROCEDURE charger_objet_arrivee CLS PRINT "Charger objet arrivee" FILESELECT "a:\*.obj","",f$ OPEN "i",#1,f$ RECALL #1,donnee$(),5000,size CLOSE #1 IF nbpts<>VAL(donnee$(1)) THEN PRINT "Nbpts differents!" END ENDIF IF nbliens<>VAL(donnee$(2)) THEN PRINT "Liens differents!" END ENDIF n=3 FOR pt=1 TO nbpts xarrivee(pt)=VAL(donnee$(n)) INC n yarrivee(pt)=VAL(donnee$(n)) INC n NEXT pt FOR pt=1 TO nbliens liens(pt)=VAL(donnee$(n)) INC n NEXT pt RETURN > PROCEDURE sauver_objet_arrivee donnee$(1)=STR$(nbpts) donnee$(2)=STR$(nbliens) n=3 FOR pt=1 TO nbpts donnee$(n)=STR$(xarrivee(pt)) INC n donnee$(n)=STR$(yarrivee(pt)) INC n NEXT pt FOR pt=1 TO nbliens donnee$(n)=STR$(liens(pt)) INC n NEXT pt CLS PRINT "Sauver objet arrivee" FILESELECT "a:\*.obj","",f$ OPEN "o",#1,f$ STORE #1,donnee$(),nbpts*2+4+nbliens CLOSE #1 RETURN