home *** CD-ROM | disk | FTP | other *** search
- ' *******************************************************************************
- ' 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 ch