(Forth) BOIDS et la gestion des objets

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

Avatar du membre
Dominique
Messages : 465
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique » 23 janv. 2017 22:45

Au sujet de INLINE
Une telle action n'est pas prévue dans le standard Forth. Et à ma connaissance je n'ai jamais vu cela se faire.
Cependant ça me rappelle furieusement un programme que j'avais vu sur Forth Dimension genre "listing - debug" qui te permet de remonter la "racine" de chaque mot, puis la racine des mots de la 1° racine etc..
L'idée n'était pas de faire un INLINE, mais de faire un debug. Mais de là à faire la compilation INLINE de la racine, ce doit être faisable. Je regarderai ça ...

__sam__
Messages : 3917
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: (Forth) BOIDS et la gestion des objets

Message par __sam__ » 23 janv. 2017 22:51

Apparemment il existe des forths (sur palmOS: Quartus forth) qui ont un "; INLINE" ou "MACRO;" au lieu de ";" qui marquent le mot comme une macro à inliner plutôt qu'à appeller quand on compile.

Pour le débug, je sais que sur les forths "modernes", il y a le mot SEE qui décompile les définitions à base de ":", mais je ne pense pas l'avoir vu sur thomson.
Samuel.
Amiga 500+GVP530(MMU/FPU) (hs), A1200(030@50mhz/fpu/64mb/cf 8go), R-Pi, TO9, TO8D, TO8.
New Teo 1.8.4 8)

Avatar du membre
Dominique
Messages : 465
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique » 23 janv. 2017 23:12

Je crois me souvenir de quelque chose comme "TRACE" ou "STEP TRACING" dans Forth Dimension.
Je sais que j'étais arrivé à reproduire un programme (que j'avais trouvé là) et qui te donnait la définition des mots à l'intérieur des : .. .;
Faut pas s'attendre à un super programme, c'était les années 80.

Avatar du membre
Dominique
Messages : 465
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique » 25 janv. 2017 21:22

Les dernières améliorations sur les routines ASM suggérées par _sam_ ont été faites et marchent.

J’ai rajouté TROUVE-CELL en ASM qui donne la cellule écran selon les coordonnées X Y du point par la formule Cellule = (28h * Y + X/8) et le reste de la division X/8 -> X AND 7

Code : Tout sélectionner

( X,Y....adresse, reste/8)
: TROUVE-CELL 28 * OVER /8 + SWAP 7 AND  ;

6B46 EC42       LDD    $02,U               6
6B48 3606       PSHU   B,A                 7
6B4A 47         ASRA                       2
6B4B 56         RORB                       2
6B4C 47         ASRA                       2
6B4D 56         RORB                       2
6B4E 47         ASRA                       2
6B4F 56         RORB                       2
6B50 ED44       STD    $04,U               6
6B52 EC42       LDD    $02,U               6
6B54 58         ASLB                       2
6B55 49         ROLA                       2
6B56 58         ASLB                       2
6B57 49         ROLA                       2
6B58 58         ASLB                       2
6B59 49         ROLA                       2
6B5A ED42       STD    $02,U               6
6B5C 58         ASLB                       2
6B5D 49         ROLA                       2
6B5E 58         ASLB                       2
6B5F 49         ROLA                       2
6B60 E342       ADDD   $02,U               7
6B62 E344       ADDD   $04,U               7
6B64 ED44       STD    $04,U               6
6B66 3706       PULU   A,B                 7
6B68 8600       LDA    #$00                2
6B6A C407       ANDB   #$07                2
6B6C 0EB0       JMP    /$B0                3
J’ai également rajouté la routine VERASE qui met à zéro les paramètres Vitesse ( Vlcty, V1 , V2, V3) du BOID objet du « loop externe »

Code : Tout sélectionner

(adresse 1° parametre de l’objet – Comme il s’agit des coordonnées X Y, On saute au paramètre (+4) pour les Vitesses)
6B79 3710       PULU   X                   7
6B7B 3004       LEAX   $04,X               5
6B7D CC0000     LDD    #$0000              3
6B80 ED81       STD    ,X++                8
6B82 ED81       STD    ,X++                8
6B84 ED81       STD    ,X++                8
6B86 ED81       STD    ,X++                8
6B88 ED81       STD    ,X++                8
6B8A ED81       STD    ,X++                8
6B8C ED81       STD    ,X++                8
6B8E ED81       STD    ,X++                8
6B90 0EB6       JMP    /$B6                3
Le gain n’a pas été fameux car on n’a gagné que ½ s pour 10 cycles.

Avant de poursuivre l’optimisation je vais m’attaquer à une grosse partie : Trouver les paramètres qui assurent une simulation crédible :

1 - La distance entre deux BOIDS pour qu’ils soient considérés voisins et s’éloignent l’un de l’autre ou calent leur vitesse l’un sur l’autre ;
2 - La vitesse d’attraction au centre de gravité que j’avais mis à 10 %.


En attendant voici le listing et la K7

Code : Tout sélectionner

: TASK ;  
HEX  
CREATE Z 0EB6 , SMUDGE  
CREATE SETPOS.M 3710 , 3706 , ED02 , 3706 , ED84 , 0EB6 , SMUDGE 
CREATE GETPOS.M  AEC4 , EC84 , EDC4 , EC02 , 0EB4 , SMUDGE 
CREATE ADDPOS.M AEC4 , EC44 , E384 , ED84 , EC42 , E302 , ED02 , 3344 , 0EAC , SMUDGE 
CREATE /32 ECC1 , 4756 , 4756 , 4756 , 4756 , 4756 , 0EB4 , SMUDGE 
CREATE V/32 EC42 , 8D08 , ED42 , 3706 , 8D02 , 0EB4 , 4756 , 4756 , 4756 , 4756 , 4756 , 39 C, SMUDGE 
CREATE V/8 EC42 , 8D08 , ED42 , 3706 , 8D02 , 0EB4 , 4756 , 4756 , 4756 , 39 C, SMUDGE 
CREATE V/2 EC42 , 4756 , ED42 , 3706 , 4756 , 0EB4 , SMUDGE 
CREATE ABSV EC42 , 2C06 , 4050 , 8200 , ED42 , ECC4 , 2C06 , 4050 , 8200 , EDC4 , 0EB0 , SMUDGE 
CREATE V<V EC44 , A3C4 , 2C04 , EC46 , A342 , 48CC , 0 , 59 C, 3346 , 0EB0 , SMUDGE 
CREATE SUBV EC46 , A342 , ED46 , EC44 , A3C4 , 3344 , 0EB0 , SMUDGE 
CREATE ADDV EC46 , E342 , ED46 , EC44 , E3C4 , ED44 , 3344 , 0EB0 , SMUDGE 
CREATE MACRO1 EC46 , A342 , ED46 , ED42 , EC44 , A3C4 , ED44 , EDC4 , EC42 , 2C06 , 4050 , 8200 , ED42 , ECC4 , 2C06 , 4050 , 8200 , EDC4 , CC C, A , 3606 , 3606 , EC44 , A3C4 , 2C04 , EC46 , A342 , 48CC , 0 , 59 C, 3346 , 0EB0 , SMUDGE 
CREATE LMDOE E643 , 5A58 , 3710 , EC85 , 0EB0 , SMUDGE
CREATE TROUVE-CELL EC42 , 3606 , 4756 , 4756 , 4756 , ED44 ,  EC42 , 5849 , 5849 , 5849 , ED42 , 5849 , 5849 , E342 , E344 , ED44 , 3706 , 8600 , C407 , 0EB0 , SMUDGE 
CREATE VERASE 3710 , 3004 , CC C, 0 , ED81 ,  ED81 , ED81 , ED81 , ED81 , ED81 , ED81 , ED81 , 0EB6 , SMUDGE
: NIP SWAP DROP ;  
65E8 CONSTANT RMULT  
: 2VARIABLE <BUILDS SWAP , , DOES> ;  
: 2@ DUP @ SWAP 2+ @ ;  
: 2! DUP >R 2+ ! R> ! ;  
3 1 2VARIABLE RLOC  
: RNDM RLOC 2@ RMULT U* ROT 0 D+ OVER RLOC 2! ;  
: RANDOM RNDM U* NIP ;  
CREATE DI 1A50 , 0EB6 , SMUDGE  
CREATE EI 1CAF , 0EB6 , SMUDGE  
7F CONSTANT C7F  
BF CONSTANT CBF  
DF CONSTANT CDF  
EF CONSTANT CEF  
F7 CONSTANT CF7  
FB CONSTANT CFB  
FD CONSTANT CFD  
FE CONSTANT CFE  
80 CONSTANT C80  
40 CONSTANT C40  
20 CONSTANT C20  
10 CONSTANT C10  
8 CONSTANT C08  
4 CONSTANT C04  
 
0 VARIABLE COMPTV1  
0 VARIABLE COMPTV2  
0 VARIABLE COMPTV3  
: FORME A7C0 DUP C@ 1 OR SWAP C! ;  
CREATE /8 ECC1 , 4756 , 4756 , 4756 , 0EB4 , SMUDGE 
: CASE: <BUILDS SMUDGE ] DOES> LMDOE ( SWAP 1- 2 * + @) EXECUTE ; 
CASE: MASK-PLOT C80 C40 C20 C10 C08 C04 2 1 ; 
CASE: MASK-UNPLOT C7F CBF CDF CEF CF7 CFB CFD CFE ; 
( : TROUVE-CELL 28 * OVER /8 + SWAP 7 AND  ; )
: (PLOT) 1+ MASK-PLOT OVER FORME C@ OR SWAP FORME C! ; 
: (UNPLOT) 1+ MASK-UNPLOT OVER FORME C@ AND SWAP FORME C! ; 
: UNPLOT.M TROUVE-CELL (UNPLOT) ; 
: PLOT.M TROUVE-CELL (PLOT) ; 
DECIMAL 
( : ADDV SWAP >R + SWAP R> + SWAP ; )
: SUBV SWAP >R - SWAP R> - SWAP ; ) 
: DIVV DUP >R / SWAP R> / SWAP ;  

: DDUP OVER OVER ; 
( : V<V SWAP >R < SWAP R> < AND ; )
( : ABSV >R ABS R> ABS ;  )
( : GETPOS.M DUP  @ SWAP 2+ @ ; )
( : SETPOS.M DUP >R 2+ ! R> ! ;) 
: GETVELCTY.M 4 + GETPOS.M ;  
: SETVELCTY.M 4 + SETPOS.M ;  
: PLOT.C GETPOS.M PLOT.M ;  
: UNPLOT.C GETPOS.M UNPLOT.M ;  

( : ADDPOS.M DUP >R 2+ +! R> +! ;)  
: ADDVELCTY.M 4 + ADDPOS.M ;  
: GETV1.M 8 + GETPOS.M ;  
: SETV1.M 8 + SETPOS.M ;  
: ADDV1.M 8 + ADDPOS.M ;  
: SETV2.M 12 + SETPOS.M ;  
: GETV2.M 12 + GETPOS.M ;  
: ADDV2.M 12 + ADDPOS.M ;  
: SETV3.M 16 + SETPOS.M ;  
: GETV3.M 16 + GETPOS.M ;  
: ADDV3.M 16 + ADDPOS.M ;  
: MOVE.M DUP >R GETV1.M I GETV2.M ADDV I GETV3.M ADDV I ADDVELCTY.M I GETVELCTY.M R> ADDPOS.M ;  
1 CONSTANT GETPOS  
2 CONSTANT SETPOS  
3 CONSTANT GETVELCTY  
4 CONSTANT SETVELCTY  
5 CONSTANT PLOT  
6 CONSTANT UNPLOT  
7 CONSTANT MOVE  
8 CONSTANT SETCUR.OBJ  
9 CONSTANT ADDPOS  
10 CONSTANT ADDVELCTY  
11 CONSTANT GETV1  
12 CONSTANT SETV1  
13 CONSTANT ADDV1  
14 CONSTANT SETV2  
15 CONSTANT GETV2  
16 CONSTANT ADDV2  
17 CONSTANT SETV3  
18 CONSTANT GETV3  
19 CONSTANT ADDV3  
CASE: METHODE GETPOS.M SETPOS.M GETVELCTY.M SETVELCTY.M PLOT.C UNPLOT.C MOVE.M SETCUR.OBJ.M ADDPOS.M ADDVELCTY.M GETV1.M SETV1.M ADDV1.M SETV2.M GETV2.M ADDV2.M SETV3.M GETV3.M ADDV3.M ;  
: BOIDS.OBJ <BUILDS , , , , , , , , , , DOES> ;  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD1  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD2  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD3  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD4  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD5  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD6  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD7  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD8  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD9 
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD10  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD11  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD12  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD13  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD14 
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD15  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD16  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD17  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD18  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD19  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD20  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD21  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD22  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD23  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD24  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD25  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD26  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD27  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD28  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD29  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD30  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD31  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD32  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD33  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD34  
0 0 0 0 0 0 0 0 200 RANDOM 320 RANDOM BOIDS.OBJ BD35  
: TABLE.OBJ <BUILDS , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , DOES> LMDOE ( SWAP 1- 2 * + @) ; 
BD35 BD34 BD33 BD32 BD31 BD30 BD29 BD28 BD27 BD26 BD25 BD24 BD23 BD22 BD21 BD20 BD19 BD18 BD17 BD16 BD15 BD14 BD13  BD12 BD11 BD10 BD9 BD8  BD7 BD6 BD5 BD4  BD3 BD2 BD1 TABLE.OBJ BOID(N)  
( : TASK2 ;  )
0 VARIABLE MAIN.OBJ 
0 VARIABLE SECD.OBJ  
: AFFI.BOID  34 1 DO I BOID(N) PLOT.C LOOP ;  
0 0 2VARIABLE LIDER  
: RULES123 34 1   DO    I BOID(N) DUP DUP  >R  MAIN.OBJ ! 0 COMPTV2 ! VERASE ( 0 0 DDUP  DDUP DDUP I SETVELCTY.M I SETV2.M I SETV3.M  I SETV1.M) 34 1  DO I BOID(N) DUP >R  MAIN.OBJ @ -  IF  I  GETPOS.M   MAIN.OBJ @ ADDV1.M   MAIN.OBJ @ GETPOS.M I GETPOS.M   MACRO1 ( SUBV  DDUP  ABSV  10 10 V<V) IF   MAIN.OBJ @ ADDV2.M   I  GETVELCTY.M   MAIN.OBJ @ ADDV3.M  1 COMPTV2 +!  ELSE  DROP DROP  ENDIF ENDIF R> DROP LOOP  I GETV1.M  V/32 LIDER 2@ ADDV V/2 I GETPOS.M  SUBV 10 DIVV  I SETV1.M  I GETV3.M  COMPTV2 @ DUP IF DIVV  I GETVELCTY.M  SUBV  V/8 I SETV3.M  ELSE DROP DROP DROP ENDIF R> DROP   LOOP ;  
: DRAW.BOIDS 34 1 DO  I BOID(N) DUP >R ( MAIN.OBJ ! MAIN.OBJ @) UNPLOT.C  I ( MAIN.OBJ @) MOVE.M  I ( MAIN.OBJ @) PLOT.C R> DROP LOOP ;  
: #IN 0 0 PAD DUP 3 EXPECT 1- (NUMBER) DROP DROP ;  
: PARAM CLS LIDER 2@ ." VALEUR DU LEADER .... Y =" . CR ." X =" . CR ." NLLE VALEUR X (DE 0 A 319)  " #IN CR ." NLLE VALEUR Y (DE 0 A 199)  " #IN LIDER 2! CR ." Z POUR QUITTER" KEY 90 = IF EI LEAVE ENDIF CLS DRAW.BOIDS ;  
: RULES  DI CLS   AFFI.BOID BEGIN RULES123    DRAW.BOIDS   KEYF 14 = IF PARAM  ENDIF AGAIN ; 
: INIT 34 1 DO  I BOID(N) MAIN.OBJ ! 320 RANDOM 200 RANDOM  MAIN.OBJ @ SETPOS.M  0 0  MAIN.OBJ @ SETVELCTY.M  0 0  MAIN.OBJ @ SETV1.M  0 0  MAIN.OBJ @ SETV2.M  0 0  MAIN.OBJ @ SETV3.M  LOOP ; QUIT QUIT 
BoidsV4.zip
Charger par 1 8 CLOAD BOIDSV4
Compiler par 1 LOAD
Lancer par RULES
- Touche "Q" disponible
(2.12 Kio) Téléchargé 17 fois

__sam__
Messages : 3917
Enregistré le : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: (Forth) BOIDS et la gestion des objets

Message par __sam__ » 26 janv. 2017 00:21

On peut optimiser la /8 car X variant entre 0 et 319 , une fois un premier décalage à droite sur 16 bits, la valeur arrive entre 0 et 159, cad un seul octet. On peut dès lors ne faire le décalage que sur un seul octet. Ensuite pour le produit par 28h, le mieux est d'utiliser l'instruction MUL du processeur qui est très rapide (seulement 11 cycles alors que rien qu'un décalage 16bits à droite de 4 places consomme 16 cycles). Bref je propose de faire ainsi

Code : Tout sélectionner

( X,Y....adresse, reste/8)
: TROUVE-CELL 28 * OVER /8 + SWAP 7 AND  ;
PULU D     ; récupère Y
LDA #40    ; 28h on peut écraser A car y entre 0 et 199 tient intégralement dans B
MUL
TFR D,X    ; X=Y*40
LDD ,U     ; récupère X
LSRA       ; NB A=0 après le LSRA
RORB       ; on a donc plus que B à décaler 3 fois (logiquement  pour forcer le signe à être positif)
LSRB 
LSRB 
ABX        ; X=Y*40+(X/8)
LDB 1,U    ; pas besoin d'intialiser A à 0, car il est déjà nul en ce point
ANDB #7    ; D=modulo 7
STX ,U     ; ecriture adresse, et D contient le modulo 7
JMP /$B0
Samuel.
Amiga 500+GVP530(MMU/FPU) (hs), A1200(030@50mhz/fpu/64mb/cf 8go), R-Pi, TO9, TO8D, TO8.
New Teo 1.8.4 8)

Avatar du membre
Dominique
Messages : 465
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique » 26 janv. 2017 09:00

OK merci une nouvelle fois _sam_

Avatar du membre
Dominique
Messages : 465
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique » 26 janv. 2017 13:40

Salut à Tous,

Grosse tuile... J'ai bien peur d'avoir commis deux grossières erreurs d'interprétation du PSEUDO CODE
http://www.kfish.org/boids/pseudocode.html

Voici comment je l'interprète maintenant !


Procédure A

Code : Tout sélectionner

PROCEDURE move_all_boids_to_new_positions()

		Vector V1, V2, V3
		Boid b
FOR EACH BOID bj
	bj.V1=bj.V2=bj.V3=0
		FOR EACH BOID b
			IF b != bj THEN
				bj.V1 = bj.V1 + b.position
					IF |b.position - bj.position| < 100 THEN
						bj.V2 = bj.V2 + bj.position - b.position
					END IF			
			END IF


				bj.V3 = bj.V3 + b.velocity

					
		END

END
END PROCEDURE

PROCEDURE draw.

FOR EACH BOID bj
	bj.V1 = bj.V1 / N-1
	bj.V1 = (bj.V1 - bj.position) / 100		
	bj.V3 = bj.V3 / N-1
	bj.V3 = bj.V3 - bj.velocity) / 8
	bj.velocity = bj.velocity + bj.V1 + bj.V2 + bj.V3
	bj.position = bj.position + bj.velocity
        draw_boids(bj)
END
	END PROCEDURE

Voici comment je l'avais interprété :

Procédure B

Code : Tout sélectionner

PROCEDURE move_all_boids_to_new_positions()

		Vector V1, V2, V3
		Boid b
FOR EACH BOID bj
           bj.V1=bj.V2=bj.V3=0
           bj.velocity = 0  ======================>(2)	
		FOR EACH BOID b
			IF b != bj THEN
				bj.V1 = bj.V1 + b.position
					IF |b.position - bj.position| < 100 THEN
						bj.V2 = bj.V2 + bj.position - b.position
						bj.V3 = bj.V3 + b.velocity   ====> (1a)
			  		       Voisin=voisin+1  =============> (1b)	
					END IF			
			END IF
				
		END

	bj.V1 = bj.V1 / N-1
	bj.V1 = (bj.V1 - bj.position) / 100		
   bj.V3 = bj.V3 / voisin  ==========>  (1c)	
	bj.V3 = (bj.V3 - bj.velocity) / 8
 END  ==========================>  (3)
        END PROCEDURE


PROCEDURE draw.

FOR EACH BOID bj
	bj.velocity = bj.velocity + bj.V1 + bj.V2 + bj.V3
	bj.position = bj.position + bj.velocity
        draw_boids(bj)
END
	END PROCEDURE

**************

Les différences entre les deux procédures se situent

Différences
(1) : Dans la RULE 3 j'imaginais que les BOIDS n'alignaient leur vitesse V3 que sur celle des voisins.
Il semble que ce soit sur la moyenne des vitesses de tous les BOIDS.D'un coté ça m'arrange car j'élimine une division /voisins pour la remplacer par une /32 que nous avons en ASM, plus un test (voisin = 0 ? ), d'un autre coté ça me ralenti car au lieu de mettre V3 à jour sur quelques voisins, je suis obligé de le faire sur tous les BOIDS.

(2) je mettais bj.velocity =0 ce qui semble faux

(3) que je mettre la mise à jour bj.V1 et bj.V3 avant le END du LOOP bj ou après le END ne semble pas influencer le résultat. ??

J'aimerai avoir l'avis éclairé de ceux qui voudront bien se pencher sur le problème.
Modifié en dernier par Dominique le 26 janv. 2017 16:03, modifié 3 fois.

Avatar du membre
Mokona
Messages : 263
Enregistré le : 17 déc. 2016 22:01
Localisation : Nord Est des Yvelines
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Mokona » 26 janv. 2017 14:58

1) Absolument. Le pseudo code initial prend en compte l'ensemble des autres BOIDS pour le calcul de la vitesse globale perçue.

2) Oui. La nouvelle vélocité d'un BOID est fonction de la vitesse globale perçue et d'une fraction de son ancienne vélocité. Il faut donc la conserver.

3) J'ai un peu de mal à suivre le pseudo code. Je vis dans un monde sensible à la casse, du coup, bj.V1 et bj.v1 quand je lis sont différents. Ce sont les mêmes ?

De même, il y a trois vectors v1, v2, v3 locaux qui n'ont pas l'air de servir.

Du coup je ne suis pas bien certain de suivre cette partie là.

Edit: il y a aussi une variable bj qui est utilisé en dehors de la boucle qui la déclare. Je ne comprends pas cette partie non plus.

Avatar du membre
Dominique
Messages : 465
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique » 26 janv. 2017 15:54

Tout à fait : Erreur de ma part; Je viens de corriger la casse.
Il y a bien : Pour chaque BOID un seul vecteur V1 , un seul V2 un seul V3.

J'ai également explicité une procédure draw qui met à jour la velocity et les position puis les affiche

Avatar du membre
Dominique
Messages : 465
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique » 05 févr. 2017 18:01

J’ai pu reprendre aujourd’hui le programme et voici un autre petit rapport d’étape.

J’ai été un peu présomptueux en pensant que notre vieille machine serait capable de gérer 32 Boids. Même en Forth cela s’avère ingérable. J’ai donc ramené la population à 9 Boids.

J’ai également rectifié la routine RULES123 suite à une erreur d’interprétation que j’avais faite.

Enfin j’ai doublé l’aire de jeux de 320*190 points à -> 640*380 points.
L’affichage bien entendu divise par 2 les coordonnées afin de pouvoir les afficher (routine SCALE)

Le résultat n’est pas spectaculaire mais reproduit fidèlement le code original. Je l’ai gardé en Forth, laissant le passage des routines en ASM pour une version optimisée. J’ai pensé également que cela permettrait de l’adapter aisément à d’autres machines munies d’un Fig-Forth

Cette version ne sert qu’à tester les différents paramètres COHESION SEPARATION et ALIGNEMENT.

Pour l’instant les paramètres les plus concluants sont :

COHESION = 20 C'est-à-dire que la composante V1 des BOIDS en direction du centre de gravité du groupe telle que perçu par chaque BOID est divisée par 20

ALIGNEMENT = 2 C'est-à-dire la composante V3 est la moyenne des vitesses de tous les autres BOIDS du groupe divisé par 2

SEPARATION = 8 8 c'est-à-dire que chaque BOID s’éloignera des Boids situés à moins de 8 points dans l’axe des X et des Y. C’est la vitesse V2

Pour modifier les paramètres appuyer sur la touche « Q ». Attention : mettre obligatoirement une valeur, ne pas sauter la saisie des paramètres en faisant <CR> directement.
A la demande faire Z pour quitter le programme ou <CR> pour revenir aux Boids.

Modifier progressivement la position du LEADER par petites touches sur les flèches.

A suivre ….

LISTING

Code : Tout sélectionner

: TASK ; 
 HEX

( ***UTILITAIRES***)

( X, Y ... X, Y, X, Y)
: DDUP OVER OVER ;  

( /Saisie valeur au clavier)
(.... 0<=N<=999)
: #IN 0 0 PAD DUP 3 EXPECT 1- (NUMBER) DROP DROP ; 

( /Disable Interrupt) 
CREATE DI 1A50 , 0EB6 , SMUDGE

( /Enable Interrupt)  
CREATE EI 1CAF , 0EB6 , SMUDGE  

( /Choix Ecran Forme pour ordinateur MO5) 
: FORME A7C0 DUP C@ 1 OR SWAP C! ;  

(/Fonction CASE: cf revue BYTE août 1980 p 184) 
: CASE: <BUILDS SMUDGE ] DOES> SWAP 1- 2 * + @ EXECUTE ; 

(/ Idem : /8 8 / ;) 
( N .... N/8)
CREATE /8 ECC1 , 4756 , 4756 , 4756 , 0EB4 , SMUDGE
 
( /Constructeur Variables doubles)  
: 2VARIABLE <BUILDS SWAP , , DOES> ;

(/Lecture-Mise à jour variables doubles)

( adresse ... X,  Y )
: 2@ DUP @ SWAP 2+ @ ;

( X, Y, adresse ....)  
: 2! DUP >R 2+ ! R> ! ; 
 
( /Constructeur Table Objets)
( adrBoid-a , adrBoid-b , etc ....)
: TABLE.OBJ <BUILDS , , , , , , , , , DOES> SWAP 1- 2 * + @ ;

( /Constructeur Boids)
( Yv3, Xv3, Yv2, Xv2, Yv1, Xv1, Yvelocity, Xvelocity, Yposition, Xposition...)
: BOIDS.OBJ <BUILDS , , , , , , , , , , DOES> ; 

( ***CONSTANTES VARIABLES ET DOUBLES***)

( /Limites-Ecran*2)
27E CONSTANT XMAX  
18E CONSTANT YMAX  

( /RANDOM)
65E8 CONSTANT RMULT
3 1 2VARIABLE RLOC

( /Constantes Masques PLOT et UNPLOT) 

( /bin = 11111110)
7F CONSTANT C7F
( /bin = 11111101)  
BF CONSTANT CBF 
( /bin = 11111011)
DF CONSTANT CDF
( etc..)  
EF CONSTANT CEF  
F7 CONSTANT CF7  
FB CONSTANT CFB  
FD CONSTANT CFD 
FE CONSTANT CFE  
80 CONSTANT C80  
40 CONSTANT C40  
20 CONSTANT C20  
10 CONSTANT C10  
8 CONSTANT C08  
4 CONSTANT C04 

( /Adresse Objet analysé)
0 VARIABLE MAIN.OBJ 

( /Facteur Cohésion) 
14 VARIABLE COHESION 

( /Facteur Alignement) 
2 VARIABLE ALIGNEMENT 

( /Facteur X Y de Séparation)
8 8 2VARIABLE SEPARATION  

122 82 2VARIABLE LEADER 

( **FONCTION RANDOM**)

( a b ... b)
: NIP SWAP DROP ;

: RNDM RLOC 2@ RMULT U* ROT 0 D+ OVER RLOC 2! ; 
 
( N ... 0<= Random <=N)
: RANDOM RNDM U* NIP ;  

( **OPERATIONS ELEMENTAIRES SUR OBJETS**)
DECIMAL
( /Lecture données)
( adr Position .. Xposition, Yposition)
: GETPOS.M DUP  @ SWAP 2+ @ ; 

( adr Position .. Xvelocity, Yvelocity)
: GETVELCTY.M 4 + GETPOS.M ;

( adr Position .. Xv1, Yv1)
: GETV1.M 8 + GETPOS.M ;

( adr Position .. Xv2, Yv2)
: GETV2.M 12 + GETPOS.M ;

( adr Position .. Xv3, Yv3)
: GETV3.M 16 + GETPOS.M ;

( /Mise à jour données)
( X, Y, adr Position ..."Mise à jour Position")
: SETPOS.M DUP >R 2+ ! R> ! ; 

( X, Y, adr Position ..."Mise à jour Velocity")
: SETVELCTY.M 4 + SETPOS.M ;

( X, Y, adr Position ..."Mise à jour V1")
: SETV1.M 8 + SETPOS.M ; 

( X, Y, adr Position ..."Mise à jour V2")
: SETV2.M 12 + SETPOS.M ;

( X, Y, adr Position ..."Mise à jour V3")
: SETV3.M 16 + SETPOS.M ;

( /Somme en mémoire)
( X, Y, adr Position ..."Somme X et Y adr Position")
: ADDPOS.M DUP >R 2+ +! R> +! ;  
  
( X, Y, adr Position ..."Somme X et Y adr Velocity") 
: ADDVELCTY.M 4 + ADDPOS.M ;  
  
( X, Y, adr Position ..."Somme X et Y adr V1") 
: ADDV1.M 8 + ADDPOS.M ;  
  
( X, Y, adr Position ..."Somme X et Y adr V2")  
: ADDV2.M 12 + ADDPOS.M ;  
  
( X, Y, adr Position ..."Somme X et Y adr V3")  
: ADDV3.M 16 + ADDPOS.M ; 

( **FONCTIONS AFFICHAGE ECRAN**)
HEX
( X  Y .. adresse écran, reste X/8)
: TROUVE-CELL 28 * OVER /8 + SWAP 7 AND  ;   
 
(/Mise à l'échelle 1/2) 
( X, Y ... X/2, Y/2)
: SCALE >R 2 / R> 2 / ;

( N ... Masque position N)
CASE: MASK-PLOT C80 C40 C20 C10 C08 C04 2 1 ;

( N ... Masque position N)  
CASE: MASK-UNPLOT C7F CBF CDF CEF CF7 CFB CFD CFE ; 

( adresse écran, reste X/8 ....)
: (PLOT) 1+ MASK-PLOT OVER FORME C@ OR SWAP FORME C! ;  

( adresse écran, reste X/8 ....)
: (UNPLOT) 1+ MASK-UNPLOT OVER FORME C@ AND SWAP FORME C! ;

( X, Y ..... 0<=X<=XMAX, 0<=Y<=YMAX)
: LIMITPOS >R DUP 0< IF XMAX + ELSE DUP XMAX 2- > IF XMAX 2- - ENDIF ENDIF R> DUP 0< IF YMAX + ELSE DUP YMAX 2- > IF YMAX 2- - ENDIF ENDIF ; 

( X, Y ....)  
: UNPLOT.C SCALE TROUVE-CELL (UNPLOT) ;  

( X, Y ....)
: PLOT.C SCALE TROUVE-CELL (PLOT) ;  

( Adresse objet...) 
: PLOT.M GETPOS.M PLOT.C ;  

( Adresse objet...)
: UNPLOT.M GETPOS.M UNPLOT.C ;  

( **CREATION BOIDS**)

( Yv3, Xv3, Yv2, Xv2, Yv1, Xv1, Yvelocity, Xvelocity, Yposition, Xposition...)
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD1  
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD2  
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD3  
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD4  
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD5  
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD6  
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD7  
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD8  
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD9  

( **CREATION TABLE DE BOIDS**) 
( adrBD9, adrBD8, etc ....) 
BD9 BD8 BD7 BD6 BD5 BD4 BD3 BD2 BD1 TABLE.OBJ BOID(N)  
 

( **OPERATIONS ELEMENTAIRES SUR VECTEURS**)

( /Valeur absolue vecteur)
( X,Y ...|X|,|Y|) 
: ABSV >R ABS R> ABS ;

( /Compare 2 vecteurs)
( XA, YA, XB, YB ... Flag "XA<XB AND YA<YB")
: V<V SWAP >R < SWAP R> < AND ; 

( /Différence de 2 vecteurs)
( XA, YA, XB, YB ... XA-XB, YA-YB)
: SUBV SWAP >R - SWAP R> - SWAP ; 

( /Somme de 2 vecteurs)
( XA, YA, XB, YB ... XA+XB, YA+YB)
: ADDV SWAP >R + SWAP R> + SWAP ; 

( /Division d'un vecteur par un scalaire)
( X, Y, N ... X/N, Y/N)
: DIVV DUP >R / SWAP R> / SWAP ; 

DECIMAL 


( **MOUVEMENT**)
DECIMAL
( /Mouvement principal de chaque Boids selon son V1, V2 et V3)
(adresse boid ....)
: MOVE.M DUP >R GETV1.M I GETV2.M ADDV I GETV3.M ADDV I ADDVELCTY.M I GETVELCTY.M DDUP I SETVELCTY.M I ADDPOS.M I GETPOS.M LIMITPOS R> SETPOS.M ;  

( **DEPLACEMENT DU LEADER**)
( /Coordonnées du Leader + ou - 20)

( Keyf ...Keyf)
: RIGHT DUP 32 = IF LEADER 2@ >R 20 + DUP XMAX < IF R> ELSE XMAX R> ENDIF LEADER 2! ENDIF ;  

( Keyf ...Keyf)
: LEFT DUP 16 = IF LEADER 2@ >R 20 - DUP -1 > IF R> LEADER 2! ELSE R> DROP DROP ENDIF ENDIF ;  

( Keyf ...Keyf)
: DOWN DUP 24 = IF LEADER 2@ 20 + DUP YMAX < IF LEADER 2! ELSE DROP DROP ENDIF ENDIF ;  

( Keyf ...Keyf)
: UP DUP 8 = IF LEADER 2@ 20 - DUP -1 > IF LEADER 2! ELSE DROP DROP ENDIF ENDIF ; 


( **AFFICHAGE BOIDS**)

( /Affichage initial des 9 Boids)
(....)
: AFFI.BOID 10 1 DO I BOID(N) PLOT.M LOOP ;

( /Effacement et Affichage des 9 Boids)
(....)
: DRAW.BOIDS 10 1 DO I BOID(N) DUP UNPLOT.M DUP MOVE.M PLOT.M LOOP ;

( **SAISIE DES PARAMETRES OU FIN PROGRAMME**)

(.....)
: PARAM.LEADER CR LEADER 2@ ." VALEUR DU LEADER ...."  CR ." Y =" . CR ." X =" . CR ." NLLE VALEUR X " #IN CR ." NLLE VALEUR Y  " #IN LEADER 2! ;

(.....)
: PARAM.SEPAR CR SEPARATION 2@ ." PARAMETRE SEPARATION ...."  CR ." Y =" . CR ." X =" . CR ." NLLE VALEUR X SEPARATION " #IN CR ." NLLE VALEUR Y SEPARATION " #IN SEPARATION 2! ;

(.....)
: PARAM.COHESION CR COHESION @ ." PARAMETRE COHESION ...."  CR  . CR ." NLLE VALEUR COHESION  " #IN COHESION ! ;

(.....)
: PARAM.ALIGN CR ALIGNEMENT @ ." PARAMETRE ALIGNEMENT ...."  CR  . CR ." NLLE VALEUR ALIGNEMENT  " #IN ALIGNEMENT ! ;

( /Accepte touche "Z" pour fin programme)
(.....)
: ?END CR ." Z POUR QUITTER" KEY 90 = IF EI LEAVE QUIT ENDIF ;

( /Mise à jour paramètres et retour à l'affichage des Boids)
(.....)
: PARAM CLS PARAM.LEADER PARAM.SEPAR PARAM.COHESION  PARAM.ALIGN ?END CLS AFFI.BOID ;

( /Lecture clavier, mise à jour Leader, accepte touche "Q" pour paramètres)
(.....)
: ?INPUT KEYF UP DOWN LEFT RIGHT 14 = IF PARAM ENDIF ;

( **ROUTINES DIVERSES**)
( /Mise à jour Nouvelles coordonnées Boids)
(.....)
: INIT 10 1 DO I BOID(N) DUP >R XMAX RANDOM YMAX RANDOM I SETPOS.M 0 0 DDUP DDUP DDUP I SETVELCTY.M I SETV1.M I SETV2.M I SETV3.M R> DROP LOOP ;  

 
( **ROUTINE PRINCIPALE D ANALYSE DE TOUS LES BOIDS**)
(.....)
: RULES123 10 1 DO I BOID(N) DUP >R MAIN.OBJ !  0 0 DDUP DDUP I SETV2.M I SETV3.M I SETV1.M 10 1 DO I BOID(N) DUP >R MAIN.OBJ @ - IF I GETPOS.M MAIN.OBJ @ ADDV1.M MAIN.OBJ @ GETPOS.M I GETPOS.M SUBV DDUP ABSV SEPARATION 2@ V<V  IF MAIN.OBJ @ ADDV2.M ELSE DROP DROP ENDIF I GETVELCTY.M MAIN.OBJ @ ADDV3.M ENDIF R> DROP LOOP I GETV1.M 8 DIVV LEADER 2@ ADDV 2 DIVV I GETPOS.M SUBV COHESION @ DIVV I SETV1.M I GETV3.M  8 DIVV I GETVELCTY.M SUBV  ALIGNEMENT @ DIVV R> SETV3.M  LOOP ;  
 
( **LANCEMENT DU PROGRAMME**) 
(.....)  
: RULES DI CLS AFFI.BOID BEGIN RULES123 DRAW.BOIDS ?INPUT AGAIN ;  

( /Fin phase compilation de l'éditeur)
QUIT QUIT 
BoidsV5.zip
Depuis le FORTH :
1 5 CLOAD BOIDV5

Puis :
1 LOAD

Lancer par

RULES

(Attendre que les Boids se regroupent)
(1.68 Kio) Téléchargé 16 fois

Avatar du membre
Dominique
Messages : 465
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique » 11 févr. 2017 20:51

Alors voilà :

Carl ayant eu la gentillesse de m'indiquer un bon logiciel gratuit pour la capture d'écran
je viens de faire une video des BOIDS tels qu'ils sont actuellement.

https://youtu.be/PVp5I7DVWhA

@ Daniel on voit qu'il s'agit de ton DCMOTO. Si tu préfères qu'il n'aparaisse pas, signale le moi SVP.

J'y travaille depuis ce matin et je ne sais pas vous, mais moi ça me rappelle furieusement les MAP du DOOM
quand on voyait nos méchants tituber en se cognant la tête les uns contre les autres !!!


Beaucoup d'améliorations à faire encore, mais ça commence à prendre forme.

Je donne la K7 plus tard dans la soirée. Demain quelques listings.

A+

Daniel
Messages : 10120
Enregistré le : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Daniel » 11 févr. 2017 21:07

Dominique a écrit :@ Daniel on voit qu'il s'agit de ton DCMOTO.
C'est un bel hommage à mon travail, et je suis honoré qu'il participe à ton projet de programmation !
Plus sérieusement, dcmoto peut être utilisé sans autorisation ni limitation, à condition de ne pas être lié de prêt ou de loin à une activité lucrative (commerciale, publicitaire ou autre).
Daniel
L'obstacle augmente mon ardeur.

Avatar du membre
Mokona
Messages : 263
Enregistré le : 17 déc. 2016 22:01
Localisation : Nord Est des Yvelines
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Mokona » 11 févr. 2017 21:34

Ah excellent, on voit mieux que sur les GIF animés.

On commence à voir le fonctionnement sur le dernier exemple de la vidéo, ça prend forme. C'est sûr que ça n'est pas bien rapide, mais ça prend forme.

Avatar du membre
Dominique
Messages : 465
Enregistré le : 09 mars 2010 13:37
Localisation : Limoges
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Dominique » 12 févr. 2017 01:04

Voici, sans grandes explications, le listing et la K7 de cette version V6.
Les routines en ASM commencent par CREATE. Vous retrouverez leur définition en pur Forth dans des listings précédents.

Quelques points importants :

A) Modification majeure dans l'algorithme de la routine RULE123 ( celle qui applique les lois 1 , 2 et 3).
Pour appliquer ces lois nous lisions chacun des 17 BOIDS successivement. Pour chacun d'eux nous lisions chacun des 16 voisins.
Nous faisions à chaque fois la somme de la position et la somme de la vitesse de ses voisins (soit 17*16 fois chaque somme) pour déterminer des paramètres vitesse du BOID étudié. Or il suffisait de profiter du loop d'affichage pour déjà faire les sommes des positions et des vitesses de tous les BOIDS
. Il ne reste qu'à retrancher la position et la vitesse du BOID étudié pour obtenir la somme des voisins.
Cette optimisation nous permet maintenant de travailler avec 17 BOIDS au lieu de 9 dans la version précédente.

B) J'ai fait un affichage des BOIDS ( 4 bits par 4 bits). Un jeu de masques (AND 00001111 00001111 00001111 00001111 ) ou (AND 11110000 ..) efface la représentation du BOID.
J'ai représenté 8 positions de BOIDS ( 2 pour les horizontales, 2 pour les verticales, 4 pour les diagonales)
Les vecteurs X et Y de la vitesse "Velocity" des BOIDS définit l'orientation suivant les valeurs

Vy = 0 -> 0
Vy > 5 -> 2
Vy < -5 -> 1
Vx = 0 -> 0
Vx > 5 -> 8
Vx < -5 -> 4


La somme des valeurs Valeur(Vy) + Valeur(Vx) nous donne des Index 0+0 0+8 0+4 2+0 2+8 2+4 1+0 1+8 1+4
Comme nous savons indexer les tables d'adresses , il est facile de trouver d'adresse du PIC représentant le BOID.

C) Enfin, demain je vais toucher à la vitesse d'éloignement des BOIDS (certainement en la divisant par deux) car le mouvement
d'éloignement me semble trop violent.
C'est facile, vu que la vitesse se calcule dans la procédure

Code : Tout sélectionner

: RULE.SEPARATION 18 1 DO I BOID(N) DUP >R MAIN.OBJ @ - IF MAIN.OBJ @ GETPOS.M I GETPOS.M SUBV DDUP ABSV SEPARATION 2@ V<V IF MAIN.OBJ @ ADDV2.M ELSE DROP DROP ENDIF ENDIF R> DROP LOOP ; 
où ...MAIN.OBJ @ ADDV2.M ... veut dire : prend le vecteur dans la pile de données et somme dans le champs V2 de l'objet MAIN.OBJ. On divisera auparavant par 2 le vecteur dans la pile de données avant d'en faire la somme.

Code : Tout sélectionner

: TASK ; 
HEX 
CREATE V/8 8601 , B7 C, HERE 41 + , EC42 , 2A08 , CC C, 0 , A342 , 70 C, HERE 35 + , 8D32 , ED42 , B6 C, HERE 2E + , 2A07 , CC C, 0 , A342 , ED42 , 8601 , B7 C, HERE 20 + , ECC4 , 2A08 , CC C, 0 , A3C4 , 70 C, HERE 14 + , 8D11 , EDC4 , B6 C, HERE D + , 2A07 , CC C, 0 , A3C4 , EDC4 , 0EB6 , 0 C, 4756 , 4756 , 4756 , 39 C, SMUDGE 
CREATE V/16 8601 , B7 C, HERE 41 + , EC42 , 2A08 , CC C, 0 , A342 , 70 C, HERE 35 + , 8D32 , ED42 , B6 C, HERE 2E + , 2A07 , CC C, 0 , A342 , ED42 , 8601 , B7 C, HERE 20 + , ECC4 , 2A08 , CC C, 0 , A3C4 , 70 C, HERE 14 + , 8D11 , EDC4 , B6 C, HERE D + , 2A07 , CC C, 0 , A3C4 , EDC4 , 0EB6 , 0 C, 4756 , 4756 , 4756 , 4756 , 39 C, SMUDGE 
CREATE DDUP EC42 , AEC4 , 3606 , 3610 , 0EB6 , SMUDGE : #IN 0 0 PAD DUP 3 EXPECT 1- (NUMBER) DROP DROP ; CREATE DI 1A50 , 0EB6 , SMUDGE 
CREATE EI 1CAF , 0EB6 , SMUDGE 
CREATE /8 ECC1 , 4756 , 4756 , 4756 , 0EB4 , SMUDGE 
CREATE ABSV EC42 , 2C06 , 4050 , 8200 , ED42 , ECC4 , 2C06 , 4050 , 8200 , EDC4 , 0EB0 , SMUDGE 
CREATE GETPOS.M AEC1 , EC81 , 3606 , EC84 , 0EB4 , SMUDGE 
CREATE ADDPOS.M AEC4 , EC44 , E384 , ED84 , EC42 , E302 , ED02 , 3344 , 0EAC , SMUDGE 
CREATE V<V EC44 , A3C4 , 2C04 , EC46 , A342 , 48CC , 0 , 59 C, 3346 , 0EB0 , SMUDGE 
CREATE SETPOS.M 3710 , 3706 , ED02 , 3706 , ED84 , 0EB6 , SMUDGE 
CREATE SUBV EC46 , A342 , ED46 , EC44 , A3C4 , 3344 , 0EB0 , SMUDGE 
CREATE ADDV EC46 , E342 , ED46 , EC44 , E3C4 , ED44 , 3344 , 0EB0 , SMUDGE
: 2VARIABLE <BUILDS SWAP , , DOES> ; 
18E CONSTANT YMAX 
27E CONSTANT XMAX 
65E8 CONSTANT RMULT 
7F CONSTANT C7F 
BF CONSTANT CBF 
DF CONSTANT CDF 
EF CONSTANT CEF 
F7 CONSTANT CF7 
FB CONSTANT CFB 
FD CONSTANT CFD 
FE CONSTANT CFE 
80 CONSTANT C80 
40 CONSTANT C40 
20 CONSTANT C20 
10 CONSTANT C10 
8 CONSTANT C08 
4 CONSTANT C04 
0 VARIABLE MAIN.OBJ 
14 VARIABLE COHESION 
2 VARIABLE ALIGNEMENT 
8 8 2VARIABLE SEPARATION 
122 82 2VARIABLE LEADER 
3 1 2VARIABLE RLOC 
0 0 2VARIABLE SIGMA.V1 
0 0 2VARIABLE SIGMA.V3 


: CASE: <BUILDS SMUDGE ] DOES> SWAP 1- 2 * + @ EXECUTE ; 

: PIC.BOID <BUILDS C, C, C, C, DOES> ;
: BOIDS.OBJ <BUILDS , , , , , , , , , , DOES> ;
: TABLE.PIC.BD <BUILDS , , , , , , , , , , , DOES> SWAP 1- 2 * + @ ; 
: TABLE.OBJ <BUILDS , , , , , , , , , , , , , , , , , DOES> SWAP 1- 2 * + @ ;


60 60 F0 F0 PIC.BOID PIC.BD.PAIR1 
60 60 F0 F0 PIC.BOID PIC.BD.PAIR2 
F0 F0 60 60 PIC.BOID PIC.BD.PAIR3 
F0 F0 60 60 PIC.BOID PIC.BD.PAIR4 
30 F0 F0 30 PIC.BOID PIC.BD.PAIR5 
D0 F0 60 C0 PIC.BOID PIC.BD.PAIR6 
C0 60 F0 D0 PIC.BOID PIC.BD.PAIR7 
C0 60 F0 D0 PIC.BOID PIC.BD.PAIR8 
C0 F0 F0 C0 PIC.BOID PIC.BD.PAIR9 
B0 F0 60 30 PIC.BOID PIC.BD.PAIR10 
30 60 F0 B0 PIC.BOID PIC.BD.PAIR11 
6 6 F F PIC.BOID PIC.BD.IMP1 
6 6 F F PIC.BOID PIC.BD.IMP2 
F F 6 6 PIC.BOID PIC.BD.IMP3 
F F 6 6 PIC.BOID PIC.BD.IMP4 
3 F F 3 PIC.BOID PIC.BD.IMP5 
D F 6 C PIC.BOID PIC.BD.IMP6 
C 6 F D PIC.BOID PIC.BD.IMP7 
C 6 F D PIC.BOID PIC.BD.IMP8 
C F F C PIC.BOID PIC.BD.IMP9 
B F 6 3 PIC.BOID PIC.BD.IMP10 
3 6 F B PIC.BOID PIC.BD.IMP11 

0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD1 
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD2 
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD3 
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD4 
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD5 
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD6 
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD7 
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD8 
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD9 
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD10 
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD11 
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD12 
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD13 
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD14 
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD15 
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD16 
0 0 0 0 0 0 0 0 YMAX RANDOM XMAX RANDOM BOIDS.OBJ BD17 

PIC.BD.PAIR11 PIC.BD.PAIR10 PIC.BD.PAIR9 PIC.BD.PAIR8 PIC.BD.PAIR7 PIC.BD.PAIR6 PIC.BD.PAIR5 PIC.BD.PAIR4 PIC.BD.PAIR3 PIC.BD.PAIR2 PIC.BD.PAIR1 TABLE.PIC.BD PIC.BOID.PAIR 
PIC.BD.IMP11 PIC.BD.IMP10 PIC.BD.IMP9 PIC.BD.IMP8 PIC.BD.IMP7 PIC.BD.IMP6 PIC.BD.IMP5 PIC.BD.IMP4 PIC.BD.IMP3 PIC.BD.IMP2 PIC.BD.IMP1 TABLE.PIC.BD PIC.BOID.IMPAIR 
BD17 BD16 BD15 BD14 BD13 BD12 BD11 BD10 BD9 BD8 BD7 BD6 BD5 BD4 BD3 BD2 BD1 TABLE.OBJ BOID(N) 
: FORME A7C0 DUP C@ 1 OR SWAP C! ; 

: 2@ DUP @ SWAP 2+ @ ; 
: 2! DUP >R 2+ ! R> ! ; 
: 2+! DUP >R 2+ +! R> +! ; 

: NIP SWAP DROP ; 
: RNDM RLOC 2@ RMULT U* ROT 0 D+ OVER RLOC 2! ; 
: RANDOM RNDM U* NIP ; 
: GETVELCTY.M 4 + GETPOS.M ; 
: AND.C! DUP C@ SWAP >R AND R> FORME C! ; 
: OR.C! DUP C@ SWAP >R OR R> FORME C! ; 
: TR-CELL >R /8 DUP 1 AND SWAP 2 / R> /8 A0 * + SWAP ; 
: (UNPL.PIC) SWAP DDUP AND.C! DDUP 28 + AND.C! DDUP 50 + AND.C! 78 + AND.C! ; 
: UNPLOT.PIC.C TR-CELL 0= IF F ELSE F0 ENDIF (UNPL.PIC) ; 
: UNPLOT.PIC.M GETPOS.M UNPLOT.PIC.C ; 
: XMASKOR DUP -5 < IF DROP 4 ELSE 5 > IF 8 ELSE 0 ENDIF ENDIF ; 
: YMASKOR DUP -5 < IF DROP 2 ELSE 5 > IF 1 ELSE 0 ENDIF ENDIF ; 
: CALCULE-MASKOR DUP GETVELCTY.M >R XMASKOR R> YMASKOR + 1+ ; 
: (PLOT.PIC) DDUP C@ SWAP OR.C! DDUP 1+ C@ SWAP 28 +  OR.C! DDUP 2+ C@ SWAP 50 + OR.C! 3 + C@ SWAP 78 + OR.C! ; 
: PLOT.PIC.C CALCULE-MASKOR >R GETPOS.M TR-CELL R> SWAP 0= IF PIC.BOID.PAIR ELSE PIC.BOID.IMPAIR ENDIF ; 
: PLOT.PIC.M PLOT.PIC.C (PLOT.PIC) ; 
DECIMAL 
: GETV1.M 8 + GETPOS.M ; 
: GETV2.M 12 + GETPOS.M ; 
: GETV3.M 16 + GETPOS.M ; 
: SETVELCTY.M 4 + SETPOS.M ; 
: SETV1.M 8 + SETPOS.M ; 
: SETV2.M 12 + SETPOS.M ; 
: SETV3.M 16 + SETPOS.M ; 
: ADDVELCTY.M 4 + ADDPOS.M ; 
: ADDV1.M 8 + ADDPOS.M ; 
: ADDV2.M 12 + ADDPOS.M ; 
: ADDV3.M 16 + ADDPOS.M ; 
: SCALE >R 2 / R> 2 / ; 
: LIMITPOS >R DUP 0< IF XMAX + ELSE DUP XMAX 2- > IF XMAX 2- - ENDIF ENDIF R> DUP 0< IF YMAX + ELSE DUP YMAX 2- > IF YMAX 2- - ENDIF ENDIF ; 
: DIVV DUP >R / SWAP R> / SWAP ; DECIMAL 
: UPDATE.VLCTY >R I GETV1.M I GETV2.M ADDV I GETV3.M ADDV I ADDVELCTY.M R> ; 
: UPDATE.POS >R I GETVELCTY.M DDUP SIGMA.V3 2+! I ADDPOS.M R> ; 
: CHECK.POS >R I GETPOS.M LIMITPOS DDUP SIGMA.V1 2+! I SETPOS.M R> ; 
: MOVE.M UPDATE.VLCTY UPDATE.POS CHECK.POS ; 
: RIGHT DUP 32 = IF LEADER 2@ >R 20 + DUP XMAX < IF R> ELSE XMAX R> ENDIF LEADER 2! ENDIF ; 
: LEFT DUP 16 = IF LEADER 2@ >R 20 - DUP -1 > IF R> LEADER 2! ELSE R> DROP DROP ENDIF ENDIF ; 
: DOWN DUP 24 = IF LEADER 2@ 20 + DUP YMAX < IF LEADER 2! ELSE DROP DROP ENDIF ENDIF ; 
: UP DUP 8 = IF LEADER 2@ 20 - DUP -1 > IF LEADER 2! ELSE DROP DROP ENDIF ENDIF ; 
: AFFI.BOID 18 1 DO I BOID(N) PLOT.PIC.M LOOP ; 
: DRAW.BOIDS 18 1 DO I BOID(N) DUP UNPLOT.PIC.M MOVE.M PLOT.PIC.M LOOP ; 
: PARAM.LEADER CR LEADER 2@ SWAP ." VALEUR DU LEADER ...." CR ." X =" . CR ." Y =" . CR ." NLLE VALEUR X " #IN CR ." NLLE VALEUR Y  " #IN LEADER 2! ; 
: PARAM.SEPAR CR SEPARATION 2@ ." PARAMETRE SEPARATION ...." CR ." Y =" . CR ." X =" . CR ." NLLE VALEUR X SEPARATION " #IN CR ." NLLE VALEUR Y SEPARATION " #IN SEPARATION 2! ; 
: PARAM.COHESION CR COHESION @ ." PARAMETRE COHESION ...." CR . CR ." NLLE VALEUR COHESION  " #IN COHESION ! ; 
: PARAM.ALIGN CR ALIGNEMENT @ ." PARAMETRE ALIGNEMENT ...." CR . CR ." NLLE VALEUR ALIGNEMENT  " #IN ALIGNEMENT ! ; 
: ?END CR ." Z POUR QUITTER" KEY 90 = IF EI QUIT ENDIF ; 
: PARAM CLS PARAM.LEADER PARAM.SEPAR PARAM.COHESION PARAM.ALIGN ?END CLS AFFI.BOID ; 
: ?INPUT KEYF UP DOWN LEFT RIGHT 14 = IF PARAM ENDIF ; 
: INIT 18 1 DO I BOID(N) DUP >R XMAX RANDOM YMAX RANDOM I SETPOS.M 0 0 DDUP DDUP DDUP I SETVELCTY.M I SETV1.M I SETV2.M I SETV3.M R> MOVE.M DROP DROP LOOP ; 
: CLEAR.VFIELD >R 0 0 DDUP DDUP I SETV2.M I SETV3.M I SETV1.M R> ; 
: CLEAR.SIGMA 0 DUP DUP DUP SIGMA.V1 2! SIGMA.V3 2! ; 
: RULE.SEPARATION 18 1 DO I BOID(N) DUP >R MAIN.OBJ @ - IF MAIN.OBJ @ GETPOS.M I GETPOS.M SUBV DDUP ABSV SEPARATION 2@ V<V IF MAIN.OBJ @ ADDV2.M ELSE DROP DROP ENDIF ENDIF R> DROP LOOP ; 
: RULE.COHESION >R SIGMA.V1 2@ I GETPOS.M SUBV V/16 LEADER 2@ ADDV 2 DIVV I GETPOS.M SUBV COHESION @ DIVV I SETV1.M R> ; 
: RULE.ALIGNEMENT >R SIGMA.V3 2@ I GETVELCTY.M SUBV V/16 I GETVELCTY.M SUBV ALIGNEMENT @ DIVV R> SETV3.M ; 
: RULES123 18 1 DO I BOID(N) DUP MAIN.OBJ ! CLEAR.VFIELD RULE.SEPARATION RULE.COHESION RULE.ALIGNEMENT LOOP CLEAR.SIGMA ; 
: RULES DI CLS AFFI.BOID CLEAR.SIGMA BEGIN RULES123 DRAW.BOIDS ?INPUT AGAIN ; 
QUIT QUIT 
BoidsV6.zip
Je vous conseille de lancer le Forth sans l'éditeur ( éviter de perdre de l espace)
Faire 1 9 CLOAD BOID1
Compiler par 1 LOAD
Lancer par RULES.
La touche Q propose les paramètres, les flèches = mouvement LEADER. Utiliser les Flèche pas petites touches.
(2.39 Kio) Téléchargé 18 fois

Avatar du membre
Carl
Modérateur
Messages : 9930
Enregistré le : 08 avr. 2007 13:21
Localisation : http://www.doledujura.fr
Contact :

Re: (Forth) BOIDS et la gestion des objets

Message par Carl » 12 févr. 2017 10:59

Bravo Dominique, la vie artificielle débarque sur MO5... 8)

Carl

Répondre