DATE PROG TRN < < < D E F I N I T I O N S G E N E R A L E S : < < XUNDEF:: VAL -1 < POUR NE DEFINIR QUE LES 'XX...' DANS LES < FICHIERS DE DEFINITION... CALL #SIP DEFINITION CTTE# < < PREPARATION DE L'APPEL DE #SIP UTILITAIRES# : < XXXDEF: VAL XUNDEF XXXLOC: VAL XUNDEF XXXTAB: VAL XUNDEF XXXPRO: VAL XUNDEF CALL #SIP UTILITAIRES# < < < D E F I N I T I O N D E L ' I M A G E : < < XXXVEC: VAL XUNDEF < AFIN DE NE DEFINIR QUE LES 'XXVEC'... CALL #SIP VECTEUR 512# XXXVEC: VAL XXVEC1 < DEFINITION DES CONSTANTES IMAGE/VECTEUR. CALL #SIP VECTEUR 512# < < CONSTANTES DES IMAGES (256,256) : < ORDI:: VAL "@" < TYPE DE L'ORDINATEUR... CALL #SIP IMAGE 256# NMOTL:: VAL CNMPL < NOMBRE DE MOTS PAR LIGNE D'IMAGE (256). NPOL:: VAL NMOTL*NBITMO < NOMBRE DE POINTS PAR LIGNE, NLIG:: VAL LIMAG/NMOTL < NOMBRE DE LIGNES PAR IMAGE (256,256). NPOLM1:: VAL NPOL-Z < ABSCISSE MAXIMALE. NLIGM1:: VAL NLIG-Z < ORDONNEE MAXIMALE. TV1:: MOT O < PREMIERE IMAGE (256,256), TV2:: MOT '5000 < DEUXIEME IMAGE (256,256). NCOOL:: VAL XNCOOL < NOMBRE DE COULEURS PRIMAIRES, NIVMX7:: VAL BIT>NCOOL-N < NIVEAU MAXIMAL EN (256,256)... < < < D E F I N I T I O N D E S E S P A C E S : < < DIMGRA:: VAL 3 < ON TRACE DANS L'ESPACE EUCLIDIEN < A 3 DIMENSIONS... DIMGR2:: VAL DIMGRA-I < ET UNE DIMENSION DE MOINS... PAGE < < < O P T I O N S D ' A S S E M B L A G E : < < XOPT01: @ XWOR%1: VAL KOLF=FMASK+KOLTES=FVAL XWOR%1: VAL KOLC=FMASK+KDP=FVAL?XWOR%1 XWOR%2: VAL KOLTED=FMASK+KOL0=FVAL XWOR%2: VAL KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2 XWOR%3: VAL XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT... XWOR%4: VAL MSYMBI=FMASK+KOL0=FVAL XWOR%4: VAL MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4 XWOR%5: VAL XWOR%4=FCSYMT < ETAT DU SYMBOLE 'XOPT01'... XWOR%6: VAL XWOR%5=FCSIGN XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN IF XWOR%6*XWOR%7,XEIF%,,XEIF% XOPT01:: VAL EXIST < TRACE GRAPHIQUE, ET VERIFICATIONS CROI- < SEES DES EQUATIONS CALCULEES... XEIF%: VAL ENDIF PAGE < < < B A S D E L A M E M O I R E : < < ZERO: EQU $ DZS PEPROG-D+Z < < POINT D'ENTREE : < ENTRY: EQU $ LRM A,K WORD DEBUT < POINT D'ENTREE DU PROGRAMME, WORD STACK-DEPILE < INITIALISATION DE LA PILE. PSR A RSR < ON EFFECTUE AINSI UN 'GOTO' 'DEBUT'... PAGE < < < D O N N E E S P O U R L E S O M B R E S P O R T E E S : < < < FONCTION : < ON TROUVE ICI DEUX VECTEURS < CORRESPONDANT AUX BORDS DROIT < ET SUPERIEUR DE L'IMAGE ; ILS < CONTIENNENT POUR CHAQUE PLAN < A 'Z' CONSTANT TRACE LA PROJEC- < TION DE CE PLAN SUIVANT LA SOUR- < CE LUMINEUSE. LORSQU'UN NOUVEAU < POINT (X,Y) VA ETRE TRACE, ON LE < PROJETTE SUR CES 2 VECTEURS SUI- < VANT LA SOURCE LUMINEUSE : SI < L'ENTREE ATTEINTE CONTIENT UNE < VALEUR NEGATIVE, CELA SIGNIFIE < QU'ELLE EST LIBRE : LE POINT COURANT < EST DONC AU SOLEIL ; SINON, ON Y < TROUVE LA COORDONNEE 'Y' DU POINT < AU SOLEIL ALIGNE AVEC LE POINT < COURANT : SI LA DIFFERENCE DES 2 < ORDONNEES EST PETITE, ON CONSIDERE < LE POINT COURANT AU SOLEIL (CETTE < METHODE PERMET, JE L'ESPERE, < D'ELIMINER DES PROBLEMES DUS A < L'ALIASING INTER-LIGNE ET INTER- < PLAN...). < ON TROUVE ENSUITE LA MEME < CHSOE POUR LE PLAN SUIVANT 'Z+1' ; < ON NOTERA QUE 'COTE' SE REFERE < AU PLAN 'Z' ET 'KOTE' AU PLAN 'Z+1'... < < COTES: EQU $ < DEBUT DE LA ZONE DES 'COTES'... COTEV: EQU $ LCOTEV:: VAL XL512 DZS LCOTEV < COTE DROIT DE L'IMAGE. COTEH: EQU $ LCOTEH:: VAL XC512 DZS LCOTEH < COTE SUPERIEUR DE L'IMAGE. KOTEV: EQU $ LKOTEV:: VAL LCOTEV DZS LKOTEV < KOTE DROIT DE L'IMAGE. KOTEH: EQU $ LKOTEH:: VAL LCOTEH DZS LKOTEH < KOTE SUPERIEUR DE L'IMAGE. LCOTES:: VAL $-COTES < LONGUEUR DE LA ZONE DES 'COTES'... PAGE < < < M E S S A G E S : < < TABLE < < BUFFER BANDE : < LBUFMT: @ XWOR%1: VAL KOLF=FMASK+KOLTES=FVAL XWOR%1: VAL KOLC=FMASK+KDP=FVAL?XWOR%1 XWOR%2: VAL KOLTED=FMASK+KOL0=FVAL XWOR%2: VAL KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2 XWOR%3: VAL XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT... XWOR%4: VAL MSYMBI=FMASK+KOL0=FVAL XWOR%4: VAL MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4 XWOR%5: VAL XWOR%4=FCSYMT < ETAT DU SYMBOLE 'LBUFMT'... XWOR%6: VAL XWOR%5=FCSIGN XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN IF XWOR%6*XWOR%7,XEIF%,,XEIF% LBUFMT:: VAL 4096 XEIF%: VAL ENDIF BUFMT: EQU COTES < ATTENTION : 'BUFMT' ET 'COTES' SONT < RECOUVREMENT ; MAIS CELA NE GENE PAS < CAR LORSQU'ON LIT UNE BANDE, ON FORCE < (IECL)='NEXIST', ET DONC LES BUFFERS DE < 'COTES' SONT INUTILISES... IF LBUFMT/NOCMO-LCOTES,XEIF%,XEIF%, IF ATTENTION : LE RECOUVREMENT DE 'BUFMT' ET 'COTES' IF EST IMPOSSIBLE !!! XEIF%: VAL ENDIF < < < C O M M O N : < < COMMON COM: EQU $ < < MOT DESTINE AU BLOC FLOTTANT : < COMFLO: WORD NILK < MOT "BIDON" DESTINE AU BLOC FLOTTANT < POUR QU'IL Y FIT SES MERDES... ATSFLO: WORD TSFLO < POUR TESTER DE TEMPS EN TEMPS 'COMFLO'... < < INDICATEURS DE CONTROLE : < SCOUCH: WORD NILK < SEUIL DONNANT LE NIVEAU FRONTIERE ENTRE < L'EXTERIEUR ET L'INTERIEUR DE LA SUR- < FACE ALEATOIRE. ECOUCH: WORD NILK < SEUIL DONNANT 'SCOUCH' PLUS L'EPAISSEUR < DE LA SURFACE FRACTALE... NCOUCH: WORD NILK < NOMBRE DE COUCHES A SUPERPOSER (CORRES- < POND A UNE TROISIEME DIMENSION 'Z' < PERPENDICULAIRE A L'ECRAN). AXMIN: WORD K < ABSCISSE MINIMALE, AYMIN: WORD K < ORDONNEE MINIMALE, AZMIN: WORD XXNOIR+I < 'Z' MINIMALE (A NOTER LA VALEUR D'INI- < TIALISATION LIEE A LA NOTION DE "DEPTH- < CUEING"...). AMPLIR: FLOAT <NILK<NILK<NILK < AMPLIFICATEUR DU RESULTAT FINAL. MOYENE: FLOAT <NILK<NILK<NILK < VALEUR MOYENEE DU RESULTAT FINAL. MAXREC:: VAL 100 < VALEUR MAXIMALE DE 'NRECUR'... MRECUR: WORD NILK < NOMBRE DE RECURSIONS MAXIMAL LORS DE LA < SOMMATION DES FONCTION ALEATOIRES. NPM: WORD NILK < NOMBRE DE POINTS DES SPIRALES GENEREES < A PARTIR DES IMAGES 'TV1'/'TV2'. EXPOP0: FLOAT <NILK<NILK<NILK < EXPOSANT DE CALCUL DES EXPONENTIELLES. PASIX0: WORD NILK < PAS SUR OX, PASIY0: WORD NILK < PAS SUR OY, PASIZ0: WORD NILK < PAS SUR OZ. GRAINE: WORD NILK < GRAINE DE 'RDN'... SUPRDN: WORD NILK < SUP(RDN), INFRDN: WORD NILK < INF(RDN). MAXNIV: WORD NILK < MAXIMUM DES NIVEAUX TRACES, MINNIV: WORD NILK < MINIMUM DES NIVEAUX TRACES. TRONIV: WORD NEXIST < TRONQUER BRUTALEMENT ('EXIST') OU UTILI- < SER UNE FONCTION EN DENTS DE SCIE < ('NEXIST') POUR LES VALEURS DU CHAMP... PASDER: WORD NILK < PAS COURANT DE DERIVATION : ON NOTERA < QUE LES GRANDES VALEURS PERMETTENT UN < FILTRAGE DES DETAILS, ET QUE LES PETITES < VALEURS (SURTOUT SI 'NRECUR' EST FAIBLE) < DONNENT DE MAUVAIS RESULTATS... INEW: WORD EXIST < NOUVELLE METHODE ('EXIST') OU BIEN < ANCIENNE METHODE ('NEXIST') DU TRACE DE < LA SURFACE ; DANS LA NOUVELLE METHODE, < ON INTRODUIT UNE INTERPOLATION ENTRE < 2 PLANS CONSECUTIFS 'Z' ET 'Z+1'... IECL: WORD EXIST < ECLAIRER ('EXIST') OU FAIRE DU "DEPTH- < CUEING" ('NEXIST') DE LA SURFACE... IECLDC: WORD EXIST < S'IL Y A ECLAIRAGE (VOIR 'IECL') FAIRE < SIMULTANEMENT DU "DEPTH-CUEING" ('EXIST') < OU PAS ('NEXIST'). IOMBRE: WORD EXIST < S'IL Y A ECLAIRAGE DOIT-IL Y AVOIR DES < OMBRES PORTEES ('EXIST') OU DOIT-IL NE < PAS Y EN AVOIR ('NEXIST'). NPENOM: WORD NILK < LARGEUR DE LA ZONE DE PENOMBRE (DOIT < ETRE STRICTEMENT POSITIVE) ; SI LA VALEUR < EST 1, IL N'Y EN A PAS... IINTER: WORD EXIST < LORS DU TRACE DES SEGMENTS PAR 'SEGH' < INTERPOLER DE LA DROITE VERS LA GAUCHE < ('EXIST'), OU BIEN TRACER LES NIVEAUX < TELS QU'ILS ONT ETE CALCULES PAR L'EQUA- < TION DE LA SURFACE ('NEXIST'). IMAX: WORD EXIST < LORS DE L'INTERPOLATION PRENDRE LE 'MAX' < ENTRE LE NIVEAU DE 'LISTN' ET LE NIVEAU < CALCULE PAR INTERPOLATION ('EXIST'), OU < PRENDRE A PRIORI LE NIVEAU INTERPOLE < ('NEXIST') ; ON FAVORISE AINSI L'EN- < SOLEILLEMENT... IINTMI: WORD NEXIST < S'IL Y A INTERPOLATION, DOIT-ON FAIRE < UNE FAUSSE INTERPOLATION ('EXIST') QUI < CONSISTE A FORCER 'INTENG' SUR LE SEG- < MENT (VECGX1,EXTREM-1) ET 'INTEND' SUR < LE SEGMENT (EXTREM,VECGX2), OU BIEN ALORS < UNE VRAIE INTERPOLATION ('NEXIST'). NFONCT: WORD NEXIST < INDICATEUR DE MODULATION DE LA FONCTION < 'RDN' CALCULEE : < 'NEXIST' : PAS DE MODULATION, < TOUTE AUTRE VALEUR INDEXE UNE FONCTION < DE MODULATION TELLE 'FGAUSS'... FGAUSS:: VAL EXIST < INDEX DE LA MODULATION GAUSSIENNE QUI < VA CENTRER LA GENERATION AU CENTRE DU < CUBE VISUALISE... IERASE: WORD NEXIST < EFFACER ('EXIST'), OU NON ('NEXIST') < L'ECRAN 512... TRDNX: WORD K < TRANSLATION EN 'X' DU CHAMP RDN, TRDNY: WORD K < TRANSLATION EN 'Y' DU CHAMP RDN, TRDNZ: WORD K < TRANSLATION EN 'Z' DU CHAMP RDN. FH: FLOAT <NILK<NILK<NILK < POUR DEFINIR LA FONCTION DE MODULATION < DU "DEPTH-CUEING" ; EN EFFET, ON CAL- < CULE UN NOMBRE 'X' APPARTENANT A (0,255) < FONCTION DE LA PROFONDEUR PAR RAPPORT < A L'ECRAN. ENSUITE CET 'X' EST MODULE < PAR UNE FONCTION LINEAIRE : < Y=(255-'FH')*X/255+'FH', AVEC 'FH' DANS ( < 'Y' EST DONC DANS (FH,255) ; ET : < SI FH=0 : "DEPTH-CUEING" MAXIMAL, < SI FH=1 : PAS DE "DEPTH-CUEING"... IBANDE: WORD NEXIST < CHOIX DU MODE D'"ENTREE" DE LA FONCTION : < 'NEXIST' : ELLE EST CALCULEE A PARTIR < DE LA FORMULE ALEATOIRE RECUR- < SIVE, < 'EXIST' : ELLE EST LUE SUR BANDE, ET < ALORS ON A INTERET A FAIRE : < (ALPHA)=0... ABLOC0: WORD K < NUMERO DU PREMIER BLOC A LIRE SUR LA < BANDE MAGNETIQUE. < NOTA : SI (ABLOC0)<0 : ON TRAVAILLE EN < SEQUENTIEL STRICT, SANS JAMAIS RE- < INITIALISER L'ADRESSE COURANTE < SUR LA BANDE... IF XOPT01-EXIST,XOPT1,,XOPT1 XOPT1: VAL ENDIF < < CONSTANTES FLOTTANTES DE BASE : < F0: FLOAT <K<K<K < REMISE A ZERO FLOTTANTE... F1: FLOAT <W<K<K < L'UNITE EN FLOTTANT... XXXLOC: VAL YYYFLO < 'YYYFLO'. CALL #SIP UTILITAIRES# APWORK: EQU APFWOR < POUR LA COMPATIBILITE AVEC LES OVERLAYS < DE " +" (CF. 'SIO...'). < < POINT COURANT : < CS2D: EQU $ < DEBUT DES COORDONNEES 2D : YS: WORD NILK < COORDONNEES 2D DU XS: WORD NILK < POINT 3D PROJETE... LBUF2D:: VAL $-CS2D < NOMBRE DE MOTS NECESSAIRES POUR UN POINT, ZS: WORD NILK < TROISIEME COORDONNEE CORRESPONDANT A < L'EMPILEMENT DES COUCHES... LBUFGR:: VAL LBUF2D+LBUF2D < ET POUR UN VECTEUR. COORDX:: VAL XS-CS2D < INDEX DE LA COORDONNEE 'X', COORDY:: VAL YS-CS2D < INDEX DE LA COORDONNEE 'Y'. < < DEMANDE DE TEMPORISATION < APRES EFFACEMENT : < TEMPO: BYTE NVPSER;FONDOR WORD NILK < INUTILE... WORD XXXMOY < 2 PETITES SECONDES... XXXLOC: VAL YYYGOT < 'YYYGOT'. CALL #SIP UTILITAIRES# XXXVEC: VAL XXVEC2 < DEFINITION DES DONNEES DU VECTEUR 512... CALL #SIP VECTEUR 512# APOINT: WORD POINT < SOUS-PROGRAMME DE MARQUAGE D'UN POINT < DE COORDONNEES (X), DONT LE NIVEAU EST < CALCULE VIA LA TABLE 'LNIVO'. ALNIVO: WORD LNIVO,X < TABLE DE CORRESPONDANCE DES NIVEAUX POUR < LE SOUS-PROGRAMME 'POINT'. < < ACCES AUX REGISTRES DE CONTROLE : < ACTRL1: WORD RCTRL1 ACTRL2: WORD RCTRL2 < < CALCUL D'UN PRODUIT SCALAIRE : < APRSCA: WORD PRSCA < SOUS-PROGRAMME DE CALCUL D'UN PRODUIT < SCALAIRE DE 2 VECTEURS 3D... < < POINT TRI-DIMENSIONNEL COURANT : < CS3D: EQU $ < DEBUT DES COORDONNEES 3D : FXS: FLOAT <NILK<NILK<NILK < COORDONNEE 'X' 3D, FYS: FLOAT <NILK<NILK<NILK < COORDONNEE 'Y' 3D, FZS: FLOAT <NILK<NILK<NILK < COORDONNEE 'Z' 3D. LBUF3D:: VAL $-CS3D < NOMBRE DE MOTS POUR UN POINT 3D... IF LBUF3D/DFLOT-DIMGRA,,XEIF%, IF ATTENTION : INCOHERENCE DANS LES IF DIMENSIONS DE L'ESPACE DE TRACE GRAPHIQUE !!! XEIF%: VAL ENDIF < < DEFINITION DE LA NORMALE : < CN3D: EQU $ < DEBUT DES COORDONNEES DE LA NORMALE : FXN: FLOAT <NILK<NILK<NILK < X(N), FYN: FLOAT <NILK<NILK<NILK < Y(N), FZN: FLOAT <NILK<NILK<NILK < Z(N). APVALN: WORD PVALN < SOUS-PROGRAMME DE TEST DE NON-NULLITE < DU VECTEUR NORMAL. < < DEFINITION DE LA SOURCE LUMINEUSE : < CL3D: EQU $ < DEBUT DES COORDONNEES DE LA SOURCE 'L' : FXL: FLOAT <NILK<NILK<NILK < X(L), FYL: FLOAT <NILK<NILK<NILK < Y(L), FZL: FLOAT <NILK<NILK<NILK < Z(L). FPENTM: FLOAT <NILK<NILK<NILK < MEMORISE XL/YL, C'EST-A-DIRE L'INVERSE < DE LA PENTE "MOYENNE" DES RAYONS LUMI- < NEUX. < < CALCUL DE L'ECLAIRAGE : < FNIVC: FLOAT <NILK<NILK<NILK < VAUT 'XXN255' SI L'ON NE FAIT PAS DE < "DEPTH-CUEING", ET UNE FONCTION LINEAIRE < DE 'Z' DANS LE CAS CONTRAIRE. FNIVMX: FLOAT <XXN255<K<K < NIVEAU LUMINEUX MAXIMAL. FNIVEC: FLOAT <NILK<NILK<NILK < MODULATION COURANTE DE L'ECLAIRAGE DUE < A L'OMBRAGE. FNIVLU: FLOAT <W<K<K < MODULATION DE L'ECLAIRAGE D'UN POINT EN < PLEINE LUMIERE. FNIVOM: FLOAT <K<K+W*BASE10/XXXMOY<K < MODULATION DE L'ECLAIRAGE D'UN POINT A < L'OMBRE. FHP: FLOAT <NILK<NILK<NILK < FHP=255*FH, F255MH: FLOAT <NILK<NILK<NILK < F255MH=255-FHP. FPENOM: FLOAT <NILK<NILK<NILK < FPENOM=TNIVOM/NPENOM. TNIVOM: FLOAT <NILK<NILK<NILK < TNIVOM=FNIVLU-FNIVOM. AINTEN: WORD INTEN < SOUS-PROGRAMME DE CALCUL DE L'ECLAIRAGE. APNIVC: WORD PNIVC < SOUS-PROGRAMME DE CALCUL DE L'INTENSITE < LUMINEUSE MAXIMALE. APNIVO: WORD PNIVO < SOUS-PROGRAMME DE CALCUL DE L'INTENSITE < LUMINEUSE GLOBALE POUR LE PLAN 'Z', APNJVO: WORD PNJVO < SOUS-PROGRAMME DE CALCUL DE L'INTENSITE < LUMINEUSE GLOBALE POUR LE PLAN 'Z+1'. APLIST: WORD PLIST < INSERTION D'UN NIVEAU LUMINEUX DANS LA < LISTE 'LISTN'. AOMBRE: WORD OMBRE < CALCUL DES OMBRES PORTEES DANS LE PLAN < 'Z', AQMBRE: WORD QMBRE < CALCUL DES OMBRES PORTEES DANS LE PLAN < 'Z+1'. FANT0: WORD K-I < POUR INITIALISER 'FANTZ' ET 'FANTZ1' < EN DEBUT DE CHAQUE LIGNE. FANTZ: WORD NILK < MEMORISE RDN(X+1,Y,Z)-SCOUCH, FANTZ1: WORD NILK < MEMORISE RDN(X+1,Y,Z+1)-SCOUCH. ACOTEH: WORD COTEH,X < RELAI D'ACCES AU BORD SUPERIEUR (OU HORI- < ZONTAL) DE L'IMAGE, ACOTEV: WORD COTEV,X < RELAI D'ACCES AU BORD DROIT (OU VERTICAL) < DE L'IMAGE. XCOTEH: WORD COTEH-IJIJDX,X < POUR INITIALISER 'COTEH', XCOTEV: WORD COTEV-IJIJDX,X < POUR INITIALISER 'COTEV'. AKOTEH: WORD KOTEH,X < RELAI D'ACCES AU BORD SUPERIEUR (OU HORI- < ZONTAL) DE L'IMAGE, AKOTEV: WORD KOTEV,X < RELAI D'ACCES AU BORD DROIT (OU VERTICAL) < DE L'IMAGE. XKOTEH: WORD KOTEH-IJIJDX,X < POUR INITIALISER 'KOTEH', XKOTEV: WORD KOTEV-IJIJDX,X < POUR INITIALISER 'KOTEV'. < < TRANSLATION DE LA FONCTION : < TCOUCH: WORD NILK < VAUT '0 OU 'ICOUCH' SUIVANT 'INEW'... ICOUCH: WORD NILK < VAUT F(SCOUCH) SUIVANT LA MODULATION < DE RDN(X,Y,Z), VOIR A CE PROPOS LES < FONCTIONS DU TYPE 'FGAUS'... < < DONNEES D'INTERPOLATION < DES NIVEAUX DE GRIS : < INTEND: FLOAT <NILK<NILK<NILK < INTENSITE "DROITE", INTENG: FLOAT <NILK<NILK<NILK < INTENSITE "GAUCHE", PINTEN: FLOAT <NILK<NILK<NILK < PAS D'INTERPOLATION DE L'INTENSITE... < (DE "DROITE" VERS "GAUCHE"...) EXTREM: WORD NILK < ABSCISSE DU POINT DE NIVEAU MAXIMAL < SUR UN SEGMENT HORIZONTAL. ASEGH: WORD SEGH < SOUS-PROGRAMME DE TRACE D'UN SEGMENT < HORIZONTAL. ALISTN: WORD LISTN,X < RELAI VERS UNE LISTE CONTENANT LES < NIVEAUX CALCULES POUR LA LIGNE COU- < RANTE. ALISTX: WORD LISTN-IJIJDX,X < IDEM, RELAI DE NETTOYAGE... < < DONNEES DE DERIVATION : < PASMAX:: VAL 6 < PAS MAXIMAL D'ACCROISSEMENT DES VARIA- < BLES 'X', 'Y' ET 'Z' POUR CALCULER LES < DERIVEES PARTIELLES DE LA FONCTION. < < BUFFER DES LIGNES CONSECUTIVES : < ALIG: WORD LIG,X < BUFFER DE LA LIGNE COURANTE. XWOR%1: VAL $=FCTA ALIGM1: WORD LIGM1,X < BUFFER IF PASMAX-1,XEIF%,XEIF%, ALIGM2: WORD LIGM2,X < DES IF PASMAX-2,XEIF%,XEIF%, ALIGM3: WORD LIGM3,X < LIGNES IF PASMAX-3,XEIF%,XEIF%, ALIGM4: WORD LIGM4,X < PRECEDENTES... IF PASMAX-4,XEIF%,XEIF%, ALIGM5: WORD LIGM5,X < BUFFER IF PASMAX-5,XEIF%,XEIF%, ALIGM6: WORD LIGM6,X < DES IF PASMAX-6,XEIF%,XEIF%, ALIGM7: WORD LIGM7,X < LIGNES IF PASMAX-7,XEIF%,XEIF%, ALIGM8: WORD LIGM8,X < PRECEDENTES... XEIF%: VAL ENDIF XWOR%2: VAL $=FCTA IF XWOR%2-XWOR%1-PASMAX,,XEIF%, IF ATTENTION : INCOHERENCE !!! XEIF%: VAL ENDIF AALIGM: WORD NILK < RELAI DE RELAI POUR GENERER 'ALIGM' < AU DEBUT DE CHAQUE LIGNE... ALIGM: WORD NILK < BUFFER DE LA LIGNE PRECEDENTE "COURANTE". ALJG: WORD LJG,X < BUFFER DE LA LJGNE COURANTE. XWOR%1: VAL $=FCTA ALJGM1: WORD LJGM1,X < BUFFER IF PASMAX-1,XEIF%,XEIF%, ALJGM2: WORD LJGM2,X < DES IF PASMAX-2,XEIF%,XEIF%, ALJGM3: WORD LJGM3,X < LJGNES IF PASMAX-3,XEIF%,XEIF%, ALJGM4: WORD LJGM4,X < PRECEDENTES... IF PASMAX-4,XEIF%,XEIF%, ALJGM5: WORD LJGM5,X < BUFFER IF PASMAX-5,XEIF%,XEIF%, ALJGM6: WORD LJGM6,X < DES IF PASMAX-6,XEIF%,XEIF%, ALJGM7: WORD LJGM7,X < LJGNES IF PASMAX-7,XEIF%,XEIF%, ALJGM8: WORD LJGM8,X < PRECEDENTES... XEIF%: VAL ENDIF XWOR%2: VAL $=FCTA IF XWOR%2-XWOR%1-PASMAX,,XEIF%, IF ATTENTION : INCOHERENCE !!! XEIF%: VAL ENDIF AALJGM: WORD NILK < RELAI DE RELAI POUR GENERER 'ALJGM' < AU DEBUT DE CHAQUE LJGNE... ALJGM: WORD NILK < BUFFER DE LA LJGNE PRECEDENTE "COURANTE". PAGE < < < L O C A L : < < LOCAL LOC: EQU $ < < POUR CALCULER LA FONCTION < EN DENTS DE SCIE : < F255: WORD XXN255 F511: WORD NIV256+NIV256-Z < < VARIABLES MONTAGNEUSES : < GXS: FLOAT <NILK<NILK<NILK < COORDONNEES GYS: FLOAT <NILK<NILK<NILK < ABSOLUES GZS: FLOAT <NILK<NILK<NILK < DU POINT COURANT. FCUMR: FLOAT <NILK<NILK<NILK < SIGMA DES FONCTIONS ALEATOIRES < SCALANTES. FPOND: FLOAT <NILK<NILK<NILK < POUR LES PONDERER... FPOND0: FLOAT <NILK<NILK<NILK < VALEUR INITIALE DE LA PONDERATION : < FPOND0=RAC(PASIX*PASIY). RENORM: FLOAT <NILK<NILK<NILK < DONNE LE SIGMA DES 'FPOND' SCALANTS < DIVISE PAR 'FPOND0', ET PERMET DE CAL- < CULER LA FONCTION ALEATOIRE DANS UN < SEGMENT PREDETERMINE, ET QUI EST : < (INFRDN*AMPLI*AMPLIR,SUPRDN*AMPLI*AMPLIR) < < RELAIS MONTAGNEUX : < AFONCT: WORD FONCT < CALCUL DE LA FONCTION COURANTE. < < DEFINITION DE LA GRILLE : < NRECUR: WORD NILK < NOMBRE COURANT DE RECURSIONS... PASIX: WORD NILK < PAS SUR 'OX', PASIY: WORD NILK < PAS SUR 'OY', PASIZ: WORD NILK < PAS SUR 'OZ'. FPASIX: FLOAT <NILK<NILK<NILK < DE MEME FPASIY: FLOAT <NILK<NILK<NILK < EN FPASIZ: FLOAT <NILK<NILK<NILK < FLOTTANT... XNOEUD: WORD NILK < X(NOEUD BAS-GAUCHE) DE LA MAILLE, YNOEUD: WORD NILK < Y(NOEUD BAS-GAUCHE) DE LA MAILLE, ZNOEUD: WORD NILK < Z(NOEUD BAS-GAUCHE) DE LA MAILLE. AFNIV1: FLOAT <NILK<NILK<NILK AFNIV2: FLOAT <NILK<NILK<NILK AFNIV3: FLOAT <NILK<NILK<NILK AFNIV4: FLOAT <NILK<NILK<NILK AFNIV5: FLOAT <NILK<NILK<NILK AFNIV6: FLOAT <NILK<NILK<NILK AFNIV7: FLOAT <NILK<NILK<NILK AFNIV8: FLOAT <NILK<NILK<NILK KITER: WORD NILK < COMPTAGE DES RECURSIONS... < < PARAMETRES DU GENERATEUR ALEATOIRE : < RDN: WORD 4397 < NOMBRE ALEATOIRE COURANT. RDN1: WORD 5189 < CONSTANTE RDN2: WORD 6791 < DE CALCUL DES RDN3:: VAL 19 < NOMBRE ALEATOIRES... RDN4: WORD 7993 < 2EME NOMBRE ALEATOIRE COURANT. RDN5: WORD 4021 RDN6:: VAL 23 POINTS: WORD 16807 INF32: FLOAT 32768 INF64: FLOAT 65536 FWORK4: FLOAT <NILK<NILK<NILK FWORK5: FLOAT <NILK<NILK<NILK HINCU: FLOAT <NILK<NILK<NILK < POUR HINCV: FLOAT <NILK<NILK<NILK HINCW: FLOAT <NILK<NILK<NILK < L'INTERPOLATION... HINCU1: FLOAT <NILK<NILK<NILK < HINCU1=1-HINCU, HINCV1: FLOAT <NILK<NILK<NILK < HINCV1=1-HINCV, HINCW1: FLOAT <NILK<NILK<NILK < HINCW1=1-HINCW. FSUP: FLOAT <NILK<NILK<NILK < 'SUPRDN' EN FLOTTANT, FINF: FLOAT <NILK<NILK<NILK < 'INFRDN' EN FLOTTANT. SUP64: FLOAT <NILK<NILK<NILK < SUP/65536, UNMIS: FLOAT <NILK<NILK<NILK < 1-(INF/SUP), UNPIS: FLOAT <NILK<NILK<NILK < 32768*(1+(INF/SUP)). AMPLI: FLOAT <NILK<NILK<NILK < AMPLIFICATEUR DU SIGMA DES 'FPOND' < CALCULE A PARTIR DE 'NRECUR'. XAMPLI:: VAL 31 < POUR CALCULER 'KAMPLI'... KAMPLI: FLOAT <XAMPLI-I<K<K < POUR CALCULER 'AMPLI' A PARTIR DE < 'NRECUR'... < < POUR LE CALCUL DU LOGARITHME : < POLLO1: FLOAT <NILK<NILK<NILK < VARAIBLE DE MANOEUVRE... POLLO2: FLOAT <NILK<NILK<NILK POLLO3: FLOAT <NILK<NILK<NILK POLLO4: FLOAT 0.7071067 < RACINE(2)/2. POLLO5: FLOAT 1.2920088 < COEFFICIENTS POLLO6: FLOAT 2.6398577 < DU POLLO7: FLOAT 1.656763 < DEVELOPPEMENT. POLLO8: EQU F05 < CONSTANTE 1/2. POLLO9: FLOAT 0.6931472 < LN(2). < < POUR LE CALCUL DE L'EXPONENTIELLE : < POLEX1: EQU POLLO1 < VARIABLE DE MANOEUVRE... POLEX2: EQU POLLO2 POLEX3: EQU POLLO3 POLEX4: FLOAT 1.442695 < LOG2(E). POLEX5: WORD NILK < RELEVE DE L'EXPOSANT POLEX6: EQU F1 < 1.0 POLEX7: FLOAT 2 < 2. POLEX8: FLOAT 87.417488 < COEFFICIENTS POLEX9: FLOAT 0.0346573 < DU POLEY0: FLOAT -17830.91 < DEVELOPPEMENT. POLEY1: FLOAT 9.9545955 SIGNE: WORD NILK < POUR DETERMINER LE SIGNE DE X**Y... < < POUR CALCULER < LES EXPOSANTS : < EXPOP: FLOAT <NILK<NILK<NILK < EXPOSANT COURANT... F3: FLOAT <DIMGRA<K<K < POUR CALCULER UNE RACINE CUBIQUE (PASSA- < D'UN VOLUME A UNE DIMENSION...). XXMASK:: VAL MOCG XX7F:: VAL '7F < MAXIMUM POSITIF, XX80:: VAL -'80 < MIMIMUM NEGATIF. < < RELAIS DE SOUS-PROGRAMMES : < ASPRDN: WORD SPRDN < GENERATEUR ALEATOIRE DONNANT RDN(XS,YS). ARAK: WORD RAK < CALCUL DE LA PUISSANCE P/(2**Q) D'UN < NOMBRE... < < VARIABLES DE MANOEUVRE : < FWORK1: FLOAT <NILK<NILK<NILK FWORK2: FLOAT <NILK<NILK<NILK < < POUR LE CALCUL D'UNE < INTENSITE LUMINEUSE : < NIVBAS:: VAL 1 < NIVEAU MINIMAL... FNIVBA: FLOAT <NIVBAS<K<K < POUR ELIMINER LA GENERATION DE POINTS < NOIRS... < < RELAIS D'ACCES AUX LISTES < DE DESCRIPTION DU MAILLAGE : < ALPASX: WORD LPASX,X < RELAI D'ACCES A 'PASIX' FLOTTANT, ALPSIX: WORD LPSIX,X < RELAI D'ACCES A 'PASIX' ENTIER. ALPASY: WORD LPASY,X < RELAI D'ACCES A 'PASIY' FLOTTANT, ALPSIY: WORD LPSIY,X < RELAI D'ACCES A 'PASIY' ENTIER. ALPASZ: WORD LPASZ,X < RELAI D'ACCES A 'PASIZ' FLOTTANT, ALPSIZ: WORD LPSIZ,X < RELAI D'ACCES A 'PASIZ' ENTIER. ALPOND: WORD LPOND,X < RELAI D'ACCES A 'FPOND'. < < POUR ACCEDER AUX IMAGES : < SAVER: WORD NILK < SAUVEGARDE D'UN MOT DE LA TRAME < RESIDENTE ROUGE, SAVEV: WORD NILK < DE MEME POUR LE VERT, SAVEB: WORD NILK < DE MEME POUR LE BLEU. MCDAR: EQU SAVER < SAUVEGARDE D'UN MOT DE LA TRAME < SCRATCH ROUGE, MCDAV: EQU SAVEV < DE MEME POUR LE VERT, MCDAB: EQU SAVEB < DE MEME POUR LE BLEU. XCTCDA: WORD NILK < CONSTANTE DE TRANSLATION PERMETTANT < D'ATTEINDRE INDIFFEREMMENT 'TV1' OU < 'TV2'... CTCDA: WORD TV2-TV1 < POUR ATTEINDRE 'TV2'... < < DEFINITION DE L'ACCELERATEUR < DES ACCES A 'TV1' ET 'TV2' : < ASHPR: @ XWOR%1: VAL KOLF=FMASK+KOLTES=FVAL XWOR%1: VAL KOLC=FMASK+KDP=FVAL?XWOR%1 XWOR%2: VAL KOLTED=FMASK+KOL0=FVAL XWOR%2: VAL KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2 XWOR%3: VAL XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT... XWOR%4: VAL MSYMBI=FMASK+KOL0=FVAL XWOR%4: VAL MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4 XWOR%5: VAL XWOR%4=FCSYMT < ETAT DU SYMBOLE 'ASHPR'... XWOR%6: VAL XWOR%5=FCSIGN XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN IF XWOR%6*XWOR%7,XEIF%,,XEIF% ASHPR:: VAL 123 < ON SE DONNE UN NOMBRE PREMIER... XEIF%: VAL ENDIF LASHT: WORD ASHPR < POUR FAIRE DES CALCULS MODULO 'ASHPR'. SAVYX: BYTE NILK;NILK < POUR MEMORISER UN COUPLE (Y,X). INOC:: VAL -EXIST < ETAT INOCCUPE D'UNE ENTREE DE LA TABLE. ASHT1:: MOT O < POUR ACCEDER A LA PARTIE (Y,X) DE LA < TABLE, ASHT2:: MOT ASHT1+ASHPR < POUR ACCEDER A LA PARTIE TV1/TV2/NIVEAU < DE LA TABLE. < < DEFINITION DE LA SPIRALE < DE CALCUL D'UN SIGMA(X,Y) : < PASQ: WORD NILK < PAS DE PARCOURS DE LA SPIRALE, DELTAX: WORD NILK < VECTEUR TRANSLATION DELTAY: WORD NILK < COMPLEXE COURANT. LB: WORD NILK < LONGUEUR DES LB0: WORD NILK < BRANCHES DE LA SPIRALE. NP: WORD NILK < NOMBRE DE POINT COURANT, FNPM: FLOAT <NILK<NILK<NILK < NOMBRE DE POINTS FLOTTANT DE LA SPIRALE. < < SIGMA(X,Y) SUR UNE SPIRALE : < F2:: FLOAT <XXXMOY<K<K F4:: FLOAT <XXXMOY*XXXMOY<K<K CUMUL: WORD NILK < SIGMA(NIVEAU(X,Y)). ASPIRL: WORD SPIRAL < SOUS-PROGRAMME DE CALCUL DE 'CUMUL'... < < PARTICIPATIONS RELATIVES DE < LA GENERATION ALEATOIRE ET < DE LA SOMMATION SUR UNE < SPIRALE CENTREE EN (256,256) : < PONRDN: FLOAT <NILK<NILK<NILK < CONTRIBUTION DE LA GENERATION ALEATOIRE, PONSPI: FLOAT <NILK<NILK<NILK < CONTRIBUTION DES SPIRALES. < < DONNEES DE GENERATION DE 'LNIVO' : < NI: @ XWOR%1: VAL KOLF=FMASK+KOLTES=FVAL XWOR%1: VAL KOLC=FMASK+KDP=FVAL?XWOR%1 XWOR%2: VAL KOLTED=FMASK+KOL0=FVAL XWOR%2: VAL KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2 XWOR%3: VAL XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT... XWOR%4: VAL MSYMBI=FMASK+KOL0=FVAL XWOR%4: VAL MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4 XWOR%5: VAL XWOR%4=FCSYMT < ETAT DU SYMBOLE 'NI'... XWOR%6: VAL XWOR%5=FCSIGN XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN IF XWOR%6*XWOR%7,XEIF%,,XEIF% NI:: VAL XXNOIR < LE NIVEAU INITIAL SERA LE NIVEAU NOIR. XEIF%: VAL ENDIF ND: @ XWOR%1: VAL KOLF=FMASK+KOLTES=FVAL XWOR%1: VAL KOLC=FMASK+KDP=FVAL?XWOR%1 XWOR%2: VAL KOLTED=FMASK+KOL0=FVAL XWOR%2: VAL KOLTEF=FMASK+KOL0+KOLON=FVAL?XWOR%2 XWOR%3: VAL XWOR%2=XWOR%1-KOL0 < LONGUEUR DU SYMBOLE COURANT... XWOR%4: VAL MSYMBI=FMASK+KOL0=FVAL XWOR%4: VAL MSYMBL=FMASK+XWOR%3=FVAL?XWOR%4 XWOR%5: VAL XWOR%4=FCSYMT < ETAT DU SYMBOLE 'ND'... XWOR%6: VAL XWOR%5=FCSIGN XWOR%7: VAL XWOR%5(MSYMBN)MSYMBN=FCSIGN IF XWOR%6*XWOR%7,XEIF%,,XEIF% ND:: VAL W < PAS DE DIVISEUR DES NIVEAUX... XEIF%: VAL ENDIF < < GESTION DU "DEPTH-CUEING" : < FCOUCH: FLOAT <NILK<NILK<NILK < POUR CALCULER : < NIVEAU=FCOUCH*Z. < < DEFINITION DE LA MODULATION GAUSSIENNE : < TXGAUS: WORD NILK < TRANSLATION DES COORDONNEES 'X', TYGAUS: WORD NILK < TRANSLATION DES COORDONNEES 'Y', ZCOUCH:: VAL NIV256 < VALEUR MAXIMALE DE LA COORDONNEE 'Z' ; < CETTE VALEUR EST LIEE A UNE UTILISATION < EN MODE "DEPTH-CUEING"... TZGAUS: WORD NILK < TRANSLATION DES COORDONNEES 'Z'. DXGAUS: FLOAT <NILK<NILK<NILK < POUR "NORMALISER" (X-TX)**2, DYGAUS: FLOAT <NILK<NILK<NILK < POUR "NORMALISER" (Y-TY)**2, DZGAUS: FLOAT <NILK<NILK<NILK < POUR "NORMALISER" (Z-TZ)**2. AEXPON: WORD EXPON < SOUS-PROGRAMME DE CALCUL D'UNE EXPO- < NENTIELLE. < < < C O N S T A N T E M A G I Q U E : < < MAGIK:: VAL 7 < CONSTANTE MAGIQUE... IF K*MAGIK/BASE16(K=FCREST-K,,XEIF%, IF ATTENTION : IL FAUT MAGIK(K)=K POUR IF SIMPLIFIER LES CHOSES EN BASE 16 !!! XEIF%: VAL ENDIF XWOR%3: VAL MAGIK < CONSTANTE MAGIQUE... XWOR%7: VAL K < INITIALISATION DU CUMUL... NTRN DO BASE16 XWOR%7: VAL K=FCDO*XWOR%3/BASE16(K=FCREST?COSBT=FMASK(K?XWOR%7=FCINST XWOR%8: VAL K < INITIALISATION DU CUMUL... DO BASE16 XWOR%8: VAL K=FCDO?COSBT=FMASK(K?XWOR%8=FCINST TRN IF XWOR%7-XWOR%8,,XEIF%, IF ATTENTION : LA CONSTANTE MAGIQUE 'MAGIK' IF N'OPERE PAS UNE PERMUTATION DES 16 CHIFFRES IF DE 0 A F !!! XEIF%: VAL ENDIF IF K*MAGIK/BASE10(K=FCREST-K,,XEIF%, IF ATTENTION : IL FAUT MAGIK(K)=K POUR IF SIMPLIFIER LES CHOSES EN BASE 10 !!! XEIF%: VAL ENDIF XWOR%3: VAL MAGIK < CONSTANTE MAGIQUE... XWOR%7: VAL K < INITIALISATION DU CUMUL... NTRN DO BASE10 XWOR%7: VAL K=FCDO*XWOR%3/BASE10(K=FCREST?COSBT=FMASK(K?XWOR%7=FCINST XWOR%8: VAL K < INITIALISATION DU CUMUL... DO BASE10 XWOR%8: VAL K=FCDO?COSBT=FMASK(K?XWOR%8=FCINST TRN IF XWOR%7-XWOR%8,,XEIF%, IF ATTENTION : LA CONSTANTE MAGIQUE 'MAGIK' IF N'OPERE PAS UNE PERMUTATION DES 10 CHIFFRES IF DE 0 A 9 !!! XEIF%: VAL ENDIF AMAGIK: WORD MAGIK < < GESTION DU DEROULEUR : < NVPMT:: VAL '0B < 'NVP' D'ACCES AU DEROULEUR DE BANDES. DEMMT: BYTE NVPMT;XFMTRA < DEMANDE DE LECTURE A ACCES DIRECT. WORD BUFMT=FCTA*NOCMO WORD LBUFMT WORD NILK < ADRESSE DU BLOC COURANT. IBUFMT: WORD LBUFMT-Z+I < INDEX COURANT DU BUFFER 'MT', ZBUFMT: WORD LBUFMT-Z+I < ET POUR FORCER LA LECTURE DU PREMIER < BLOC DE CHAQUE IMAGE... ABUFMT: WORD BUFMT,X < ET RELAI D'ACCES... < < "CADRAGE" DES OCTETS : < TRANMT: FLOAT <NILK<NILK<NILK < TRANSLATION ET MULTMT: FLOAT <NILK<NILK<NILK < MISE A L'ECHELLE... PAGE < < < T A B L E A A C C E S A L E A T O I R E : < < ASHT: EQU $ DO ASHPR BYTE NILK;NILK < COUPLES (Y,X). IF INOC-K,XEIF%,, IF ATTENTION : LA VALEUR DE 'INOC' EST INACCEPTABLE !!! XEIF%: VAL ENDIF DO ASHPR WORD INOC < ETAT INOCCUPE. PAGE < < < L I S T E D E S N I V E A U X < D E L A L I G N E C O U R A N T E : < < LISTN: EQU $ LLISTN:: VAL XC512/NOCMO < LONGUEUR-MOTS DE 'LISTN'. NLS DO LLISTN BYTE NILK;NILK LST PAGE < < < T A B L E D E T R A N S C O D A G E D E S N I V E A U X : < < < ARGUMENTS D'ASSEMBLAGE : < ND=DIVISEUR DES NIVEAUX DE 'LNIVO' (0 OU 2), < NI=TRANSLATION DES NIVEAUX DE 'LNIVO' (0 OU 128)... < < LNIVO: EQU $ NTRN XWOR%1: VAL NIV256+NOCMO-E/NOCMO XWOR%2: VAL NIV256/NOCMO(K=FCREST TRN XWOR%3: VAL NIV256+XWOR%2 < INCREMENT DES OCTETS GAUCHES, XWOR%4: VAL XWOR%3+NOCMO-Z < INCREMENT DES OCTETS DROITS. NTRN <******************************************************************************* DO XWOR%1 BYTE K=FCDO)MFFFF+N-Z*NOCMO+XWOR%3/ND+NI;K=FCDO)MFFFF+N-Z*NOCMO+XWOR%4/ND+NI XWOR%5: VAL '0000000@@@@ < RECUPERATION DU DERNIER MOT, <******************************************************************************* TRN IF XWOR%2-K,,XEIF%, XWOR%5: VAL XWOR%5(MOCG < DANS LE CAS D'UNE TABLE DE LONGUEUR < IMPAIRE, ON EFFACE LE DERNIER OCTET < GENERE, $EQU $-D < ON REVIENT D'UN MOT EN ARRIERE, WORD XWOR%5 < ET ON REGENERE LE DERNIER MOT... XEIF%: VAL ENDIF PAGE < < < L I S T E S D E D E S C R I P T I O N < D U M A I L L A G E : < < LPASX: EQU $ NLS DO MAXREC FLOAT <NILK<NILK<NILK < 'PASIX'. LST LPSIX: EQU $ NLS DO MAXREC WORD NILK LST LPASY: EQU $ NLS DO MAXREC FLOAT <NILK<NILK<NILK < 'PASIY', LST LPSIY: EQU $ NLS DO MAXREC WORD NILK LST LPASZ: EQU $ NLS DO MAXREC FLOAT <NILK<NILK<NILK < 'PASIZ'. LST LPSIZ: EQU $ NLS DO MAXREC WORD NILK LST LPOND: EQU $ NLS DO MAXREC FLOAT <NILK<NILK<NILK < 'FPOND'. LST PAGE < < < B U F F E R S D E S L I G N E S C O N S E C U T I V E S : < < < NOTA : < 'LIG' SE REFERE AU PLAN 'Z', < ALORS QUE 'LJG' SE REFERE AU < PLAN SUIVANT 'Z+1'... < < LIG: EQU $ NLS DO XC512 WORD NILK < LIGNE COURANTE. LST LIGM1: EQU $ NLS DO XC512 WORD NILK LST IF PASMAX-1,XEIF%,XEIF%, LIGM2: EQU $ NLS DO XC512 WORD NILK LST IF PASMAX-2,XEIF%,XEIF%, LIGM3: EQU $ NLS DO XC512 WORD NILK LST IF PASMAX-3,XEIF%,XEIF%, LIGM4: EQU $ NLS DO XC512 WORD NILK LST IF PASMAX-4,XEIF%,XEIF%, LIGM5: EQU $ NLS DO XC512 WORD NILK LST IF PASMAX-5,XEIF%,XEIF%, LIGM6: EQU $ NLS DO XC512 WORD NILK LST IF PASMAX-6,XEIF%,XEIF%, LIGM7: EQU $ NLS DO XC512 WORD NILK LST IF PASMAX-7,XEIF%,XEIF%, LIGM8: EQU $ NLS DO XC512 WORD NILK LST XEIF%: VAL ENDIF LJG: EQU $ NLS DO XC512 WORD NILK < LJGNE COURANTE. LST LJGM1: EQU $ NLS DO XC512 WORD NILK LST IF PASMAX-1,XEIF%,XEIF%, LJGM2: EQU $ NLS DO XC512 WORD NILK LST IF PASMAX-2,XEIF%,XEIF%, LJGM3: EQU $ NLS DO XC512 WORD NILK LST IF PASMAX-3,XEIF%,XEIF%, LJGM4: EQU $ NLS DO XC512 WORD NILK LST IF PASMAX-4,XEIF%,XEIF%, LJGM5: EQU $ NLS DO XC512 WORD NILK LST IF PASMAX-5,XEIF%,XEIF%, LJGM6: EQU $ NLS DO XC512 WORD NILK LST IF PASMAX-6,XEIF%,XEIF%, LJGM7: EQU $ NLS DO XC512 WORD NILK LST IF PASMAX-7,XEIF%,XEIF%, LJGM8: EQU $ NLS DO XC512 WORD NILK LST XEIF%: VAL ENDIF PAGE < < < P I L E D E T R A V A I L : < < STACK: EQU $ DZS 64 PROG XXXVEC: VAL XXVEC3 < DEFINITION DES PROGRAMMES VECTEUR 512... CALL #SIP VECTEUR 512# PAGE < < < M A R Q U A G E D ' U N P O I N T : < < < FONCTION : < CE SOUS-PROGRAMME MARQUE < LE POINT ARGUMENT (X,Y) AVEC < COMME NIVEAU, LE NIVEAU ARGU- < MENT (A) TRANSCODE VIA LA TA- < BLE 'LNIVO', CE QUI PERMET PAR < EXEMPLE LA SUPERPOSITION DE < PLUSIEURS IMAGES, EN FAISANT < QUE LEURS TABLES 'LNIVO' SOIENT < COMPLEMENTAIRES... < < < ARGUMENTS : < (A)=NIVEAU, < (X,Y)=COORDONNEES DU POINT. < < < RESULTAT : < (A)=NIVEAU TRANSCODE, OU NIVEAU PRE-EXISTANT, < (B) EST DETRUIT !!! < < POINT: EQU $ < < TRANSCODAGE DU NIVEAU : < PSR X < SAUVEGARDE DE LA COORDONNEE 'X'... LR A,X < (X)=NIVEAU ARGUMENT, LBY &ALNIVO < (A)=NIVEAU TRANSCODE, PLR X < RESTAURE : < (X)=COORDONNEE 'X'. < < MARQUAGE DU POINT : < POINT3: EQU $ BSR ASTORP < MARQUAGE : (X,Y) <-- (A)... < < ET RETOUR : < POINT2: EQU $ RSR PAGE < < < T R A C E D ' U N S E G M E N T H O R I Z O N T A L : < < < ARGUMENTS : < (VECGX1,VECGY1)=COORDONNEES DU POINT "GAUCHE", < (VECGX2,VECGY2)=COORDONNEES DU POINT "DROITE", < (INTENG)=NIVEAU "GAUCHE", < (INTEND)=NIVEAU "DROITE". < < SEGH: EQU $ < < INITIALISATIONS : < PSR X,Y < SAUVEGARDE DES COORDONNEES 'X' ET 'Y'... < < CALCUL DU NOMBRE DE POINTS : < LA VECGX2 < (A)=ORDONNEE "DROITE", SB VECGX1 < (A)=ORDONNEE "DROITE"-ORDONNEE "GAUCHE", LR A,X < (A)=NOMBRE D'INTERVALLES, ADRI Z,X < (X)=NOMBRE DE POINTS A TRACER... JAE SEGH00 < RIEN A FAIRE, PAS D'INTERVALLE... JAG SEGH01 < OK... QUIT XXQUIT < E R R E U R P R O G R A M M E ... SEGH01: EQU $ IF EXIST-K,XEIF%,,XEIF% IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ IINTMI < VRAIE OU FAUSSE INTERPOLATION ??? JNE SEGH20 < FAUSSE, ON VA FORCER 'INTENG' SUR LE < SEGMENT (VECGX1,EXTREM-1) ET 'INTEND' < SUR (EXTREM,VECGX2)... < < VRAIE INTERPOLATION, < CALCUL DU PAS D'INTER- < POLATION DES NIVEAUX : < FLT < IL Y A AU MOINS UN INTERVALLE : #/FST# FWORK1 #/FLD# INTENG < (A,B)=INTENSITE "GAUCHE", FSB INTEND < (A,B)=INTENSITE "GAUCHE"-INTENSITE "DROIT FDV FWORK1 < (A,B)=PAS D'INTERPOLATION DE L'INTENSITE < LUMINEUSE... #/FST# PINTEN < ET MEMORISATION... SEGH20: EQU $ SEGH00: EQU $ < < TRACE POINT A POINT : < LY VECGX2 < (Y)=ABSCISSE "DROITE", #/FLD# INTEND < (A,B)=INTENSITE LUMINEUSE COURANTE, SEGH10: EQU $ PSR A,B,X,Y < QUE L'ON SAUVEGARDE, AINSI QUE LE DE- < COMPTE DES POINTS A TRACER, ET L'ABSCISSE < COURANTE... IF EXIST-K,XEIF%,,XEIF% IF ATTENTION : CE QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF CPZ INEW < EST-CE LA NOUVELLE METHODE ??? JNE SEGH21 < OUI : VRAIE INTERPOLATION... IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ IINTMI < VRAIE OU FAUSSE INTERPOLATION ??? JE SEGH21 < VRAIE... #/FLD# INTEND < FAUSSE : XR A,Y < TEST DE L'ABSCISSE (DANS 'Y'...) : CP EXTREM < A-T'ON PASSER LE MAXIMUM ??? XR A,Y JGE SEGH22 < SUR (EXTREM,VECGX2), ON A: < (A,B)=INTENSITE "DROITE", #/FLD# INTENG < SUR (VECGX1,EXTREM-1), ON A : < (A,B)=INTENSITE "GAUCHE" : SEGH22: EQU $ SEGH21: EQU $ BSR AROND < (A)=NIVEAU ENTIER DU POINT COURANT, LR Y,X < (X)=ABSCISSE COURANTE, IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ IMAX < FAUT-IL EXTRAIRE LE 'MAX' ENTRE LE NIVEAU < DE 'LISTN(X)' ET LE NIVEAU INTERPOLE ??? JE SEGH31 < NON, ON PREND LE NIVEAU INTERPOLE A < PRIORI... LR A,B < OUI : < (B)=NIVEAU INTERPOLE, LBY &ALISTN < (A)=NIVEAU REEL AU POINT (X,Y,Z), CPR B,A < RECHERCHE DU 'MAX' : JGE SEGH30 < (A)>=(B) : C'EST LE NIVEAU REEL... LR B,A < (A)<(B) : C'EST LE NIVEAU INTERPOLE... SEGH30: EQU $ SEGH31: EQU $ LY VECGY2 < (X)=(VECGY1)=(VECGY2)=ORDONNEE DU POINT < COURANT, BSR APOINT < ET TRACE DU POINT COURANT... PLR A,B,X,Y < RESTAURE : < (Y)=ABSCISSE COURANTE, < (X)=DECOMPTE DES POINTS, < (A,B)=NIVEAU COURANT, FAD PINTEN < QUE L'ON MODIFIE... ADRI -I,Y < ET MODIFICATION DE L'ABSCISSE... JDX SEGH10 < VERS LE POINT COURANT, S'IL EXISTE... < < ET RETOUR : < PLR X,Y < ET ENFIN, RESTAURE : < (X,Y)=COORDONNES COURANTES DE GENERATION. RSR PAGE < < < C A L C U L D ' U N E I N T E N S I T E L U M I N E U S E : < < < FONCTION : < ETANT DONNE LE POINT COURANT, < ET SA NORMALE, CE SOUS-PROGRAM- < ME CALCULE EN FONCTION DE LA < SOURCE LUMINEUSE L'INTENSITE < A ATTRIBUER AU POINT COURANT. < < < ARGUMENTS : < (FXN,FYN,FZN)=COORDONNEES DU VECTEUR NORMAL, < (FXL,FYL,FZL)=COORDONNEES DE LA SOURCE LUMINEUSE. < < < RESULTAT : < (A,B)=INTENSITE LUMINEUSE. < < INTEN: EQU $ < < NORME DE LA NORMALE : < LRM A,B WORD CN3D < (A)=ADRESSE DE LA NORMALE, WORD CN3D < (B)=ADRESSE DE LA NORMALE, BSR APRSCA < ET CALCUL DU CARRE DE SA NORME, #/FST# FWORK1 < (FWORK1)=NORME(X(N),Y(N),Z(N))**2, < < CALCUL DU RAYON LUMINEUX : < LR W,A < Z(A), FLT FSB FZL < Z(A)-Z(L), #/FST# FZS < (FZS)=Z(A)-Z(L). LR Y,A < Y(A), FLT FSB FYL < Y(A)-Y(L), #/FST# FYS < (FYS)=Y(A)-Y(L). LR X,A < X(A), FLT FSB FXL < X(A)-X(L), #/FST# FXS < (FXS)=X(A)-X(L). < < NORME DU RAYON LUMINEUX : < LRM A,B WORD CS3D < (A)=ADRESSE DU RAYON LUMINEUX, WORD CS3D < (B)=ADRESSE DU RAYON LUMINEUX, BSR APRSCA < ET CALCUL DU CARRE DE SA NORME, FMP FWORK1 < CALCUL DU CARRE DU PRODUIT DU MODULE < DE LA NORMALE ET DU RAYON LUMINEUX, BSR ARAC #/FST# FWORK1 < (FWORK1)=PRODUIT DE LA NORME DE LA NOR- < MALE ET DE LA NORME DU RAYON < LUMINEUX. < < CALCUL DE L'ANGLE ENTRE LE < NORMALE ET LE RAYON LUMINEUX : < LRM A,B WORD CN3D < (A)=ADRESSE DE LA NORMALE, WORD CS3D < (B)=ADRESSE DU RAYON LUMINEUX, BSR APRSCA < (A,B)=PRODUIT SCALAIRE DE LA NORMALE, < ET DU RAYON LUMINEUX, FDV FWORK1 < (A,B)=COS(TETA), OU 'TETA' DESIGNE < L'ANGLE ENTRE LA NORMALE ET LE < RAYON LUMINEUX. < < CALCUL DE L'INTENSITE < LUMINEUSE AU POINT COURANT : < FAD F1 < (A,B)=1+COS(TETA), FMP F05 < (A,B)=(1+COS(TETA))/2, < SOIT UN NOMBRE DANS (0,1)... FMP FNIVC < (A,B)=NIVEAU FLOTTANT A DONNER AU POINT < COURANT. FCAM FNIVBA < NE VA-T'ON PAS CREER UN POINT NOIR ??? JGE INTEN1 < NON, OK... #/FLD# FNIVBA < OUI, ON LE "SATURE"... INTEN1: EQU $ < < ET RETOUR : < BSR ATSFLO RSR PAGE < < < C A L C U L D E L ' E C L A I R A G E M A X I M A L : < < < ARGUMENT : < (W)=COORDONNEE 'Z'. < < < RESULTAT : < (A,B)=INTENSITE LUMINEUSE MAXIMALE FONCTION DE 'Z'. < < PNIVC: EQU $ LR W,A < ON EST A L'INTERIEUR, ON TRACE : < (A)=COORDONNEE 'Z' COURANTE, FLT FMP FCOUCH < ET "Z-MODULATION" : < (A,B)=INTENSITE LUMINEUSE MAXIMALE... FMP F255MH < PUIS ON PLACE CETTE VALEUR DE (0,255) FAD FHP < DANS LE SEGMENT (FHP,255)... RSR < ET C'EST TOUT... PAGE < < < O M B R E S P O R T E E S S U R L E P L A N ' Z ' : < < < FONCTION : < ON SUPPOSE QUE LES RAYONS < LUMINEUX SONT SITUES DANS LES < PLANS A 'Z' CONSTANT ; EN NOTANT < (X0,Y0) LES COORDONNEES DU POINT < COURANT DANS LE PLAN 'Z' COURANT, < ET (XL,YL) CELLES DE LA SOURCE < LUMINEUSE DANS CE MEME PLAN, LA < DROITE "RAYON LUMINEUX" A POUR < EQUATION : < < (X-X0)/(XL-X0)=(Y-Y0)/(YL-Y0), < < SOIT EN INVERSANT LES SIGNES : < < (X-X0)/(X0-XL)=(Y-Y0)/(Y0-YL). < < ON CHERCHE ENSUITE LES INTER- < SECTIONS DE CETTE DROITE AVEC LES < BORDS SUPERIEUR ET DROIT DE L'IMAGE, < SOIT AVEC LES DROITES D'EQUATIONS < < X=XMAX (BORD DROIT), < Y=YMAX (BORD SUPERIEUR), < < D'OU LES VALEURS DE 'X' ET 'Y' : < < X=X0+((X0-XL)/(Y0-YL))*(YMAX-Y0), < Y=Y0+((Y0-YL)/(X0-XL))*(XMAX-X0). < < SUPPOSANT LA SOURCE LUMINEUSE A < L'INFINI, LES RAYONS LUMINEUX < DEVIENNENT PARALLELES, ET LE < RAPPORT ((X0-XL)/(Y0-YL)) DE- < VIENT CONSTANT ; ON L'APPELLE < 'PENTM' (C'EST L'INVERSE DE LA PEN- < TE) ; CE TRUANDAGE PERMET DE SIM- < PLIFIER LE PROBLEME SUIVANT : < DEUX POINTS A(X,Y) ET B(X-1,Y-1) < PAR EXEMPLE PEUVENT AVOIR LA MEME < PROJECTION SUR 'COTE', ET PAR LA < L'UN OMBRE L'AUTRE CE QUI EST FAUX... < ON A DONC : < < X=X0+(YMAX-Y0)*PENTM, < Y=Y0+(XMAX-X0)/PENTM. < < < ARGUMENTS : < (X,Y,W)=POINT COURANT. < < < RESULTAT : < (A,B)=CONTRIBUTION LUMINEUSE DES OMBRES PORTEES. < < OMBRE: EQU $ < < INITIALISATION : < IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ IOMBRE < FAUT-IL LES OMBRES PORTEES ??? JE OMB001 < NON, ET 'FNIVEC' EST BON... PSR X < SAUVEGARDE DE LA COORDONNEE 'X'... < < INTERSECTION DU RAYON LUMINEUX < COURANT AVEC LE BORD SUPERIEUR < DE L'IMAGE (NE PAS OUBLIER LES < HYPOTHESES SUR LA POSITION DU < SOLEIL...) : < LA VECTNL < YMAX, SBR Y,A < YMAX-Y0, FLT < YMAX-Y0, FMP FPENTM < ((X0-XL)/(Y0-YL))*(YMAX-Y0), FIX < (ET NON PAS 'AROND' POUR TOUJOURS FAIRE < L'ERREUR DANS LE MEME SENS...) ADR X,A < X=X0+((X0-XL)/(Y0-YL))*(YMAX-Y0), JAGE OMB973 < OK... QUIT XXQUIT < E R R E U R P R O G R A M M E ... OMB973: EQU $ CP VECTNC < COUPE-T'ON LE BORD SUPERIEUR ??? JG OMB974 < NON, ALLONS VOIR LE BORD DROIT... LR A,X < X (ABSCISSE D'INTERSECTION), LA &ACOTEH < (A)=ORDONNEE D'UN POINT ALIGNE AVEC LE < SOLEIL ET LE POINT COURANT, JAL OMB977 < IL N'EXISTE PAS, LE POINT COURANT EST < DONC AU SOLEIL... SBR Y,A < FORMONS LA DISTANCE EN 'Y' ENTRE CES < 2 POINTS : SLIMIT:: VAL W < DISTANCE EN 'Y' DE 2 POINTS CONSIDERES < TOUS LES 2 AU SOLEIL, SI LE PREMIER < Y EST... CPI SLIMIT < ALORS ??? JLE OMB977 < ON CONSIDERE LE POINT AU SOLEIL... LAI K < (A)=DISTANCE COURANTE DU POINT COURANT < A LA LUMIERE : VA PERMETTRE LE < CALCUL DE LA PENOMBRE... OMB920: EQU $ ADRI I,A < AUGMENTATION DE LA DISTANCE (A NOTER < QU'ELLE EST STRICTEMENT POSITIVE...). CP NPENOM < ALORS, OMBRE OU PENOMBRE ??? JGE OMB975 < LE POINT COURANT EST "TROP LOIN" : ON LE < CONSIDERE A L'OMBRE... ADRI I,X < PROGRESSION SUR 'COTEH', XR A,X CP VECTNC < SORT-ON DU 'COTEH' ??? XR A,X JG OMB975 < OUI, LE POINT COURANT EST CONSIDERE DANS < L'OMBRE... CPZ &ACOTEH < NON, LE POINT (X) EST-IL AU SOLEIL ??? JL OMB900 < OUI, ON CONSIDERE DONC LE POINT COURANT < DANS LA PENOMBRE... JMP OMB920 < NON, ALLONS VOIR LE POINT PRECEDENT... OMB977: EQU $ < CAS DES POINTS AU SOLEIL : STY &ACOTEH < ON LE MEMORISE, JMP OMB976 < ET ON VA LUI ATTRIBUER SA PONDERATION... < < INTERSECTION DU RAYON LUMINEUX < COURANT AVEC LE BORD DROIT DE < L'IMAGE : < OMB974: EQU $ LA VECTNC < XMAX, SBR X,A < XMAX-X0, FLT < XMAX-X0, FDV FPENTM < ((Y0-YL)/(X0-XL))*(XMAX-X0), FIX < (ET NON PAS 'AROND' POUR TOUJOURS FAIRE < L'ERREUR DANS LE MEME SENS...) ADR Y,A < Y=Y0+((Y0-YL)/(X0-XL))*(XMAX-X0), JAGE OMB978 < OK... QUIT XXQUIT < E R R E U R P R O G R A M M E ... OMB978: EQU $ CP VECTNL < COUPE-T'ON LE BORD DROIT ??? JLE OMB979 < OUI, OK... QUIT XXQUIT < E R R E U R P R O G R A M M E ... OMB979: EQU $ LR A,X < Y (ORDONNEE D'INTERSECTION), LA &ACOTEV < (A)=ORDONNEE D'UN POINT ALIGNE AVEC LE < SOLEIL ET LE POINT COURANT, JAL OMB967 < IL N'EXISTE PAS, LE POINT COURANT EST < DONC AU SOLEIL... SBR Y,A < FORMONS LA DISTANCE EN 'Y' ENTRE CES < 2 POINTS : CPI SLIMIT < ALORS ??? JLE OMB967 < ON CONSIDERE LE POINT AU SOLEIL... LAI K < (A)=DISTANCE COURANTE DU POINT COURANT < A LA LUMIERE : VA PERMETTRE LE < CALCUL DE LA PENOMBRE... OMB921: EQU $ ADRI I,A < AUGMENTATION DE LA DISTANCE (A NOTER < QU'ELLE EST STRICTEMENT POSITIVE...). CP NPENOM < ALORS, OMBRE OU PENOMBRE ??? JGE OMB975 < LE POINT COURANT EST "TROP LOIN" : ON LE < CONSIDERE A L'OMBRE... ADRI I,X < PROGRESSION SUR 'COTEV', XR A,X CP VECTNL < SORT-ON DU 'COTEV' ??? XR A,X JG OMB975 < OUI, LE POINT COURANT EST CONSIDERE DANS < L'OMBRE... CPZ &ACOTEV < NON, LE POINT (X) EST-IL AU SOLEIL ??? JL OMB900 < OUI, ON CONSIDERE DONC LE POINT COURANT < DANS LA PENOMBRE... JMP OMB921 < NON, ALLONS VOIR LE POINT PRECEDENT... OMB967: EQU $ < CAS DES POINTS AU SOLEIL : STY &ACOTEV < ON LE MEMORISE... < < CAS DES POINTS AU SOLEIL : < OMB976: EQU $ < OUI : LE POINT EST DONC AU SOLEIL, #/FLD# FNIVLU < (A,B)=PONDERATION DE LA LUMIERE... JMP OMB969 < VERS LA MISE EN PLACE DE LA PONDERATION < DE L'ECLAIRAGE... < < CAS DES POINTS DANS LA < PENOMBRE (A NOTER QUE < CES POINTS NE SONT PAS < INSERES DANS LES LISTES < 'COTE') : < OMB900: EQU $ NGR A,A AD NPENOM < (A)="DISTANCE" DU POINT COURANT A UN < POINT QUI LUI SERAIT VRAIMENT A < L'OMBRE, FLT FMP FPENOM FAD TNIVOM < (A,B)=PONDERATION VARIABLE DE LA < PENOMBRE... JMP OMB969 < VERS LA MISE EN PLACE DE LA PONDERATION < DE L'ECLAIRAGE... < < CAS DES POINTS PRESUMES < A L'OMBRE : < OMB975: EQU $ #/FLD# FNIVOM < (A,B)=PONDERATION DE L'OMBRE... < < CALCUL DE L'ECLAIRAGE : < OMB969: EQU $ #/FST# FNIVEC < ET SAUVEGARDE DE LA PONDERATION < COURANTE OMBRE/LUMIERE... < < ET RETOUR : < PLR X < RESTAURATION DE LA COORDONNEE 'X'... OMB001: EQU $ RSR PAGE < < < O M B R E S P O R T E E S S U R L E P L A N ' Z + 1 ' : < < < FONCTION : < ON SUPPOSE QUE LES RAYONS < LUMINEUX SONT SITUES DANS LES < PLANS A 'Z+1' CONSTANT ; EN NOTANT < (X0,Y0) LES COORDONNEES DU POINT < COURANT DANS LE PLAN 'Z+1' COURANT, < ET (XL,YL) CELLES DE LA SOURCE < LUMINEUSE DANS CE MEME PLAN, LA < DROITE "RAYON LUMINEUX" A POUR < EQUATION : < < (X-X0)/(XL-X0)=(Y-Y0)/(YL-Y0), < < SOIT EN INVERSANT LES SIGNES : < < (X-X0)/(X0-XL)=(Y-Y0)/(Y0-YL). < < ON CHERCHE ENSUITE LES INTER- < SECTIONS DE CETTE DROITE AVEC LES < BORDS SUPERIEUR ET DROIT DE L'IMAGE, < SOIT AVEC LES DROITES D'EQUATIONS < < X=XMAX (BORD DROIT), < Y=YMAX (BORD SUPERIEUR), < < D'OU LES VALEURS DE 'X' ET 'Y' : < < X=X0+((X0-XL)/(Y0-YL))*(YMAX-Y0), < Y=Y0+((Y0-YL)/(X0-XL))*(XMAX-X0). < < SUPPOSANT LA SOURCE LUMINEUSE A < L'INFINI, LES RAYONS LUMINEUX < DEVIENNENT PARALLELES, ET LE < RAPPORT ((X0-XL)/(Y0-YL)) DE- < VIENT CONSTANT ; ON L'APPELLE < 'PENTM' (C'EST L'INVERSE DE LA PEN- < TE) ; CE TRUANDAGE PERMET DE SIM- < PLIFIER LE PROBLEME SUIVANT : < DEUX POINTS A(X,Y) ET B(X-1,Y-1) < PAR EXEMPLE PEUVENT AVOIR LA MEME < PROJECTION SUR 'KOTE', ET PAR LA < L'UN OMBRE L'AUTRE CE QUI EST FAUX... < ON A DONC : < < X=X0+(YMAX-Y0)*PENTM, < Y=Y0+(XMAX-X0)/PENTM. < < < ARGUMENT : < (X,Y,W)=POINT COURANT. < < < RESULTAT : < (A,B)=CONTRIBUTION LUMINEUSE DES OMBRES PORTEES. < < QMBRE: EQU $ < < INITIALISATION : < IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ IOMBRE < FAUT-IL LES OMBRES PORTEES ??? JE QMB001 < NON, ET 'FNIVEC' EST BON... PSR X < SAUVEGARDE DE LA COORDONNEE 'X'... < < INTERSECTION DU RAYON LUMINEUX < COURANT AVEC LE BORD SUPERIEUR < DE L'IMAGE (NE PAS OUBLIER LES < HYPOTHESES SUR LA POSITION DU < SOLEIL...) : < LA VECTNL < YMAX, SBR Y,A < YMAX-Y0, FLT < YMAX-Y0, FMP FPENTM < ((X0-XL)/(Y0-YL))*(YMAX-Y0), FIX < (ET NON PAS 'AROND' POUR TOUJOURS FAIRE < L'ERREUR DANS LE MEME SENS...) ADR X,A < X=X0+((X0-XL)/(Y0-YL))*(YMAX-Y0), JAGE QMB973 < OK... QUIT XXQUIT < E R R E U R P R O G R A M M E ... QMB973: EQU $ CP VECTNC < COUPE-T'ON LE BORD SUPERIEUR ??? JG QMB974 < NON, ALLONS VOIR LE BORD DROIT... LR A,X < X (ABSCISSE D'INTERSECTION), LA &AKOTEH < (A)=ORDONNEE D'UN POINT ALIGNE AVEC LE < SOLEIL ET LE POINT COURANT, JAL QMB977 < IL N'EXISTE PAS, LE POINT COURANT EST < DONC AU SOLEIL... SBR Y,A < FORMONS LA DISTANCE EN 'Y' ENTRE CES < 2 POINTS : CPI SLIMIT < ALORS ??? JLE QMB977 < LE POINT EST AU SOLEIL... LAI K < (A)=DISTANCE COURANTE DU POINT COURANT < A LA LUMIERE : VA PERMETTRE LE < CALCUL DE LA PENOMBRE... QMB920: EQU $ ADRI I,A < AUGMENTATION DE LA DISTANCE (A NOTER < QU'ELLE EST STRICTEMENT POSITIVE...). CP NPENOM < ALORS, OMBRE OU PENOMBRE ??? JGE QMB975 < LE POINT COURANT EST "TROP LOIN" : ON LE < CONSIDERE A L'OMBRE... ADRI I,X < PROGRESSION SUR 'COTEH', XR A,X CP VECTNC < SORT-ON DU 'COTEH' ??? XR A,X JG QMB975 < OUI, LE POINT COURANT EST CONSIDERE DANS < L'OMBRE... CPZ &ACOTEH < NON, LE POINT (X) EST-IL AU SOLEIL ??? JL QMB900 < OUI, ON CONSIDERE DONC LE POINT COURANT < DANS LA PENOMBRE... JMP QMB920 < NON, ALLONS VOIR LE POINT PRECEDENT... QMB977: EQU $ < CAS DES POINTS AU SOLEIL : STY &AKOTEH < ON LE MEMORISE, JMP QMB976 < ET ON VA LUI ATTRIBUER SA PONDERATION... < < INTERSECTION DU RAYON LUMINEUX < COURANT AVEC LE BORD DROIT DE < L'IMAGE : < QMB974: EQU $ LA VECTNC < XMAX, SBR X,A < XMAX-X0, FLT < XMAX-X0, FDV FPENTM < ((Y0-YL)/(X0-XL))*(XMAX-X0), FIX < (ET NON PAS 'AROND' POUR TOUJOURS FAIRE < L'ERREUR DANS LE MEME SENS...) ADR Y,A < Y=Y0+((Y0-YL)/(X0-XL))*(XMAX-X0), JAGE QMB978 < OK... QUIT XXQUIT < E R R E U R P R O G R A M M E ... QMB978: EQU $ CP VECTNL < COUPE-T'ON LE BORD DROIT ??? JLE QMB979 < OUI, OK... QUIT XXQUIT < E R R E U R P R O G R A M M E ... QMB979: EQU $ LR A,X < Y (ORDONNEE D'INTERSECTION), LA &AKOTEV < (A)=ORDONNEE D'UN POINT ALIGNE AVEC LE < SOLEIL ET LE POINT COURANT, JAL QMB967 < IL N'EXISTE PAS, LE POINT COURANT EST < DONC AU SOLEIL... SBR Y,A < FORMONS LA DISTANCE EN 'Y' ENTRE CES < 2 POINTS : CPI SLIMIT < ALORS ??? JLE QMB967 < LE POINT EST AU SOLEIL... LAI K < (A)=DISTANCE COURANTE DU POINT COURANT < A LA LUMIERE : VA PERMETTRE LE < CALCUL DE LA PENOMBRE... QMB921: EQU $ ADRI I,A < AUGMENTATION DE LA DISTANCE (A NOTER < QU'ELLE EST STRICTEMENT POSITIVE...). CP NPENOM < ALORS, OMBRE OU PENOMBRE ??? JGE QMB975 < LE POINT COURANT EST "TROP LOIN" : ON LE < CONSIDERE A L'OMBRE... ADRI I,X < PROGRESSION SUR 'COTEV', XR A,X CP VECTNL < SORT-ON DU 'COTEV' ??? XR A,X JG QMB975 < OUI, LE POINT COURANT EST CONSIDERE DANS < L'OMBRE... CPZ &ACOTEV < NON, LE POINT (X) EST-IL AU SOLEIL ??? JL QMB900 < OUI, ON CONSIDERE DONC LE POINT COURANT < DANS LA PENOMBRE... JMP QMB921 < NON, ALLONS VOIR LE POINT PRECEDENT... QMB967: EQU $ < CAS DES POINTS AU SOLEIL : STY &AKOTEV < ON LE MEMORISE... < < CAS DES POINTS AU SOLEIL : < QMB976: EQU $ < OUI : LE POINT EST DONC AU SOLEIL, #/FLD# FNIVLU < (A,B)=PONDERATION DE LA LUMIERE... JMP QMB969 < VERS LA MISE EN PLACE DE LA PONDERATION < DE L'ECLAIRAGE... < < CAS DES POINTS DANS LA < PENOMBRE (A NOTER QUE < CES POINTS NE SONT PAS < INSERES DANS LES LISTES < 'KOTE') : < QMB900: EQU $ NGR A,A AD NPENOM < (A)="DISTANCE" DU POINT COURANT AU FRONT < D'OMBRE FRANCHE... FLT FMP FPENOM FAD TNIVOM < (A,B)=PONDERATION DE LA PENOMBRE... JMP QMB969 < VERS LA MISE EN PLACE DE LA PONDERATION < DE L'ECLAIRAGE... < < CAS DES POINTS PRESUMES < A L'OMBRE : < QMB975: EQU $ #/FLD# FNIVOM < (A,B)=PONDERATION DE L'OMBRE... < < CALCUL DE L'ECLAIRAGE : < QMB969: EQU $ #/FST# FNIVEC < ET SAUVEGARDE DE LA PONDERATION < COURANTE OMBRE/LUMIERE... < < ET RETOUR : < PLR X < RESTAURATION DE LA COORDONNEE 'X'... QMB001: EQU $ RSR PAGE < < < R E C A L C U L D E L A N O R M A L E : < < < FONCTION : < POUR DES RAISONS LIEES A < L'ENCOMBREMENT MEMOIRE, LES < VECTEURS 'LIG' ET 'LJG' SONT < MEMORISES EN ENTIER ; CELA < PEUT AMENER PARFOIS A DES PRO- < BLEMES SUR LA NORMALE ; ON PEUT < TROUVER SES TROIS COMPOSANTES < NULLES. CE SOUS-PROGRAMME DETECTE < CE CAS, ET SI NECESSAIRE RECAL- < CULE LA NORMALE DIRECTEMENT EN < FLOTTANT... < < < NOTA : < LA SURFACE "FRACTALE" EST < DEFINIE A L'AIDE DE LA FONCTION < ALEATOIRE 'RDN(X,Y,Z)' CALCULEE < DANS LE MODULE 'FONCT' ; LES < POINTS DE LA SURFACE SONT DONC < LES POINTS (X,Y,Z) TELS QUE : < < RDN(X,Y,Z)=C, OU 'C' EST UNE CONSTANTE < DONNEE ('ICOUCH'). < < L'EQUATION DE LA SURFACE EN < IMPLICITE EST DONC : < < F(X,Y,Z)=RDN(X,Y,Z)-C=0, < < SA NORMALE EN CHAQUE POINT EST < DONC DEFINIE PAR LE VECTEUR DE < COORDONNEES : < < (DF/DX,DF/DY,DF/DZ). < < LES DERIVEES PARTIELLES VONT ETRE < APPROXIMEES PAR LES FORMULES SUI- < VANTES : < < DF/DX=(F(X,Y,Z)-F(X-P,Y,Z))/P, < DF/DY=(F(X,Y+P,Z)-F(X,Y,Z))/P, < DF/FZ=(F(X,Y,Z)-F(X,Y,Z-P))/P, < < CAR EN EFFET ON SUPPOSE UN ACCROIS- < SEMENT DE LA VARIABLE DE DERIVATION < EGAL A 'P'... < < SOIT, PAR DEFINITION DE 'F' : < < DF/DX=(RDN(X,Y,Z)-RDN(X-P,Y,Z))/P, < DF/DY=(RDN(X,Y+P,Z)-RDN(X,Y,Z))/P, < DF/DZ=(RDN(X,Y,Z)-RDN(X,Y,Z-P), < < ET, PAR CHANGEMENT D'ECHELLE (CE < QUI N'EST PAS GRAVE PUISQUE L'ON < "NORMALISERA" LA NORMALE) : < < DF/DX=RDN(X,Y,Z)-RDN(X-P,Y,Z), < DF/DY=RDN(X,Y+P,Z)-RDN(X,Y,Z), < DF/DZ=RDN(X,Y,Z)-RDN(X,Y,Z-P). < < < ARGUMENT : < (X,Y,W)=POINT COURANT. < < < ATTENTION : < CE MODULE DETRUIT (A,B) !!! < < PVALN: EQU $ < < TEST DE LA NECESSITE < DU RECALCUL DE LA NORMALE : < FCMZ FXN < LA NORMALE EST-ELLE NULLE ??? JNE PVALN1 < NON... FCMZ FYN < LA NORMALE EST-ELLE NULLE ??? JNE PVALN1 < NON... FCMZ FZN < LA NORMALE EST-ELLE NULLE ??? JNE PVALN1 < NON... < < LA NORMALE EST NULLE, ON < VA LA RECALCULER EN FLOTTANT : < BSR AFONCT < RDN(X,Y,Z), < NOTA : APRES CHAQUE APPEL DE 'AFONCT', < IL CONVIENDRAIT DE RETRANCHER 'TCOUCH' < A 'RDN(X,Y,Z)' POUR DONNER 'F(X,Y,Z)', < MAIS COMME CE SONT LES ACCROISSEMENTS < DE LA FONCTION 'F' QUE L'ON CALCULE, < CETTE SOUSTRACTION NE SERT A RIEN (ELLES < S'ANNULENT 2 A 2) ; EN CONSEQUENCES DE < QUOI, ON NOTERA PAR LA SUITE 'F(X,Y,Z)' < ALORS QU'IL S'AGIT EN FAIT DE 'RDN'... PSR A,B,W < SAVE F(X,Y,Z) ET LA COORDONNEE 'Z', PSR A,B,Y < SAVE F(X,Y,Z) ET LA COORDONNEE 'Y', PSR A,B,X < SAVE F(X,Y,Z) ET LA COORDONNEE 'X'. LA PASDER SBR A,X < X-P, BSR AFONCT < RDN(X-P,Y,Z), #/FST# FWORK PLR A,B,X < F(X,Y,Z) ET LA COORDONNEE 'X', FSB FWORK < F(X,Y,Z)-F(X-P,Y,Z), #/FST# FXN < CE QUI DONNE LA PREMIERE COMPOSANTE < DU VECTEUR NORMAL... LA PASDER ADR A,Y < Y+P, BSR AFONCT < RDN(X,Y+P,Z), #/FST# FWORK PLR A,B,Y < F(X,Y,Z) ET LA COORDONNEE 'Y', FSB FWORK < F(X,Y,Z)-F(X,Y+P,Z), FNEG < F(X,Y+P,Z)-F(X,Y,Z), #/FST# FYN < CE QUI DONNE LA DEUXIEME COMPOSANTE < DU VECTEUR NORMAL. LA PASDER SBR A,W < Z-P, BSR AFONCT < RDN(X,Y,Z-P), #/FST# FWORK PLR A,B,W < F(X,Y,Z) ET LA COORDONNEE 'W', FSB FWORK < F(X,Y,Z)-F(X,Y,Z-P), #/FST# FZN < CE QUI DONNE LA TROISIEME COMPOSANTE < DU VECTEUR NORMAL... < < ET REVALIDATION : < FCMZ FXN < LA NORMALE EST-ELLE NULLE ??? JNE PVALN2 < NON... FCMZ FYN < LA NORMALE EST-ELLE NULLE ??? JNE PVALN2 < NON... FCMZ FZN < LA NORMALE EST-ELLE NULLE ??? JNE PVALN2 < NON... QUIT XXQUIT < E R R E U R P R O G R A M M E ... PVALN2: EQU $ < < ET RETOUR : < PVALN1: EQU $ RSR PAGE < < < C A L C U L D E L ' I N T E N S I T E L U M I N E U S E < A U P O I N T C O U R A N T < D U P L A N C O U R A N T : < < < FONCTION : < CE SOUS-PROGRAMME, EN FONCTION < DES DIFFERENTS INDICATEURS DE < CONTROLE, CALCULE L'INTENSITE < LUMINEUSE AU POINT COURANT SUIVANT < LA SOURCE LUMINEUSE, LE CONTEXTE < (OMBRES PORTEES), ET LA NORMALE SUR < LE PLAN COURANT 'Z'... < < < ARGUMENTS : < (X,Y,W)=POINT COURANT (X,Y,Z). < < < RESULTAT : < (A,B)=INTENSITE LUMINEUSE FLOTTANTE NORMALISEE. < < PNIVO: EQU $ < < CALCUL DES OMBRE PORTEES : < BSR AOMBRE < CALCUL DES OMBRES PORTEES DANS LE < PLAN 'Z'... IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF #/FLD# FNIVMX < (A,B)=VALEUR MAXIMALE DE L'ECLAI- < RAGE AU CAS OU IL N'Y AURAIT PAS < DE "DEPTH-CUEING"... CPZ IECLDC < Y-A-T'IL DU "DEPTH-CUEING" AVEC L'ECLAI- < RAGE ??? JE PNI980 < NON... BSR APNIVC < OUI : < (A,B)=NIVEAU MAXIMAL D'ECLAIRAGE FONC- < DE LA COORDONNEE 'Z'. PNI980: EQU $ FMP FNIVEC < MODULATION PAR L'OMBRAGE EVENTUEL, #/FST# FNIVC < CE QUI DONNE LE NIVEAU MAXIMAL DE < L'ECLAIRAGE... < < CALCUL DE LA NORMALE EN (X,Y,Z) : < LA &ALIG < F(X,Y,Z). < < CALCUL DE LA NORMALE < AU POINT COURANT (X,Y,Z) : < < < NOTA : < LA SURFACE "FRACTALE" EST < DEFINIE A L'AIDE DE LA FONCTION < ALEATOIRE 'RDN(X,Y,Z)' CALCULEE < DANS LE MODULE 'FONCT' ; LES < POINTS DE LA SURFACE SONT DONC < LES POINTS (X,Y,Z) TELS QUE : < < RDN(X,Y,Z)=C, OU 'C' EST UNE CONSTANTE < DONNEE ('ICOUCH'). < < L'EQUATION DE LA SURFACE EN < IMPLICITE EST DONC : < < F(X,Y,Z)=RDN(X,Y,Z)-C=0, < < SA NORMALE EN CHAQUE POINT EST < DONC DEFINIE PAR LE VECTEUR DE < COORDONNEES : < < (DF/DX,DF/DY,DF/DZ). < < LES DERIVEES PARTIELLES VONT ETRE < APPROXIMEES PAR LES FORMULES SUI- < VANTES : < < DF/DX=(F(X,Y,Z)-F(X-P,Y,Z))/P, < DF/DY=(F(X,Y+P,Z)-F(X,Y,Z))/P, < DF/FZ=(F(X,Y,Z)-F(X,Y,Z-P))/P, < < CAR EN EFFET ON SUPPOSE UN ACCROIS- < SEMENT DE LA VARIABLE DE DERIVATION < EGAL A 'P'... < < SOIT, PAR DEFINITION DE 'F' : < < DF/DX=(RDN(X,Y,Z)-RDN(X-P,Y,Z))/P, < DF/DY=(RDN(X,Y+P,Z)-RDN(X,Y,Z))/P, < DF/DZ=(RDN(X,Y,Z)-RDN(X,Y,Z-P), < < ET, PAR CHANGEMENT D'ECHELLE (CE < QUI N'EST PAS GRAVE PUISQUE L'ON < "NORMALISERA" LA NORMALE) : < < DF/DX=RDN(X,Y,Z)-RDN(X-P,Y,Z), < DF/DY=RDN(X,Y+P,Z)-RDN(X,Y,Z), < DF/DZ=RDN(X,Y,Z)-RDN(X,Y,Z-P). < PSR X < SAUVEGARDE DE LA COORDONNEE 'X'... LB PASDER SBR B,X SB &ALIG < F(X,Y,Z)-F(X-P,Y,Z), PLR X < RESTAURATION DU 'X' COURANT... FLT #/FST# FXN < CE QUI DONNE LA PREMIERE COORDONNEE < DU VECTEUR NORMAL. LA &ALIGM < F(X,Y+P,Z), SB &ALIG < F(X,Y+P,Z)-F(X,Y,Z), FLT #/FST# FYN < CE QUI DONNE LA SECONDE COORDONNEE < DU VECTEUR NORMAL. PSR W < ET SAUVEGARDE DE LA COORDONNEE 'Z'... LB PASDER < PASSAGE AU PLAN PRECEDENT (Z-P), SBR B,W < Z-P, BSR AFONCT < RDN(X,Y,Z-P), FIX SB TCOUCH < F(X,Y,Z-P), PLR W < RESTAURATION DU 'Z' COURANT... SB &ALIG < F(X,Y,Z-P)-F(X,Y,Z), NGR A,A < F(X,Y,Z)-F(X,Y,Z-P), FLT #/FST# FZN < CE QUI DONNE LA TROISIEME COORDONNEE < DU VECTEUR NORMAL. BSR APVALN < ET TEST DE NON-NULLITE DE LA NORMALE... < < CALCUL DE L'ECLAIRAGE : < BSR AINTEN < CALCUL DE L'ECLAIRAGE AU POINT COURANT < EN FONCTION DE LA SOURCE LUMINEUSE... JMP PNI981 < ET VERS LE CALCUL DU NIVEAU ET LE < TRACE... < < CAS DU "DEPTH-CUEING" : < PNI702: EQU $ BSR APNIVC < (A,B)=NIVEAU A DONNER A TOUS LES POINTS < DE CE PLAN. < < CALCUL DU NIVEAU DE TRACE : < PNI981: EQU $ BSR AROND < (A)=NIVEAU FONCTION DU NIVEAU DE LA < COUCHE COURANTE... IF EXIST-K,XEIF%,,XEIF% IF ATTENTION : LE TEST QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF CPZ TRONIV < DOIT-ON TRONQUER BRUTALEMENT ??? JNE PNI400 < OUI... < < CAS DE LA FONCTION < EN DENTS DE SCIE : < PNI401: EQU $ JAGE PNI402 NGR A,A < ABS(NIVEAU), PNI402: EQU $ CP F255 JLE PNI400 < ON DOIT ETRE DANS (0,255)... SB F511 < SINON, ON S'Y RAMENE... JMP PNI401 < ET ON ATTEND DE S'ETRE STABILISER... < < TRONCAGE : < PNI400: EQU $ CP MINNIV < ET VALIDATION : JL PNI314 < TROP PETIT : ON TRONQUE INFERIEUREMENT... CP MAXNIV < ET VALIDATION : JG PNI315 < TROP GRAND : ON TRONQUE SUPERIEUREMENT... PNI311: EQU $ JMP PNI312 < VERS LE MARQUAGE DE (X,Y) AVEC (A). PNI314: EQU $ LA MINNIV < (A)=NIVEAU PLANCHER, JMP PNI311 < VERS SON MARQUAGE... PNI315: EQU $ LA MAXNIV < (A)=NIVEAU PLAFOND, JMP PNI311 < VERS SON MARQUAGE... < < ET RETOUR : < PNI312: EQU $ FLT < (A,B)=VALEUR FLOTTANTE DU NIVEAU... RSR PAGE < < < C A L C U L D E L ' I N T E N S I T E L U M I N E U S E < A U P O I N T C O U R A N T < D U P L A N S U I V A N T : < < < FONCTION : < CE SOUS-PROGRAMME, EN FONCTION < DES DIFFERENTS INDICATEURS DE < CONTROLE, CALCULE L'INTENSITE < LUMINEUSE AU POINT COURANT SUIVANT < LA SOURCE LUMINEUSE, LE CONTEXTE < (OMBRES PORTEES), ET LA NORMALE SUR < LE PLAN SUIVANT 'Z+1'... < < < ARGUMENTS : < (X,Y,W)=POINT COURANT (X,Y,Z). < < < RESULTAT : < (A,B)=INTENSITE LUMINEUSE FLOTTANTE NORMALISEE. < < PNJVO: EQU $ < < PASSAGE AU PLAN SUIVANT : < ADRI I,W < PASSAGE SUR Z+1... < < CALCUL DES OMBRES PORTEES : < BSR AQMBRE < CALCUL DES OMBRES PORTEES DANS LE < PLAN 'Z+1'... IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF #/FLD# FNIVMX < (A,B)=VALEUR MAXIMALE DE L'ECLAI- < RAGE AU CAS OU IL N'Y AURAIT PAS < DE "DEPTH-CUEING"... CPZ IECLDC < Y-A-T'IL DU "DEPTH-CUEING" AVEC L'ECLAI- < RAGE ??? JE PNJ980 < NON... BSR APNIVC < OUI : < (A,B)=NIVEAU MAXIMAL D'ECLAIRAGE FONC- < DE LA COORDONNEE 'Z'. PNJ980: EQU $ FMP FNIVEC < MODULATION PAR L'OMBRAGE EVENTUEL, #/FST# FNIVC < CE QUI DONNE LE NIVEAU MAXIMAL DE < L'ECLAIRAGE... < < CALCUL DE LA NORMALE EN (X,Y,Z) : < LA &ALJG < F(X,Y,Z). < < CALCUL DE LA NORMALE < AU POINT COURANT (X,Y,Z) : < < < NOTA : < LA SURFACE "FRACTALE" EST < DEFINIE A L'AIDE DE LA FONCTION < ALEATOIRE 'RDN(X,Y,Z)' CALCULEE < DANS LE MODULE 'FONCT' ; LES < POINTS DE LA SURFACE SONT DONC < LES POINTS (X,Y,Z) TELS QUE : < < RDN(X,Y,Z)=C, OU 'C' EST UNE CONSTANTE < DONNEE ('ICOUCH'). < < L'EQUATION DE LA SURFACE EN < IMPLICITE EST DONC : < < F(X,Y,Z)=RDN(X,Y,Z)-C=0, < < SA NORMALE EN CHAQUE POINT EST < DONC DEFINIE PAR LE VECTEUR DE < COORDONNEES : < < (DF/DX,DF/DY,DF/DZ). < < LES DERIVEES PARTIELLES VONT ETRE < APPROXIMEES PAR LES FORMULES SUI- < VANTES : < < DF/DX=(F(X,Y,Z)-F(X-P,Y,Z))/P, < DF/DY=(F(X,Y+P,Z)-F(X,Y,Z))/P, < DF/FZ=(F(X,Y,Z)-F(X,Y,Z-P))/P, < < CAR EN EFFET ON SUPPOSE UN ACCROIS- < SEMENT DE LA VARIABLE DE DERIVATION < EGAL A 'P'... < < SOIT, PAR DEFINITION DE 'F' : < < DF/DX=(RDN(X,Y,Z)-RDN(X-P,Y,Z))/P, < DF/DY=(RDN(X,Y+P,Z)-RDN(X,Y,Z))/P, < DF/DZ=(RDN(X,Y,Z)-RDN(X,Y,Z-P), < < ET, PAR CHANGEMENT D'ECHELLE (CE < QUI N'EST PAS GRAVE PUISQUE L'ON < "NORMALISERA" LA NORMALE) : < < DF/DX=RDN(X,Y,Z)-RDN(X-P,Y,Z), < DF/DY=RDN(X,Y+P,Z)-RDN(X,Y,Z), < DF/DZ=RDN(X,Y,Z)-RDN(X,Y,Z-P). < PSR X < SAUVEGARDE DE LA COORDONNEE 'X'... LB PASDER SBR B,X SB &ALJG < F(X,Y,Z+1)-F(X-P,Y,Z+1), PLR X < RESTAURATION DU 'X' COURANT... FLT #/FST# FXN < CE QUI DONNE LA PREMIERE COORDONNEE < DU VECTEUR NORMAL. LA &ALJGM < F(X,Y+P,Z+1), SB &ALJG < F(X,Y+P,Z+1)-F(X,Y,Z+1), FLT #/FST# FYN < CE QUI DONNE LA SECONDE COORDONNEE < DU VECTEUR NORMAL. PSR W < ET SAUVEGARDE DE LA COORDONNEE 'Z+1'... LB PASDER < PASSAGE AU PLAN PRECEDENT (Z+1-P), SBR B,W < Z+1-P, BSR AFONCT < RDN(X,Y,Z+1-P), FIX SB TCOUCH < F(X,Y,Z+1-P), PLR W < RESTAURATION DU 'Z+1' COURANT... SB &ALJG < F(X,Y,Z+1-P)-F(X,Y,Z+1), NGR A,A < F(X,Y,Z+1)-F(X,Y,Z+1-P), FLT #/FST# FZN < CE QUI DONNE LA TROISIEME COORDONNEE < DU VECTEUR NORMAL. BSR APVALN < ET TEST DE NON-NULLITE DE LA NORMALE... < < CALCUL DE L'ECLAIRAGE : < BSR AINTEN < CALCUL DE L'ECLAIRAGE AU POINT COURANT < EN FONCTION DE LA SOURCE LUMINEUSE... JMP PNJ981 < ET VERS LE CALCUL DU NIVEAU ET LE < TRACE... < < CAS DU "DEPTH-CUEING" : < PNJ702: EQU $ BSR APNIVC < (A,B)=NIVEAU A DONNER A TOUS LES POINTS < DE CE PLAN. < < CALCUL DU NIVEAU DE TRACE : < PNJ981: EQU $ BSR AROND < (A)=NIVEAU FONCTION DU NIVEAU DE LA < COUCHE COURANTE... IF EXIST-K,XEIF%,,XEIF% IF ATTENTION : LE TEST QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF CPZ TRONIV < DOIT-ON TRONQUER BRUTALEMENT ??? JNE PNJ400 < OUI... < < CAS DE LA FONCTION < EN DENTS DE SCIE : < PNJ401: EQU $ JAGE PNJ402 NGR A,A < ABS(NIVEAU), PNJ402: EQU $ CP F255 JLE PNJ400 < ON DOIT ETRE DANS (0,255)... SB F511 < SINON, ON S'Y RAMENE... JMP PNJ401 < ET ON ATTEND DE S'ETRE STABILISER... < < TRONCAGE : < PNJ400: EQU $ CP MINNIV < ET VALIDATION : JL PNJ314 < TROP PETIT : ON TRONQUE INFERIEUREMENT... CP MAXNIV < ET VALIDATION : JG PNJ315 < TROP GRAND : ON TRONQUE SUPERIEUREMENT... PNJ311: EQU $ JMP PNJ312 < VERS LE MARQUAGE DE (X,Y) AVEC (A). PNJ314: EQU $ LA MINNIV < (A)=NIVEAU PLANCHER, JMP PNJ311 < VERS SON MARQUAGE... PNJ315: EQU $ LA MAXNIV < (A)=NIVEAU PLAFOND, JMP PNJ311 < VERS SON MARQUAGE... < < ET RETOUR : < PNJ312: EQU $ ADRI -I,W < RETOUR AU PLAN COURANT 'Z'... FLT < (A,B)=VALEUR FLOTTANTE DU NIVEAU... RSR PAGE < < < C A L C U L D U N I V E A U D A N S ( 0 , 2 5 5 ) : < < < ARGUMENT : < (A,B)=NIVEAU LUMINEUX FLOTTANT, < (X)=ABSCISSE DU POINT COURANT. < < < RESULTAT : < (A)=(LISTN(X))=NIVEAU LUMINEUX ENTIER. < < PLIST: EQU $ < < CONVERSION ENTIERE : < BSR AROND < (A)=NIVEAU FONCTION DU NIVEAU DE LA < COUCHE COURANTE... IF EXIST-K,XEIF%,,XEIF% IF ATTENTION : LE TEST QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF CPZ TRONIV < DOIT-ON TRONQUER BRUTALEMENT ??? JNE PLI400 < OUI... < < CAS DE LA FONCTION < EN DENTS DE SCIE : < PLI401: EQU $ JAGE PLI402 NGR A,A < ABS(NIVEAU), PLI402: EQU $ CP F255 JLE PLI400 < ON DOIT ETRE DANS (0,255)... SB F511 < SINON, ON S'Y RAMENE... JMP PLI401 < ET ON ATTEND DE S'ETRE STABILISER... < < TRONCAGE : < PLI400: EQU $ CP MINNIV < ET VALIDATION : JL PLI314 < TROP PETIT : ON TRONQUE INFERIEUREMENT... CP MAXNIV < ET VALIDATION : JG PLI315 < TROP GRAND : ON TRONQUE SUPERIEUREMENT... PLI311: EQU $ JMP PLI312 < VERS LE MARQUAGE DE (X,Y) AVEC (A). PLI314: EQU $ LA MINNIV < (A)=NIVEAU PLANCHER, JMP PLI311 < VERS SON MARQUAGE... PLI315: EQU $ LA MAXNIV < (A)=NIVEAU PLAFOND, JMP PLI311 < VERS SON MARQUAGE... < < MEMORISATION DE NIVEAU(X,Y,Z) : < PLI312: EQU $ STBY &ALISTN < MEMORISATION DE (A)=NIVEAU(X,Y,Z)... < < ET RETOUR : < RSR PAGE < < < T E S T P E R I O D I Q U E D E ' C O M F L O ' : < < < FONCTION : < CE SOUS-PROGRAMME EST < APPELE DERRIERE CHAQUE < 'FDV' EXPLICITE AINSI < QU'APRES LES APPELS DE < 'RAC' ET 'CRAMR'... < < TSFLO: EQU $ PSR A LA COMFLO < TEST DE 'COMFLO' PAR UN 'LA' AFIN DE NE < PAS MODIFIER LES CODES (CARY & CO)... JAE TSFLO1 < OK... QUIT XXQUIT < E R R E U R P R O G R A M M E ... < ON A : < (A)=INDICATEURS FLOTTANTS... < BIT 0 : UNDERFLOW, < BIT 1 : OVERFLOW, < BIT 2 : DIVISION PAR ZERO, < BIT 3 : 'FIX' IMPOSSIBLE. STZ COMFLO < PUIS RAZ, CAR CES INDICATEURS SONT < REMANENTS... TSFLO1: EQU $ PLR A RSR XXXPRO: VAL YYYGOT < 'YYYGOT'. CALL #SIP UTILITAIRES# XXXPRO: VAL YYYFLO < 'YYYFLO'. CALL #SIP UTILITAIRES# PAGE < < < P R O D U I T S C A L A I R E D E 2 V E C T E U R S : < < < ARGUMENTS : < (A)=ADRESSE DU PREMIER VECTEUR 'VECT1', < (B)=ADRESSE DU DEUXIEME VECTEUR 'VECT2'. < < < RESULTAT : < (A,B)=VALEUR DU PRODUIT SCALAIRE... < < < ATTENTION : < AUX BASES 'L' ET 'W' !!! < < PRSCA: EQU $ VECT1X:: MOT O < X(VECT1), VECT1Y:: MOT VECT1X+DFLOT < Y(VECT1), VECT1Z:: MOT VECT1Y+DFLOT < Z(VECT1). VECT2X:: MOT O < X(VECT2), VECT2Y:: MOT VECT2X+DFLOT < Y(VECT2), VECT2Z:: MOT VECT2Y+DFLOT < Z(VECT2). < < INITIALISATIONS : < PSR L,W < SAUVEGARDE DE 2 BASES ; MAIS 'C' NE DOIT < PAS ETRE UTILISEE A CAUSE DU BLOC FLOT- < TANT... LR A,L < (L)=BASE DU VECTEUR 'VECT1', LR B,W < (W)=BASE DU VECTEUR 'VECT2'. < < CALCUL DU PRODUIT SCALAIRE : < #/FLD# VECT1X,L < X(1), FMP VECT2X,W < X(1)*X(2), #/FST# FWORK < ET SAVE... #/FLD# VECT1Y,L < Y(1), FMP VECT2Y,W < Y(1)*Y(2), FAD FWORK < X(1)*X(2)+Y(1)*Y(2), #/FST# FWORK < ET SAVE... #/FLD# VECT1Z,L < Z(1), FMP VECT2Z,W < Z(1)*Z(2), FAD FWORK < (A,B)=X(1)*X(2)+Y(1)*Y(2)+Z(1)*Z(2), < SOIT LE PRODUIT SCALAIRE DES 2 < VECTEURS 'VECT1' ET 'VECT2'... < < ET RETOUR : < PLR L,W RSR PAGE < < < G E N E R A T E U R R E D O N N A N T T O U J O U R S < L E M E M E V E C T E U R A L E A T O I R E E N < U N P O I N T D O N N E : < < < ARGUMENT : < (X,Y,W)=COORDONNEES DU POINT COURANT. < < < RESULTAT : < (A,B)=RDN(XS,YS,ZS,KITER,GRAINE). < < SPRDN: EQU $ < < GENERATION ALEATOIRE : < LR X,A < (A)=COORDONNEE 'X', MP KITER < ON UTILISE 'KITER' AFIN DE FAIRE < VARIER LA GENERATION ALEATOIRE A (X,Y) < CONSTANT SUIVANT LE NIVEAU DE RECUR- < SIVITE... EORR B,A < ET ON SE RAMENE SUR UN MOT... STA FWORK4 < SAVE F1(XS)... LR Y,A < (A)=COORDONNEE 'Y', EOR RDN1 < ??!???! STA FWORK5 < SAVE F2(YS)... MP FWORK4 < ET ON CONSTRUIT XR A,B < UNE FONCTION UNIQUE AD FWORK5 < DU NOEUD COURANT, SB FWORK4 < TELLE QUE : < F(X,Y)#F(Y,X), < F(X,Y)=X*Y+Y-X. EORR B,A EORR W,A < ET ON RAJOUTE LA TROISIEME COORDONNEE... MP GRAINE < D'OU F(GRAINE,KITER,X,Y,Z), TELLE QUE : < F(X,Y)#F(Y,X) AFIN D'EVITER UNE SYMETRIE < PAR RAPPORT A UNE DIAGONALE... EORR B,A MP AMAGIK < DONT ON FAIT UN "SHUFFLING"... EORR B,A < ON CUMULE LES 2 MOTS, < < MISE A L'ECHELLE : < < < NOTA : < ON DOIT POUR METTRE LA < VALEUR 'RDN' A L'ECHELLE < CALCULER L'EXPRESSION : < < (SUP/(-32768))*(-RDN/2+16384+(RDN/2-16384)*(INF/SUP)), < < QUI SE SIMPLIFIE EN : < < (SUP/65536)*(RDN*(1-(INF/SUP))+32768*(1+(INF/SUP))). < FLT < ON FLOTTE 'RDN', FMP UNMIS < RDN*(1-(INF/SUP)), FAD UNPIS < RDN*(1-(INF/SUP))+32768*(1+(INF/SUP)), FMP SUP64 < (SUP/65536)*(...). < < ET SORTIE : < RSR PAGE < < < S O M M A T I O N S U R U N E S P I R A L E < C E N T R E E S U R ( X S , Y S ) D E S < N I V E A U X D E S E S P O I N T S : < < < ARGUMENT : < (X,Y)=COORDONNEES DANS L'ESPACE (256,256). < < < RESULTAT : < (A,B)=CUMUL CENTRE SUR LE POINT ARGUMENT (X,Y). < < SPIRAL: EQU $ < < INITIALISATION DE LA SPIRALE : < PSR X,Y,W < SAUVEGARDE DU POINT (X,Y). STZ CUMUL < CUMUL <-- 0. STZ NP < NP=NOMBRE DE POINTS TRAITES. LA PASQ STA DELTAX < DELTAX <-- +1, STZ DELTAY < DELTAY <-- 0. LAI W STA LB0 < INITIALISATION DE LA LONGUEUR DU < PREMIER BRAS DE LA SPIRALE. < < PARCOURS D'UN BRAS : < SPIRL1: EQU $ LA LB0 STA LB < LONGUEUR DU BRAS COURANT. < < TRAITEMENT DU POINT COURANT : < SPIRL2: EQU $ IC NP < COMPTAGE DES POINTS TRAITES : LA NP CP NPM < FINI ??? JG SPIRL3 < OUI... LR X,A < NON, TEST DE LA COORDONNEE 'X' : JAL SPIRL4 < LE POINT EST HORS-ECRAN... CPI NPOLM1 JG SPIRL4 < HORS-ECRAN... LR Y,A < TEST DE LA COORDONNEE 'Y' : JAL SPIRL4 < HORS-ECRAN... CPI NLIGM1 JG SPIRL4 < HORS-ECRAN... < < ACCES AU NIVEAU DU POINT (X,Y) : < PSR X,Y < SAUVEGARDE DU POINT COURANT... < < TENTATIVE D'ACCELERATION : < SWBR Y,B ORR X,B < (B)=(Y,X), STB SAVYX < ET SAUVEGARDE... RBT NBITMO < SUPRESSION DU BIT DE SIGNE DE 'B' AFIN < QUE LE RESTE SOIT POSITIF OU NUL, LRM W WORD ASHT < (W)=ADRESSE DE LA TABLE D'ACCELERATION. LAI K DV LASHT < (B)=COUPLE (Y,X) MODULO 'ASHPR', ADR B,W < CE QUI DONNE DANS 'W' L'ADRESSE D'UNE < ENTREE : LA ASHT1,W CP SAVYX < L'ENTREE COURANTE CONTIENT-ELLE (Y,X) ??? JNE SPIRL6 < NON, IL FAUT ACCEDER REELLEMENT A 'TV1'/ < 'TV2'... LA ASHT2,W < OUI, MAIS EOR XCTCDA < ON VA ANSI REGARDER SIMULTANEMENT SI < L'ENTREE EST OCCUPEE, ET SI OUI, S'IL < Y A COINCIDENCE AVEC 'TV1'/'TV2'... JAL SPIRL6 < ET BIEN NON, CE N'EST PAS (X,Y)... CPI NIVMX7 < ALORS ??? JLE SPIRL7 < ON A TROUVE (X,Y), ET 'TV1'/'TV2' EST < LE MEME, ALORS : < (A)=NIVEAU(X,Y)... < < ACCES REEL AU POINT (X,Y) : < SPIRL6: EQU $ LR X,A LBI K XWOR%1: VAL NBITMO=K SCLD NBITMO-XWOR%1 < (B)=NUMERO DU MOT DANS LA LIGNE, SLRS NBITMO-XWOR%1 LXI NBITMO-BIT SBR A,X < (X)=DECALAGE D'ACCES AUX BITS, PSR X XR Y,B SLLD NMOTL=K+NBITMO ORR Y,A < (A)=NUMERO DU MOT DANS LA TRAME. AD XCTCDA < POUR PERMETTRE UN ACCES A TV1/TV2... LRM B,X,Y WORD MCDAR WORD D*W WORD LIMAG < (Y)=POUR PASSER D'UNE COULEUR A L'AUTRE. RCDA < ACCES AU MOT ROUGE, LRM B,X WORD MCDAV WORD D*W ADR Y,A RCDA < ACCES AU MOT VERT, LRM B,X WORD MCDAB WORD D*W ADR Y,A RCDA < ACCES AU MOT BLEU. PLR X < RESTAURATION DU DECALAGE, LA MCDAR SLRS L,X SLRD BIT < RECUPERATION D'UN BIT ROUGE, LA MCDAV SLRS L,X SLRD BIT < RECUPERATION D'UN BIT VERT, LA MCDAB SLRS L,X ANDI BIT < RECUPERATION D'UN BIT BLEU, SLLD NCOOL-BIT < (A)=NIVEAU DE GRIS DU POINT. < < MEMORISATION DE (X,Y) : < OR XCTCDA < (A)='TV1'/'TV2',NIVEAU(X,Y) : IF TV1?TV2(NIVMX7,,XEIF%, IF ATTENTION : LA CONCATENATION 'TV1'/'TV2' ET NIVEAU IF EST IMPOSSIBLE !!! XEIF%: VAL ENDIF STA ASHT2,W < MEMORISATION DE LA TRANSLATION ET DU < NIVEAU, ANDI NIVMX7 < ET RESTAURATION DU NIVEAU(X,Y)... LB SAVYX STB ASHT1,W < ET MEMORISATION DE (X,Y)... < < RESTAURATION DU POINT < COURANT ET CUMUL : < SPIRL7: EQU $ PLR X,Y AD CUMUL < ET STA CUMUL < CUMULE... < < PARCOURS DE LA SPIRALE : < SPIRL4: EQU $ LA DELTAX < CHANGEMENT DE ADR A,X LA DELTAY < POINT COURANT (X,Y). ADR A,Y DC LB < DECOMPTAGE DES POINTS SUR LA BRANCHE : JG SPIRL2 < OK, IL EN RESTE... CPZ DELTAX < NON, ON EST AU BOUT, FAUT-IL AUGMENTER < LA LONGUEUR COURANTE DES BRANCHES ??? JNE SPIRL5 < NON (DX#0) ... IC LB0 < OUI (DX=0) ... SPIRL5: EQU $ LA DELTAY < ON FAIT SUBIR AU NOMBRE COMPLEXE NGR A,A < (DX,DY) UNE ROTATION DE PI/2, SOIT LB DELTAX < UNE MULTIPLICATION PAR LA MATRICE < (0,-1,1,0)... STA DELTAX < DELTAX=-DELTAY, STB DELTAY < DELTAY=DELTAX. JMP SPIRL1 < VERS LA BRANCHE SUIVANTE < < GENERATION DU POINT (X,Y) : < SPIRL3: EQU $ PLR X,Y,W < RESTAURATION DU POINT COURANT (X,Y). < < NORMALISATION DU CUMUL : < LA CUMUL FLT FDV FNPM RSR PAGE < < < C A L C U L D E L A S O M M E P O N D E R E E < D E S F O N C T I O N S A L E A O I R E S : < < < ARGUMENT : < (X,Y,W)=COORDONNEES DU POINT COURANT. < < < RESULTAT : < (A,B)=((MOYENE)+(AMPLI)*F(XS,YS,ZS))*(CONTRIBUTION ALEATOIR < (F(SIGMA(NIVEAU(X,Y)))*(CONTRIBUTION DES SPIRALES). < < FONCT: EQU $ PSR X,Y,W < SAUVEGARDES... < < FLOTTAGE DU POINT COURANT : < LR X,A < COORDONNEE 'X' : AD TRDNX < TRANSLATION EN 'X' DU GENERATEUR, STA XS FLT #/FST# GXS < COORDONNEE 'XS' DU POINT COURANT. LR Y,A < COORDONNEE 'Y' : AD TRDNY < TRANSLATION EN 'Y' DU GENERATEUR, STA YS FLT #/FST# GYS < COORDONNEE 'YS' DU POINT COURANT. LR W,A < COORDONNEE 'Z' : AD TRDNZ < TRANSLATION EN 'Z' DU GENERATEUR, STA ZS FLT #/FST# GZS < COORDONNEE 'ZS' DU POINT COURANT. < < DISCRIMINATION DES < CONTRIBUTIONS ALEATOIRES < ET DES SPIRALES : < #/FLD# PONRDN < (A,B)=PONDERATION ALEATOIRE : FCAZ < EXISTE-T'ELLE ??? JNE FONCT1 < OUI, ALLONS LA CALCULER... BSR AGOTO WORD FONCT6 < NON, ALLONS VERS LA CONTRIBUTION DES < SPIRALES, EN NOTANT QUE L'ON A : < (A,B)=0... < < < C O N T R I B U T I O N A L E A T O I R E : < < FONCT1: EQU $ < < < G E N E R A T I O N D ' U N E S O M M A T I O N < R E C U R S I V E D E F O N C T I O N S < A L E A T O I R E S " D E C R O I S S A N T E S " : < < #/FLD# F0 #/FST# FCUMR < INITIALISATION DU CUMUL DES FONCTIONS < ALEATOIRES SCALANTES... < < ITERATION POUR CHAQUE < FONCTION ALEATOIRE : < STZ KITER < INITIALISATION DES RECURSIONS... LXI K < (X)=INDEX DES RECURSIONS... FONCT5: EQU $ IC KITER < COMPTAGE DES RECURSIONS... < < INITIALISATION DU MAILLAGE : < LA &ALPSIX STA PASIX < 'PASIX' ENTIER, LA &ALPSIY STA PASIY < 'PASIY' ENTIER, LA &ALPSIZ STA PASIZ < 'PASIZ' ENTIER. PSR X ADR X,X < PASSAGE A UN INDEX FLOTTANT... FLD &ALPASX #/FST# FPASIX < 'PASIX' FLOTTANT, FLD &ALPASY #/FST# FPASIY < 'PASIY' FLOTTANT. FLD &ALPASZ #/FST# FPASIZ < 'PASIZ' FLOTTANT. FLD &ALPOND #/FST# FPOND < 'FPOND'. < < RECHERCHE DU NOEUD < VOISIN PAR "DEFAUT" : < LA XS SARD NBITMO DV PASIX MP PASIX LR B,X < X(NOEUD BAS-GAUCHE) DE LA MAILLE < COURANTE, LA YS SARD NBITMO DV PASIY MP PASIY LR B,Y < Y(NOEUD BAS-GAUCHE) DE LA MAILLE < COURANTE. LA ZS SARD NBITMO DV PASIZ MP PASIZ LR B,W < Z(NOEUD BAS-GAUCHE) DE LA MAILLE < COURANTE. LA XS CPR A,X < EST-ON EN UN NOEUD ??? JNE FONCT3 < NON... LA YS < PEUT-ETRE : CPR A,Y < EST-ON EN UN NOEUD ??? JNE FONCT3 < NON, INTERPOLONS... LA ZS < PEUT-ETRE : CPR A,W < EST-ON EN UN NOEUD ??? JNE FONCT3 < NON, INTERPOLONS... < < CAS OU LE POINT (XS,YS,ZS) < COURANT EST UN NOEUD : < BSR ASPRDN < LE POINT COURANT EST UN NOEUD... BSR AGOTO WORD FONCT4 < VERS L'ACCES A LA VALEUR DU NOEUD... < < CAS OU LE POINT (XS,YS,ZS) < COURANT N'EST PAS UN NOEUD : < FONCT3: EQU $ NGR X,A < ABSCISSE DU NOEUD "BAS-GAUCHE"... FLT FAD GXS < X-XNOEUD, FDV FPASIX < (X-XNOEUD)/PASIX, #/FST# HINCU < DISTANCE NORMALISEE A 1 LE LONG DE OX, < DU POINT COURANT AU NOEUD DE LA MAILLE. NGR Y,A < ORDONNEE DU NOEUD "BAS-GAUCHE"... FLT FAD GYS < Y-YNOEUD, FDV FPASIY < (Y-YNOEUD)/PASIY, #/FST# HINCV < DISTANCE NORMALISEE A 1 LE LONG DE OY, < DU POINT COURANT AU NOEUD DE LA MAILLE. NGR W,A < Z-COORDONNEE DU NOEUD "BAS-GAUCHE"... FLT FAD GZS < Z-ZNOEUD, FDV FPASIZ < (Z-ZNOEUD)/PASIZ, #/FST# HINCW < DISTANCE NORMALISEE A 1 LE LONG DE OZ, < DU POINT COURANT AU NOEUD DE LA MAILLE. < NOTA : PAR LA SUITE, 'XN', 'YN' ET 'ZN' < DESIGNERONT LES 3 COORDONNEES DU < NOEUD DE LA MAILLE COURANTE. BSR ASPRDN #/FST# AFNIV1 < NIVEAU(XN,YN,ZN), LA PASIX ADR A,X BSR ASPRDN #/FST# AFNIV2 < NIVEAU(XN+PASIX,YN,ZN), LA PASIY ADR A,Y BSR ASPRDN #/FST# AFNIV3 < NIVEAU(XN+PASIX,YN+PASIY,ZN), LA PASIX SBR A,X BSR ASPRDN #/FST# AFNIV4 < NIVEAU(XN,YN+PASIY,ZN), LA PASIZ ADR A,W BSR ASPRDN #/FST# AFNIV5 < NIVEAU(XN,YN+PASIY,ZN+PASIZ), LA PASIX ADR A,X BSR ASPRDN #/FST# AFNIV6 < NIVEAU(XN+PASIX,YN+PASIY,ZN+PASIZ), LA PASIY SBR A,Y BSR ASPRDN #/FST# AFNIV7 < NIVEAU(XN+PASIX,YN,ZN+PASIZ), LA PASIX SBR A,X BSR ASPRDN #/FST# AFNIV8 < NIVEAU(XN,YN,ZN+PASIZ). < < INTERPOLATION ENTRE LES < HUIT SOMMETS D'UN CUBE < PORTANT LES VALEURS (NIV1, < NIV2,NIV3,NIV4,NIV5,NIV6, < NIV7,NIV8), LES COOR- < DONNEES DU POINT DANS LE < CUBE ETANT (HINCU,HINCV,HINCW) : < < < NOTA : < ON DOIT INTERPOLER ENTRE LES < HUIT NIVEAUX (NIV1,...,NIV8) < PORTES PAR LES HUIT SOMMETS D'UN < CUBE : < < < (1-U,V,1-W) ----------------- (U,V,1-W) < /I /I < / I / I < / I / I < / I / I < / I / I < / I / I < / I / I < (1-U,V,W) ------------------- (U,V,W) I < I I I I < I I I I < I I I I < I I I I < I (1-U,1-V,1-W) ----------- I - (U,1-V,1-W) < I / I / < I / I / < I / I / < I / I / < I / I / < I / I / < I/ I/ < (1-U,1-V,W) ----------------- (U,1-V,W) < < < NIV 4 --------------------- NIV 3 < /I /I < / I / I < / I / I < / I / I < / I / I < / I / I < / I / I < NIV 5 --------------------- NIV 6 I < I I I I < I I I I < I I I I < I I I I < I NIV 1 --------------- I --- NIV 2 < I / I / < I / I / < I / I / < I / I / < I / I / < I / I / < I/ I/ < NIV 8 --------------------- NIV 7 < < < CE QUI DONNE LA FORMULE < D'INTERPOLATION POUR LE POINT < INTERIEUR AU CUBE ET DE COOR- < DONNEES (U,V,W) RELATIVES AU < SOMMET '1' : < < NIVEAU(U,V,W) = (1-U)*(1-V)*(1-W)*NIV1 < +U*(1-V)*(1-W)*NIV2 < +U*V*(1-W)*NIV3 < +(1-U)*V*(1-W)*NIV4 < +(1-U)*V*W*NIV5 < +U*V*W*NIV6 < +U*(1-V)*W*NIV7 < +(1-U)*(1-V)*W*NIV8. < < < CALCUL DE (1-U,1-V,1-W) < #/FLD# F1 < 1, FSB HINCU < 1-U, #/FST# HINCU1 < HINCU1=1-HINCU. #/FLD# F1 < 1, FSB HINCV < 1-V, #/FST# HINCV1 < HINCV1=1-HINCV. #/FLD# F1 < 1, FSB HINCW < 1-W, #/FST# HINCW1 < HINCW1=1-HINCW. < < INTERPOLATION TRI-DIMENSIONNELLE : < < 1-W, FMP AFNIV1 < (1-W)*N1, #/FST# FWORK #/FLD# HINCW < W, FMP AFNIV8 < W*N8, FAD FWORK < (1-W)*N1+W*N8, FMP HINCU1 < (1-U)*((1-W)*N1+W*N8), #/FST# FWORK1 < ET SAVE... #/FLD# HINCW1 < 1-W, FMP AFNIV2 < (1-W)*N2, #/FST# FWORK #/FLD# HINCW < W, FMP AFNIV7 < W*N7, FAD FWORK < (1-W)*N2+W*N7, FMP HINCU < U*((1-W)*N2+W*N7), FAD FWORK1 < U*((1-W)*N2+W*N7)+(1-U)*((1-W)*N1+W*N8), FMP HINCV1 < (1-V)*(U*((1-W)*N2+W*N7) < +(1-U)*((1-W)*N1+W*N8)), #/FST# FWORK1 < ET SAVE... #/FLD# HINCW1 < 1-W, FMP AFNIV3 < (1-W)*N3, #/FST# FWORK #/FLD# HINCW < W, FMP AFNIV6 < W*N6, FAD FWORK < (1-W)*N3+W*N6, FMP HINCU < U*((1-W)*N3+W*N6), #/FST# FWORK2 < ET SAVE... #/FLD# HINCW1 < 1-W, FMP AFNIV4 < (1-W)*N4, #/FST# FWORK #/FLD# HINCW < W, FMP AFNIV5 < W*N5, FAD FWORK < (1-W)*N4+W*N5, FMP HINCU1 < (1-U)*((1-W)*N4+W*N5), FAD FWORK2 < (1-U)*((1-W)*N4+W*N5)+U*((1-W)*N3+W*N6), FMP HINCV < V*((1-U)*((1-W)*N4+W*N5) < +U*((1-W)*N3+W*N6)), FAD FWORK1 < CUMUL GENERAL... < < FIN DE L'INTERPOLATION : < FONCT4: EQU $ PLR X < < CALCUL RECURSIF DE LA FONCTION : < FMP FPOND < ET ON PONDERE PAR LES 'FPOND' < AFIN D'OBTENIR DES VALEURS ALEATOIRES < DECROISSANTES STATISTIQUEMENT... < NOTA : ON NE DIVISE PLUS PAR 'FPOND0', < CAR LA DEFINITION DE 'RENORM' INCLUE < SON INVERSE, ET DONC : FPOND0/FPOND0=1... FAD FCUMR < QUE L'ON CUMULE, #/FST# FCUMR < ON A AINSI EN CHAQUE POINT UNE SOMME < DE FONCTION ALEATOIRE DONT LA FREQUENCE < AUGMENTE PROGRESSIVEMENT PAR REDUCTION < DE LA MAILLE, MAIS DONT L'AMPLITUDE < DIMINUE STATISTIQUEMENT... < < PASSAGE A LA COMPOSANTE SUIVANTE : < ADRI I,X < PROGRESSION DE L'INDEX DE RECURSION... LR X,A CP NRECUR < EST-CE FINI ??? JGE FONCT2 < OUI, ON ARRETE LA... BSR AGOTO WORD FONCT5 < NON, ON CONTINUE... FONCT2: EQU $ < < FIN DE RECURSION : < #/FLD# FCUMR < ET ON RENVOIE LA SOMME DES < FONCTIONS ALEATOIRES... FDV RENORM < ET ON MULTIPLIE PAR 'AMPLI', 'AMPLIR', < ET ON DIVISE PAR LE SIGMA DES 'FPOND'... < < CALCUL FINAL DE LA < CONTRIBUTION ALEATOIRE : < FAD MOYENE < ET TRANSLATION. FMP PONRDN < ET PONDERATION PAR LA CONTRIBUTION < ALEATOIRE... FONCT6: EQU $ < < TEST DE LA CONTRIBUTION < DES SPIRALES (256,256) : < FCMZ PONSPI < LES SPIRALES SONT-ELLES LA ??? JE FONCT0 < NON, (A,B) DONNE LA FONCTION... < < < C O N T R I B U T I O N D E S S P I R A L E S : < < PSR A,B < SAUVEGARDE DE LA CONTRIBUTION ALEATOIRE. < < TEST DE LA POSITION < DU POINT COURANT (XS,YS) < DE LA MAILLE (512,512) < PAR RAPPORT A LA MAILLE < DES SPIRALES 2*(256,256) : < LA XS < (A)=ABSCISSE '512', SLRS XC512/NPOL=K LR A,X < (X)=ABSCISSE '256'. JC FONC01 < ELLE NE "TOMBE PAS JUSTE"... LA YS < (A)=ORDONNEE '512', SB VECTNL NGR A,A < EN EFFET, LES AXES 'Y' '512' ET '256' < SONT INVERSES... SLRS XL512/NLIG=K LR A,Y < (Y)=ORDONNEE '256'. JC FONC02 < ELLE NE "TOMBE PAS JUSTE", ET LE POINT < '512' EST SUR SUR UNE HORIZONTALE ENTRE < DEUX POINTS '256'... < < CAS D'UN POINT '512' < COINCIDANT AVEC UN < POINT '256' : < BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X,Y)). FMP F4 < ET ON LE QUADRUPLE : < (A,B)=4*SIGMA(NIVEAU(X,Y)). JMP FONC09 < VERS LA SORTIE... < < CAS D'UN POINT '512' < ENTRE DEUX POINTS '256' < SUR UNE VERTICALE : < FONC02: EQU $ BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X,Y)), #/FST# FWORK < ET SAVE... ADRI I,Y BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X,Y+1)). FAD FWORK < (A,B)=SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X,Y+1)). FMP F2 < ET ON LE DOUBLE : < (A,B)=2*(SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X,Y+1))). JMP FONC09 < VERS LA SORTIE... < < AUTRES CAS : < FONC01: EQU $ LA YS < (A)=ORDONNEE '512' : SB VECTNL NGR A,A < EN EFFET, LES AXES 'Y' '512' ET '256' < SONT INVERSES... SLRS XL512/NLIG=K LR A,Y < (Y)=ORDONNEE '256'. JC FONC03 < ELLE NE "TOMBE PAS JUSTE", ET LE POINT < '512' ET AU CENTRE D'UN CARRE DE QUATRE < POINTS '256'... < < CAS D'UN POINT '512' < ENTRE DEUX POINTS '256' < SUR UNE HORIZONTALE : < BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X,Y)), #/FST# FWORK < ET SAVE... ADRI I,X BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X+1,Y)). FAD FWORK < (A,B)=SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X+1,Y)). FMP F2 < ET ON LE DOUBLE : < (A,B)=2*(SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X+1,Y))). JMP FONC09 < VERS LA SORTIE... < < CAS D'UN POINT '512' AU < CENTRE D'UN CARRE FAIT < DE QUATRE POINTS '256' : < FONC03: EQU $ BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X,Y)), #/FST# FWORK1 ADRI I,X BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X+1,Y)), #/FST# FWORK2 ADRI I,Y BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X+1,Y+1)), #/FST# FWORK ADRI -I,X BSR ASPIRL < (A,B)=SIGMA(NIVEAU(X,Y+1)). FAD FWORK FAD FWORK2 FAD FWORK1 < (A,B)=SIGMA(NIVEAU(X,Y))+ < SIGMA(NIVEAU(X+1,Y))+ < SIGMA(NIVEAU(X+1,Y+1))+ < SIGMA(NIVEAU(X,Y+1)). < < PONDERATION "SPIRALE" : < FONC09: EQU $ FMP PONSPI < ET CONTRIBUTION DES SPIRALES... < < < C A L C U L D E L A F O N C T I O N C O U R A N T E : < < #/FST# FWORK < SAUVEGARDE TEMPORAIRE... PLR A,B < (A,B)=CONTRIBUTION ALEATOIRE, FAD FWORK < (A,B)=CONTRIBUTION ALEATOIRE+ < CONTRIBUTION DES SPIRALES. < < < M O D U L A T I O N : < < FONCT0: EQU $ PLR X,Y,W < RESTAURATION DES COORDONNEES (X,Y,Z)... IF NEXIST-K,,XEIF%, IF ATTENTION : CE QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF CPZ NFONCT < Y-A-T'IL UNE MODULATION ??? JE FONCT7 < NON, (A,B) EST BON... PSR A,B < OUI, ON EMPILE LA VALEUR COURANTE DE < LA FONCTION RDN(X,Y,Z)... PSR X,Y,W < ET SAUVEGARDE DES COORDONNEES, ON NE < SAIT JAMAIS... LA NFONCT < (A)=INDEX DE LA FONCTION DEMANDEE : CPI FGAUSS < EST-CE UNE GAUSSIENNE ??? JE GAUS01 < OUI... QUIT XXQUIT < E R R E U R P R O G R A M M E ... PLR A,B < (A,B)=RDN(X,Y,Z) COURANTE, JMP FONCT7 < ET VERS LA SORTIE... < < < G A U S S I E N N E : < < GAUS01: EQU $ LR X,A < X, SB TXGAUS < X-TX, FLT #/FST# FWORK FMP FWORK < (X-TX)**2, FDV DXGAUS < ((X-TX)**2)/DX. #/FST# FWORK1 LR Y,A < Y, SB TYGAUS < Y-TY, FLT #/FST# FWORK FMP FWORK < (Y-TY)**2, FDV DYGAUS < ((Y-TY)**2)/DY. FAD FWORK1 < ((X-TX)**2)/DX+((Y-TY)**2)/DY. #/FST# FWORK1 LR W,A < Z, SB TZGAUS < Z-TZ, FLT #/FST# FWORK FMP FWORK < (Z-TZ)**2, FDV DZGAUS < ((Z-TZ)**2)/DZ. FAD FWORK1 < ((X-TX)**2)/DX+((Y-TY)**2)/DY+ < +((Z-TZ)**2)/DZ, FNEG BSR AEXPON < EXP(-(((X-TX)**2)/DX+((Y-TY)**2)/DY+ < ((Z-TZ)**2)/DZ)). < < ET MODULATION : < FINFON: EQU $ #/FST# FWORK < SAUVEGARDE DU FACTEUR MULTIPLICATIF, PLR X,Y,W < RESTAURATION DES COORDONNEES (X,Y,Z)... PLR A,B < (A,B)=RDN(X,Y,Z), FMP FWORK < ET MODULATION... FONCT7: EQU $ < < RETOUR : < RSR PAGE < < < A C C E S A U N I V E A U C O U R A N T : < < < ARGUMENT : < (IBUFMT)=INDEX DE L'OCTET COURANT. < < < RESULTAT : < (A,B)=OCTET COURANT EN FLOTTANT... < < NIVO: EQU $ < < INITIALISATIONS : < PSR X < < TEST DE L'ETAT DU BUFFER : < LA IBUFMT < (A)=INDEX COURANT : CP ZBUFMT < LE BUFFER A-T'IL ETE VIDE (OU EST-CE < L'ETAT INITIAL) ??? JL NIVO1 < NON... < < CAS OU LE BUFFER EST VIDE : < NIVO2: EQU $ LAD DEMMT < (A)=ADRESSE DE LA DEMANDE, SVC < QUE L'ON ENVOIE... JE NIVO3 < OK... QUIT XXQUIT < E R R E U R D ' A S S I G N A T I O N.. JMP NIVO2 < ET ON RE-TENTE, OU BIEN ON ARRETE S'IL < S'AGIT D'UN 'TAPE-MARK'... NIVO3: EQU $ IC DEMMT+ARGESC < PREPARATION DE L'ADRESSE DU BLOC SUIVANT, ACTD XXXSIZ < RECUPERATION DE LA 'BOX'... LR B,A < (A)=NOMBRE D'OCTETS REELS DU BLOC : CP DEMMT+COESC < LE BUFFER EST-IL BON ??? JNE NIVO2 < NON, ON LIT L'ENREGISTREMENT SUIVANT... LAI K < (A)=INDEX DU PREMIER OCTET. < < ACCES A L'OCTET COURANT : < NIVO1: EQU $ LR A,X < (X)=INDEX DE L'OCTET COURANT, LBY &ABUFMT < (A)=OCTET COURANT... ADRI I,X < ET PREPARATION DE STX IBUFMT < L'ACCES SUIVANT... < < ET RETOUR : < FLT < ET PASSAGE EN FLOTTANT... FAD TRANMT < TRANSLATION ET FMP MULTMT < MISE A L'ECHELLE... PLR X RSR PAGE < < < C A L C U L D ' U N E P U I S S A N C E < Q U E L C O N Q U E R E E L L E ' P ' : < < < ARGUMENT : < (A,B)=NOMBRE 'N' ARGUMENT, < < < RESULTAT : < (A,B)='N' A LA PUISSANCE P. < < RAK: EQU $ PSR Y < < < L O G N E P E R I E N : < < LOGN: EQU $ STZ SIGNE < =0 : SIGNE "+" A PRIORI... FCAZ JGE LOGN1 < POSITIF... IC SIGNE < =1 : SIGNE "-"... LOGN1: EQU $ LR A,Y FABS ANDI XXMASK #/FST# POLLO3 FAD POLLO4 #/FST# POLLO2 LR Y,A SWBR A SARS XXMASK=K FLT #/FST# POLLO1 #/FLD# POLLO3 FSB POLLO4 FDV POLLO2 #/FST# POLLO3 FMP POLLO3 FNEG FAD POLLO7 #/FST# POLLO2 #/FLD# POLLO6 FDV POLLO2 FAD POLLO5 FMP POLLO3 FSB POLLO8 FAD POLLO1 FMP POLLO9 < < < G E S T I O N D U S I G N E D E L ' E X P O S A N T : < < PSR A,B < SAVE LE 'LOG'... #/FLD# EXPOP FABS BSR AROND < ON PREND LA PARTIE ENTIERE (PAR EXCES < OU PAR DEFAUT) DE LA VALEUR ABSOLUE DE < L'EXPOSANT... TBT NBITMO-B < QUELLE EST SA PARITE ??? JC RAK1 < IMPAIRE, 'SIGNE' RESTE TEL QUEL... STZ SIGNE < PAIRE : ON FORCE "+" (SIGNE INCHANGE)... RAK1: EQU $ PLR A,B < RESTAURATION DU LOG, FMP EXPOP < ET ON CALCULE P*LOG... < < < E X P O N E N T I E L L E : < < EXP: EQU $ FMP POLEX4 #/FST# POLEX3 FIX STA POLEX5 FLT FCAM POLEX3 JNV EXPON3 #/FLD# POLEX6 #/FST# POLEX3 JMP EXPON5 EXPON3: EQU $ CPZ POLEX3 JGE EXPON4 DC POLEX5 LA POLEX5 FLT EXPON4: EQU $ FSB POLEX3 FNEG #/FST# POLEX2 FMP POLEX2 #/FST# POLEX1 FAD POLEX8 #/FST# POLEX3 #/FLD# POLEY0 FDV POLEX3 FAD POLEX1 FMP POLEX9 FAD POLEY1 FSB POLEX2 #/FST# POLEX3 #/FLD# POLEX7 FMP POLEX2 FDV POLEX3 FAD POLEX6 #/FST# POLEX3 EXPON5: EQU $ SWBR A SARS XXMASK=K AD POLEX5 CPI XX7F JG $ < E R R E U R P R O G R A M M E ... CPI XX80 JGE EXPON6 #/FLD# F0 < ON PREND LE MINIMUM... JMP EXPON7 EXPON6: EQU $ XWOR%1: VAL XXMASK=K XWOR%1: VAL -XWOR%1 ANDI XXMASK>XWOR%1 STA POLEX5 LA POLEX3 ANDI XXMASK AD POLEX5 EXPON7: EQU $ CPZ SIGNE < PRISE EN COMPTE DU SIGNE SIMULE : JE EXP1 < POSITIF, ON LAISSE LE RESULTAT TEL QUEL.. FNEG < NEGATIF, ON INVERSE... EXP1: EQU $ BSR ATSFLO PLR Y RSR < < < E X P O N E N T I E L L E : < < EXPON: EQU $ PSR Y STZ SIGNE < "+" A PRIORI... JMP EXP < VERS LE CALCUL DE L'EXPONENTIELLE... PAGE < < < P O I N T D ' E N T R E E : < < DEBUT: EQU $ < < INITIALISATION DES REGISTRES : < LRM C,L,K WORD COM+DEPBAS < POSITIONNEMENT DE 'C', WORD LOC+DEPBAS < POSITIONNEMENT DE 'L', WORD STACK-DEPILE < ET DE 'K'. < < CONNEXION A LA 'CDA' : < LAI PAGER BSR AGPCDA < AFIN D'ATTEINDRE LA MEMOIRE DU '68000' < ET LA MEMOIRE 'SOLAR' QUI LA PRECEDE < AFIN D'Y METTRE 'BUF'... < < < E N T R Y D E R E B O U C L A G E : < < DEBUT4: EQU $ < < MODIFICATION A PRIORI DU 'PRESC' : < LRM A WORD DEBUT5 < POUR 'XXXPRE'... ACTD XXXPRE < ON CHANGE ALORS SYSTEMATIQUEMENT APRES < PASSAGE ICI LE 'PRESC' DU PROGRAMME, AFIN < DE REVENIR SUR LA VISUALISATION APRES < CHAQUE ALT-MODE (VIA 'DEBUT5'...). < < < I N I T I A L I S A T I O N S : < < INIT01: EQU $ < < DEFINITION DU SEUIL < DE DEFINITION DE LA < SURFACE : < LB SCOUCH < (B)=SEUIL A PRIORI ('SCOUCH')... LA NFONCT < (A)=FONCTION DE MODULATION DE LA FONCTION < ALEATOIRE RDN(X,Y,Z) : CPI FGAUSS < EST-CE LA MODULATION GAUSSIENNE ??? JNE INIT20 < NON, (B) EST BON... GCOUCH:: VAL 4 < LOGARITHME EN BASE 2 DU DIVISEUR DE < 'SCOUCH' LORSQUE LA MODULATION GAUS- < SIENNE EST UTILISEE ; EN EFFET, IL FAUT < DIMINUER LE SEUIL DE DEFINITION DE LA < SURFACE, CAR LA MODULATION GAUSSIENNE EST < INFERIEURE A 1, ET ALORS PRATIQUEMENT < TOUS LES POINTS SE TROUVERAIENT A L'EX- < TERIEUR... LAI K < CLEAR 'A', SLRD GCOUCH < ET ON DIMINUE LE SEUIL... INIT20: EQU $ STB ICOUCH < MISE A JOUR DU SEUIL COURANT DE DEFINI- < TION DE LA SURFACE... < < GENERATEUR ALEATOIRE : < LA SUPRDN FLT #/FST# FSUP < BORNE SUPERIEURE ('SUP'), LA INFRDN FLT #/FST# FINF < BORNE INFERIEURE ('INF'), FDV FSUP < INF/SUP, PSR A,B < ET SAVE... FSB F1 < (INF/SUP)-1, FNEG < 1-(INF/SUP), #/FST# UNMIS < UNMIS=1-(INF/SUP). PLR A,B < INF/SUP, FAD F1 < 1+(INF/SUP), FMP INF32 < 32768*(1+(INF/SUP)), #/FST# UNPIS < UNPIS=32768*(1+(INF/SUP)). #/FLD# FSUP < SUP, FDV INF64 < SUP/65536, #/FST# SUP64 < SUP64=SUP/65536. < < INITIALISATION DES < CALCULS DE SPIRALES : < LA NPM FLT #/FST# FNPM < FLOTTAGE DE 'NPM'... < < PAS INITIAUX DU MAILLAGE : < #/FLD# F1 FDV F3 #/FST# EXPOP < POUR CALCULER UNE RACINE CUBIQUE POUR < PASSER D'UN VOLUME A UNE DIMENSION... LA PASIX0 < VALEUR INITIALE DE 'PASIX' : JALE $ < ??? STA PASIX < PAS EN 'X', FLT #/FST# FWORK < ET SAUVEGARDE... LA PASIY0 < VALEUR INITIALE DE 'PASIY' : JALE $ < ??? STA PASIY < ET PAS EN 'Y'... FLT FMP FWORK < CALCUL DE PASIX*PASIY... #/FST# FWORK LA PASIZ0 < VALEUR INITIALE DE 'PASIZ' : JALE $ < ??? STA PASIZ < ET PAS EN 'Z'... FLT FMP FWORK < ET CALCUL DE PASIX*PASIY*PASIZ, SOIT LE < VOLUME DE LA PLUS GRANDE MAILLE INITIALE, BSR ARAK #/FST# FPOND0 < LA PONDERATION INITIALE DES FONCTIONS < ALEATOIRES EST EN FAIT LA TAILLE DE LA < MAILLE... < < INITIALISATION DU REDUC- < TEUR RECURSIF : < #/FLD# EXPOP0 #/FST# EXPOP < < MISE EN PLACE DE LA < SOURCE DE LA FONCTION : < LRM A WORD FONCT < (A)=ADRESSE DU SOUS-PROGRAMME DE CALCUL < DE LA FONCTION ALEATOIRE RECURSIVE < A PRIORI... IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST CI-DESSOUS EST IDIOT !!! XEIF%: VAL ENDIF CPZ IBANDE < EN FAIT DOIT-ON LIRE UNE BANDE ??? JE INIT10 < NON... LRM A < OUI : WORD NIVO < (A)=ADRESSE DU SOUS-PROGRAMME DE RECUPE- < RATION DES VALEURS DE LA FONCTION < SUR BANDE... LBI NEXIST < DANS LE CAS D'UNE ENTREE PAR BANDE, ON < NE PEUT PAS RECALCULER LE CHAMP PAR < 'AFONCT' POUR CALCULER L'ECLAIRAGE ET < LES OMBRES PORTEES, CAR CELA FERAIT < TROP DE MOUVEMENTS DE BANDES ; ON INHIBE < DONC CES FONCTIONS, EN NE FAISANT QUE DU < "DEPTH-CUEING"... STB INEW STB IECL INIT10: EQU $ STA AFONCT < ET MISE EN PLACE DU RELAI D'ACCES A LA < FONCTION... < < INITIALISATION DU GESTIONNAIRE < DE BANDES MAGNETIQUES (A PRIORI) : < LA ABLOC0 JAL INIT21 < ON FERA DU SEQUENTIEL STRICT... STA DEMMT+ARGESC < ADRESSE DU PREMIER BLOC A LIRE, INIT21: EQU $ LA ZBUFMT STA IBUFMT < POUR FORCER LA PREMIERE LECTURE... < < PREPARATION A PRIORI DE LA < MODULATION DU "DEPTH-CUEING" : < #/FLD# FH < FH, FMP FNIVMX < 255*FH, #/FST# FHP #/FLD# FNIVMX < 255, FSB FHP < 255-FHP, FDV FNIVMX < (255-FHP)/255, #/FST# F255MH < QUE L'ON MEMORISE SANS VALIDATION... < < < I N I T I A L I S A T I O N D E S M A I L L A G E S : < < GEN200: EQU $ LA MRECUR < VALIDATION DE 'MRECUR' : JALE GEN201 < MAUVAIS... CPI MAXREC < ALORS ??? JLE GEN202 < OK... GEN201: EQU $ QUIT XXQUIT < E R R E U R U T I L I S A T E U R ... JMP GEN200 < ET ON RE-VALIDE... GEN202: EQU $ < < INITIALISATIONS : < LA PASIX FLT #/FST# FPASIX < 'PASIX', LA PASIY FLT #/FST# FPASIY < 'PASIY', LA PASIZ FLT #/FST# FPASIZ < 'PASIZ'. #/FLD# FPOND0 #/FST# FPOND < 'FPOND'. < < REDUCTION RECURSIVE DU MAILLAGE : < LXI K < (X)=INDEX DE RECURSION... GEN210: EQU $ PSR X LR X,Y < (Y)=INDEX ENTIER, ADR X,X < PASSAGE A UN INDEX FLOTTANT... #/FLD# FPOND FST &ALPOND < 'LPOND', BSR ARAK < EXPONENTIATION, #/FST# FPOND < ET REDUCTION... #/FLD# FPASIX FST &ALPASX < 'PASIX' FLOTTANT, PSR A,B,X LR Y,X BSR AROND STA &ALPSIX < 'PASIX' ENTIER. PLR A,B,X BSR ARAK < EXPONENTIATION, #/FST# FPASIX < ET REDUCTION... #/FLD# FPASIY FST &ALPASY < 'PASIY' FLOTTANT, PSR A,B,X LR Y,X BSR AROND STA &ALPSIY < 'PASIY' ENTIER. PLR A,B,X BSR ARAK < EXPONENTIATION, #/FST# FPASIY < ET REDUCTION... #/FLD# FPASIZ FST &ALPASZ < 'PASIZ' FLOTTANT, PSR A,B,X LR Y,X BSR AROND STA &ALPSIZ < 'PASIZ' ENTIER. PLR A,B,X BSR ARAK < EXPONENTIATION, #/FST# FPASIZ < ET REDUCTION... FAD FPASIY FAD FPASIX BSR AROND < (A)=PASIX+PASIY+PASIZ, PLR X < RESTAURE L'INDEX DE RECURSION... ADRI I,X < PASSAGE A LA RECURSION SUIVANTE... CPI W+W+W < EST-ON ARRIVE A UNE MAILLE IRREDUCTIBLE, < SOIT ELEMENTAIRE (1*1*1) ??? JE GEN220 < OUI, ON ARRETE LA... LR X,A < NON, CP MRECUR < MAIS A-T'ON ATTEINT LE MAXIMUM ??? JL GEN210 < NON, ON CONTINUE... GEN220: EQU $ STX NRECUR < MISE EN PLACE DU 'NRECUR' A UTILISER... < < CALCUL DU FACTEUR DE < RENORMALISATION DE LA < FONCTION ALEATOIRE : < LR X,A < (A)='NRECUR', FLT < QUE L'ON FLOTTE... FAD KAMPLI FSB F1 FDV KAMPLI #/FST# AMPLI < (AMPLI)=(NRECUR+30)/31... #/FLD# F0 < INITIALISATION DU SIGMA DES 'FPOND', GEN410: EQU $ PSR X ADRI -IJIJDX,X ADR X,X < PASSAGE A UN INDEX FLOTTANT... FAD &ALPOND < CALCUL DE SIGMA(FPOND), PLR X JDX GEN410 < AU SUIVANT... FDV AMPLI FDV AMPLIR #/FST# RENORM < RENORM=SIGMA(FPOND)/(AMPLI*AMPLIR). < < INITIALISATION DE L'EVENTUEL < CALCUL DES DERIVEES : < GEN950: EQU $ LA PASDER < (A)=PAS DE DERIVATION COURANT : JALE GEN951 < ERREUR... CPI PASMAX JLE GEN952 < OK, LE PAS EST VALIDE... GEN951: EQU $ QUIT XXQUIT < E R R E U R D E P A R A M E T R E ... JMP GEN950 < ET ON REDEMANDE... GEN952: EQU $ LAD ALIGM1-Z < (A)=ADRESSE-1 DU PREMIER RELAI, AD PASDER < (A)=ADRESSE DU RELAI D'ACCES A LA LIGNE < UTILISEE POUR DERVIVER PAR RAPPORT < A 'Y', STA AALIGM < ET MISE EN PLACE DU RELAI DE RELAI DE < DERIVATION PAR RAPPORT A 'Y'... LAD ALJGM1-Z < (A)=ADRESSE-1 DU PREMIER RELAI, AD PASDER < (A)=ADRESSE DU RELAI D'ACCES A LA LJGNE < UTILISEE POUR DERVIVER PAR RAPPORT < A 'Y', STA AALJGM < ET MISE EN PLACE DU RELAI DE RELAI DE < DERIVATION PAR RAPPORT A 'Y'... < < VALIDATION DES DEMANDES < D'OMBRES PORTEES : < IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST MAUVAIS !!! XEIF%: VAL ENDIF CPZ IOMBRE < A-T'ON DEMANDE LES OMBRES PORTEES ??? JE GEN490 < NON, RIEN A VALIDER... GEN491: EQU $ FCMZ FZL < OUI, DANS CE CAS, ON FAIT LES HYPOTHESES < SUIVANTES : < 1 - ON TRACE DE DROITE A GAUCHE, < 2 - LA SOURCE LUMINEUSE 'S' EST A DROITE < DE LA SURFACE (XL > XMAX), PUISQU'ON < TRACE DE DROITE A GAUCHE, ET DANS LE < PLAN DE PROJECTION (ZL=0) POUR SIMPLIFIER < LES CALCULS (EN FAIT ON VA MEME LA SUP- < POSER A L'INFINI, EN IGNORANT SYLTEMATI- < QUEMENT LA TROISIEME COORDONNEE DU RAYON < LUMINEUX...). JNE GEN492 < ERREUR : 'ZL' EST NON NUL !!! #/FLD# FXL BSR AROND CP VECTNC JG GEN490 < OK, LA SOURCE LUMINEUSE EST A DROITE DE < LA SURFACE... GEN492: EQU $ QUIT XXQUIT < ERREUR SUR LA SOURCE LUMINEUSE, ON < REDEMANDE LES PARAMETRES... JMP GEN491 < ET ON REVALIDE... GEN490: EQU $ #/FLD# FYL < VALIDATION DE 'YL' : BSR AROND CP VECTNL < LA SOURCE LUMINEUSE DOIT ETRE AU-DESSUS < DE L'IMAGE POUR DEUX RAISONS : < 1 - ON VA FAIRE DES DIVISIONS PAR Y0-YL, < QUI NE DOIT DONC PAS ETRE NUL, < 2 - ON VEUT QUE LES RAYONS LUMINEUX < COUPENT SOIT LE BORD DROIT, SOIT LE < BORD SUPERIEUR DE L'IMAGE... JLE GEN492 < ERREUR... GEN441: EQU $ LA NPENOM < (A)=LARGEUR DE LA ZONE DE PENOMBRE : JAG GEN440 < OK, ELLE EST STRICTEMENT POSITIVE... QUIT XXQUIT < E R R E U R ... JMP GEN441 < ET ON RE-VALIDE... GEN440: EQU $ FLT #/FST# FWORK #/FLD# FNIVLU < FNIVLU, FSB FNIVOM < FNIVLU-FNIVOM, #/FST# TNIVOM < TNIVOM=FNIVLU-FNIVOM, FDV FWORK < (FNIVLU-FNIVOM)/NPENOM, #/FST# FPENOM < FPENOM=(FNIVLU-FNIVOM)/NPENOM. < < INITIALISATION DE L'ECLAIRAGE : < #/FLD# FNIVLU #/FST# FNIVEC < ON INITIALISE A PRIORI 'FNIVEC' POUR < LE CAS OU L'OMBRAGE N'EST PAS DEMANDE... #/FLD# FXL < XL, FDV FYL < XL/YL, #/FST# FPENTM < SOIT L'INVERSE DE LA PENTE "MOYENNE" < DES RAYONS LUMINEUX... < < INITIALISATION DU TRANSLATEUR < DE LA FONCTION 'RDN' : < LAI K < (A)=TRANSLATION NULLE A PRIORI... IF NEXIST-K,,XEIF%, IF ATTENTION : CE QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF CPZ INEW < NOUVELLE OU ANCIENNE METHODE ??? JE GEN501 < ANCIENNE : LA TRANSLATION EST NULLE... LA ICOUCH < NOUVELLE : LA TRANSLATION EST LA CONS- < TANTE DE SEUIL DE DEFINITION DE LA < SURFACE (TRANSITION ENTRE L'EXTERIEUR < ET L'INTERIEUR...), GEN501: EQU $ STA TCOUCH < MISE EN PLACE DE LA TRANSLATION... < < < G E N E R A T I O N D E L ' I M A G E : < < GEN69: EQU $ CPZ IERASE < FAUT-IL EFFACER ??? JE GEN69N < NON... IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST CI-DESSUS EST IDIOT !!! XEIF%: VAL ENDIF < < EFFACEMENT DE L'ECRAN : < XWOR%1: VAL NIV256=K IF BIT>XWOR%1-NIV256,,XWOR%, IF ATTENTION : LE CALCUL DU MASQUE SELECTANT TOUS IF LES PLANS EST ABSURDE !!! XWOR%: VAL ENDIF LAI NIV256-MASK)MOCD STA MCDAJ LA ARPLAN < (A)=ADRESSE DU REGISTRE DE SELECTION... BSR APWCDA < ET ON SELECTIONNE TOUS LES PLANS... LAI ERASE STA MCDAJ LA ARCMD BSR APWCDA < EFFACEMENT DE L'ECRAN, ET REINITIALISA- < TION DE TOUS LES REGISTRES... LAD TEMPO SVC < ET ON FAIT UN PETIT DODO... LAI XCTRL1 STA MCDAJ LA ACTRL1 BSR APWCDA < INITIALISATION DE 'CTRL1'. LAI XCTRL2 STA MCDAJ LA ACTRL2 BSR APWCDA < INITIALISATION DE 'CTRL2'. < < INITIALISATION DES < CONDITIONS DE TRACE : < GEN69N: EQU $ < < < G E N E R A T I O N D U C H A M P A L E A T O I R E : < < LA AZMIN LR A,W < (W)=COORDONNEE 'Z' ; A NOTER L'INITIALI- < SATION RENDUE NECESSAIRE PAR LA < VISUALISATION "DEPTH-CUEING"... < < BALAYAGE EN 'Z' : < GEN900: EQU $ < < INITIALISATION DES OMBRES PORTEES : < IF EXIST-K,XEIF%,,XEIF% IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ IOMBRE < Y-A-T'IL DES OMBRES PORTEES ??? JE GEN970 < NON... IF LCOTEV-LCOTEH,,XEIF%, IF ATTENTION : CE QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF LRM X < OUI : WORD LCOTEV?LCOTEH < (X)=NOMBRE DE MOTS A INITIALISER, LAI K-I < (A)=VALEUR D'INITIALISATION (NEGATIVE). GEN971: EQU $ STA &XCOTEH < CLEAR LE COTE SUPERIEUR DE L'IMAGE, STA &XCOTEV < CLEAR LE COTE DROIT DE L'IMAGE. JDX GEN971 < ET SUITE... IF EXIST-K,XEIF%,,XEIF% IF ATTENTION : CE QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF CPZ INEW < EST-CE LA NOUVELLE METHODE ??? JE GEN970 < NON, L'ANCIENNE... IF LKOTEV-LKOTEH,,XEIF%, IF ATTENTION : CE QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF LRM X < OUI : WORD LKOTEV?LKOTEH < (X)=NOMBRE DE MOTS A INITIALISER, < (A)=VALEUR D'INITIALISATION (NEGATIVE). GEN97A: EQU $ STA &XKOTEH < CLEAR LE KOTE SUPERIEUR DE L'IMAGE, STA &XKOTEV < CLEAR LE KOTE DROIT DE L'IMAGE. JDX GEN97A < ET SUITE... GEN970: EQU $ < < PREPARATION DU BALAYAGE EN 'Y' : < LY VECTNL < (Y)=COORDONNEE 'Y'. < NOTA : ON FAIT DECROITRE LES 'Y' AFIN < DE PERMETTRE LE CALCUL SIMPLE DES < OMBRES PORTEES... < < BALAYAGE EN 'Y' : < GEN01: EQU $ < < INITIALISATION DU BUFFER < DES NIVEAUX DE LIGNE : < LRM X WORD LLISTN < (X)=NOMBRE DE MOTS A NETTOYER... GEN700: EQU $ STZ &ALISTX < NETTOYAGE DE LA LISTE DES NIVEAUX DE < GRIS DE LA LIGNE COURANTE... JDX GEN700 GEN720: EQU $ < < PREPARATION DU BALAYAGE EN 'X' : < LA &AALIGM STA ALIGM < MISE EN PLACE DU BUFFER COURANT DE < DERIVATION PAR RAPPORT A 'Y'... LA &AALJGM STA ALJGM < MISE EN PLACE DU BUFFER COURANT DE < DERIVATION PAR RAPPORT A 'Y'... LX AXMIN < (X)=COORDONNEE 'X'. < < BALAYAGE EN 'X' : < GEN02: EQU $ BSR AFONCT < (A,B)=RDN(X,Y,Z). FIX IF DFLOT-XXXMOY,,XEIF%, IF ATTENTION : LES 'ADR' VONT MERDER !!! XEIF%: VAL ENDIF SB TCOUCH < ON TRANSLATE EVENTUELLEMENT... STA &ALIG < ET ON MEMORISE RDN(X,Y,Z) DANS LA LIGNE < COURANTE... IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT VA MERDER !!! XEIF%: VAL ENDIF CPZ INEW < EST-CE LA NOUVELLE METHODE ??? JE GEN500 < NON, L'ANCIENNE... ADRI I,W < OUI, LA NOUVELLE, PASSAGE AU PLAN 'Z' < SUIVANT... BSR AFONCT < (A,B)=RDN(X,Y,Z+1). FIX IF DFLOT-XXXMOY,,XEIF%, IF ATTENTION : LES 'ADR' VONT MERDER !!! XEIF%: VAL ENDIF SB TCOUCH < ON TRANSLATE... STA &ALJG < ET ON MEMORISE RDN(X,Y,Z+1) DANS LA LJGNE < COURANTE... ADRI -I,W < RETOUR AU PLAN 'Z' COURANT... GEN500: EQU $ ADRI I,X < PROGRESSION SUR LA LIGNE : LR X,A CP VECTNC < EST-ON AU BOUT ??? JLE GEN02 < NON... < < < G E N E R A T I O N D U R E L I E F : < < IF EXIST-K,XEIF%,,XEIF% IF ATTENTION : CE QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF CPZ INEW < EST-CE L'ANCIENNE OU LA NOUVELLE < METHODE ??? JNE GEN550 < LA NOUVELLE... BSR AGOTO WORD GEN551 < L'ANCIENNE... < < < N O U V E L L E M E T H O D E : < < GEN550: EQU $ < < INITIALISATION DU DETECTEUR < DE TRANSITIONS A DROITE : < LA FANT0 STA FANTZ < POUR LE PLAN 'Z', STA FANTZ1 < ET LE PLAN 'Z+1'... < < INITIALISATION DU < BALAYAGE LIGNE : < LX VECTNC < (X)=ABSCISSE COURANTE. STY VECGY1 < INITIALISATION DE L'ORDONNEE DES STY VECGY2 < SEGMENTS HORIZONTAUX A TRACER. < < BALAYAGE LIGNE : < GEN510: EQU $ LR Y,A < (A)=ORDONNEE COURANTE : SB VECTNL NGR A,A CP PASDER < EST-ON SUR LES PREMIERES LIGNES ??? JGE GEN219 < NON, ON PEUT GENERER LE RELIEF... BSR AGOTO WORD GEN50 < OUI, ATTENDONS LA LIGNE SUIVANTE... < (MAIS ROTATION DES BUFFERS DE LIGNE < MALGRE TOUT...) GEN219: EQU $ LA &ALIG < (A)=RDN(X,Y,Z)-ICOUCH. JAGE GEN511 < ON EST A L'INTERIEUR... < < CAS OU ON EST A L'EXTERIEUR < DE LA SURFACE POUR LE PLAN 'Z' : < CPZ FANTZ < EST-CE UN PASSAGE PAR 0 DE LA FONCTION < RDN(X,Y,Z)-ICOUCH ??? JL GEN517 < NON... < < CAS D'UN PASSAGE PAR 0 (INTERIEUR --> EXTERIEUR) < DE LA FONCTION RDN(X,Y,Z)-ICOUCH : < STX VECGX1 < MISE EN PLACE DE L'ABSCISSE "GAUCHE"... BSR APNIVO < ET CALCUL DE : < (A,B)=NIVEAU(X,Y,Z), #/FST# INTENG < CE QUI DONNE L'INTENSITE "GAUCHE", BSR APLIST < ET MISE DANS LISTN(X)... CPZ FANTZ1 < MAIS EN FAIT, N'EST-ON PAS CACHE PAR < LE PLAN 'Z+1' ??? JGE GEN530 < OUI, CAR ON EST A L'INTERIEUR DE LA < SURFACE DANS LE PLAN 'Z+1'... BSR ASEGH < NON, TRACE DU SEGMENT HORIZONTAL < COURANT... GEN530: EQU $ JMP GEN512 < VERS LE POINT HORIZONTAL PRECEDENT... < < CAS DES POINTS A L'EXTERIEUR < DE LA SURFACE POUR LE PLAN 'Z' < SANS PASSAGE PAR 0 : < GEN517: EQU $ JMP GEN512 < ON LES IGNORE, VERS LE PASSAGE AU POINT < PRECEDENT SUR LA LIGNE... < < CAS OU ON EST A L'INTERIEUR : < DE LA SURFACE POUR LE PLAN 'Z' : < GEN511: EQU $ CPZ FANTZ < EST-CE UN PASSAGE PAR 0 DE LA FONCTION < RDN(X,Y,Z)-ICOUCH ??? JGE GEN513 < NON, ALLONS VOIR LE PLAN 'Z+1'... < < CAS D'UN PASSAGE PAR 0 (EXTERIEUR --> INTERIEUR) < DE LA FONCTION RDN(X,Y,Z)-ICOUCH : < STX VECGX2 < MISE EN PLACE DE L'ABSCISSE "DROITE". BSR APNIVO < (A,B)=NIVEAU(X,Y,Z), #/FST# INTEND < ET MISE EN PLACE DE L'INTENSITE < "DROITE", BSR APLIST < ET MISE DANS LISTN(X)... JMP GEN512 < PUIS VERS LE PASSAGE AU POINT HORIZONTAL < PRECEDENT... < < CAS DES POINTS INTERIEURS < A LA SURFACE POUR LE PLAN 'Z' < SANS PASSAGE PAR 0 : < GEN513: EQU $ LA &ALJG < (A)=RDN(X,Y,Z+1)-ICOUCH. JAGE GEN514 < ON EST A L'INTERIEUR DE LA SURFACE POUR < LE PLAN 'Z+1'... < < CAS DES POINTS A L'EXTERIEUR < DE LA SURFACE POUR LE PLAN 'Z+1' : < CPZ FANTZ1 < EST-CE UN PASSAGE PAR 0 DE LA FONCTION < RDN(X,Y,Z+1)-ICOUCH ??? JL GEN516 < NON... < < CAS DES PASSAGES PAR 0 (INTERIEUR --> EXTERIEUR) < DE LA FONCTION RDN(X,Y,Z+1)-ICOUCH : < BSR AOMBRE < GESTION DES OMBRES PORTEES DANS LE < PLAN 'Z'... STX VECGX2 < MISE EN PLACE DE L'ABSCISSE "DROITE". BSR APNJVO < (A,B)=NIVEAU(X,Y,Z+1), #/FST# INTEND < ET MISE EN PLACE DE L'INTENSITE < "DROITE", BSR APLIST < ET MISE DANS LISTN(X)... JMP GEN512 < ET PASSAGE AU POINT HORIZONTAL PRECEDENT. < < CAS DES POINTS EXTERIEURS A < LA SURFACE SUR LE PLAN 'Z+1' < SANS PASSAGE PAR 0 < GEN516: EQU $ BSR APNIVO < CALCUL SYSTEMATIQUE DU NIVEAU DES POINTS < INTERIEURS A LA SURFACE DANS LE PLAN 'Z' < ET EXTERIEURS POUR LE PLAN 'Z+1', BSR APLIST < ET MISE DANS LISTN(X)... JMP GEN512 < PUIS PASSAGE AU POINT HORIZONTAL < PRECEDENT... < < CAS DES POINTS A L'INTERIEUR DE < LA SURFACE POUR LE PLAN 'Z+1' : < GEN514: EQU $ BSR AOMBRE < GESTION DES OMBRES PORTEES DANS LE < PLAN 'Z'... CPZ FANTZ1 < EST-CE UN PASSAGE PAR 0 DE LA FONCTION < RDN(X,Y,Z+1)-ICOUCH ??? JGE GEN515 < NON... < < CAS DES PASSAGES PAR 0 (EXTERIEUR --> INTERIEUR) < DE LA FONCTION RDN(X,Y,Z+1)-ICOUCH : < STX VECGX1 < MISE EN PLACE DE L'ABSCISSE "GAUCHE". BSR APNJVO < (A,B)=NIVEAU(X,Y,Z+1), #/FST# INTENG < ET MISE EN PLACE DE L'INTENSITE < "GAUCHE", BSR APLIST < ET MISE DANS LISTN(X)... BSR ASEGH < ET TRACE DU SEGMENT HORIZONTAL COURANT... JMP GEN512 < PUIS PASSAGE AU POINT HORIZONTAL < PRECEDENT... < < CAS DES POINTS A L'INTERIEUR DE < LA SURFACE POUR LE PLAN 'Z+1' < SANS PASSAGE PAR 0 : < GEN515: EQU $ BSR AQMBRE < GESTION DES OMBRES PORTEES DANS LE < PLAN 'Z+1'... < < CHANGEMENT DE POINT SUR LA LIGNE : < GEN512: EQU $ LA &ALIG STA FANTZ < MEMORISATION DE RDN(X,Y,Z)-ICOUCH, LA &ALJG STA FANTZ1 < ET DE RDN(X,Y,Z+1)-ICOUCH AVANT DE PASSER < AU POINT PRECEDENT SUR LA LIGNE... ADRI -I,X < PASSAGE AU POINT PRECEDENT, LR X,A SB AXMIN CP PASDER < EST-ON EN DEBUT DE LIGNE ??? JGE GEN510 < NON, ON POURSUIT L'EXPLORATION... < < CAS DU BOUT GAUCHE < DE LA LIGNE : < CPZ FANTZ1 < OU EST-ON PAR RAPPORT A LA SURFACE DANS < LE PLAN 'Z+1' ??? JGE GEN521 < A L'INTERIEUR, RIEN D'AUTRE A FAIRE... CPZ FANTZ < A L'EXTERIEUR, ALORS OU EST-ON PAR < RAPPORT A LA SURFACE DANS LE PLAN 'Z' ??? JL GEN521 < A L'EXTERIEUR, RIEN A FAIRE... < < CAS OU L'ON EST A L'INTERIEUR < DE LA SURFACE DANS LE PLAN 'Z' ET < A L'EXTERIEUR DANS LE PLAN 'Z+1' : < ADRI I,X < RETOUR SUR LE POINT D'EXTREMITE GAUCHE... STX VECGX1 < MISE EN PLACE DE L'ABSCISSE "GAUCHE"... BSR APNIVO < ET CALCUL DE : < (A,B)=NIVEAU(X,Y,Z), #/FST# INTENG < CE QUI DONNE L'INTENSITE "GAUCHE", BSR APLIST < ET MISE DANS LISTN(X)... BSR ASEGH < ET TRACE DU DERNIER SEGMENT HORIZONTAL... < < FIN DE LA NOUVELLE METHODE : < GEN521: EQU $ BSR AGOTO WORD GEN50 < VERS LA ROTATION DES BUFFERS DE < LIGNE... < < < A N C I E N N E M E T H O D E : < < GEN551: EQU $ LX VECTNC < ON COMMENCE SUR LE PREMIER POINT, MAIS < ATTENTION, ON NE FINIT PAS SUR LE PREMIER < AFIN DE POUVOIR SYSTEMATIQUEMENT TRAITER < UN TRIANGLE DU TYPE : < (A(X,Y),B(X-I,Y),C(X,Y-I)). GEN30: EQU $ LA &ALIG < (A)=RDN(X,Y,Z)... < < DEFINITION DE LA SURFACE : < CP ICOUCH < EST-ON A L'INTERIEUR OU A L'EXTERIEUR ??? < LA SURFACE ET SON INTERIEUR EST L'EN- < SEMBLE DES POINTS (X,Y,Z) TELS QUE : < RDN(X,Y,Z) > (ICOUCH)... JL GEN913 < ON EST A L'EXTERIEUR, RIEN A MARQUER... CP ECOUCH < EST-ON DANS L'EPAISSEUR ??? JG GEN913 < NON, DONC RIEN A MARQUER... < < CHOIX DU MODE DE REPRESENTATION : < IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT VA MERDER !!! XEIF%: VAL ENDIF CPZ IECL < ALORS QUE FAIT-ON ??? JE GEN902 < DU "DEPTH-CUEING"... < < CAS DE L'ECLAIRAGE : < LR Y,A < (A)=ORDONNEE COURANTE : SB VECTNL NGR A,A CP PASDER < EST-ON SUR LES PREMIERES LIGNES ??? JGE GEN21 < NON, ON PEUT GENERER LE RELIEF... BSR AGOTO WORD GEN50 < OUI, ATTENDONS LA LIGNE SUIVANTE... < (MAIS ROTATION DES BUFFERS DE LIGNE < MALGRE TOUT...) GEN913: EQU $ BSR AGOTO WORD GEN313 < CAS DES POINTS (X,Y,Z) EXTERIEURS A LA < SURFACE... GEN902: EQU $ BSR AGOTO WORD GEN702 < CAS DU "DEPTH-CUEING" SEUL... GEN946: EQU $ BSR AGOTO WORD GEN972 < CAS OU IL N'Y A PAS D'OMBRES PORTEES... GEN21: EQU $ < < TEST DES OMBRES PORTEES : < IF EXIST-K,XEIF%,,XEIF% IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ IOMBRE < FAUT-IL LES OMBRES PORTEES ??? JE GEN946 < NON, ET 'FNIVEC' EST BON... < < OUI, CALCUL DES OMBRES PORTEES : < BSR AOMBRE < CALCUL DES OMBRES PORTEES DANS LE < PLAN 'Z'... GEN972: EQU $ IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST QUI SUIT EST IDIOT !!! XEIF%: VAL ENDIF #/FLD# FNIVMX < (A,B)=VALEUR MAXIMALE DE L'ECLAI- < RAGE AU CAS OU IL N'Y AURAIT PAS < DE "DEPTH-CUEING"... CPZ IECLDC < Y-A-T'IL DU "DEPTH-CUEING" AVEC L'ECLAI- < RAGE ??? JE GEN980 < NON... BSR APNIVC < OUI : < (A,B)=NIVEAU MAXIMAL D'ECLAIRAGE FONC- < DE LA COORDONNEE 'Z'. GEN980: EQU $ FMP FNIVEC < MODULATION PAR L'OMBRAGE EVENTUEL, #/FST# FNIVC < CE QUI DONNE LE NIVEAU MAXIMAL DE < L'ECLAIRAGE... < < CALCUL DE LA NORMALE EN (X,Y,Z) : < LA &ALIG < (A)=F(X,Y,Z). < < CALCUL DE LA NORMALE < AU POINT COURANT (X,Y,Z) : < < < NOTA : < LA SURFACE "FRACTALE" EST < DEFINIE A L'AIDE DE LA FONCTION < ALEATOIRE 'RDN(X,Y,Z)' CALCULEE < DANS LE MODULE 'FONCT' ; LES < POINTS DE LA SURFACE SONT DONC < LES POINTS (X,Y,Z) TELS QUE : < < RDN(X,Y,Z)=C, OU 'C' EST UNE CONSTANTE < DONNEE ('ICOUCH'). < < L'EQUATION DE LA SURFACE EN < IMPLICITE EST DONC : < < F(X,Y,Z)=RDN(X,Y,Z)-C=0, < < SA NORMALE EN CHAQUE POINT EST < DONC DEFINIE PAR LE VECTEUR DE < COORDONNEES : < < (DF/DX,DF/DY,DF/DZ). < < LES DERIVEES PARTIELLES VONT ETRE < APPROXIMEES PAR LES FORMULES SUI- < VANTES : < < DF/DX=(F(X,Y,Z)-F(X-P,Y,Z))/P, < DF/DY=(F(X,Y+P,Z)-F(X,Y,Z))/P, < DF/FZ=(F(X,Y,Z)-F(X,Y,Z-P))/P, < < CAR EN EFFET ON SUPPOSE UN ACCROIS- < SEMENT DE LA VARIABLE DE DERIVATION < EGAL A 'P'... < < SOIT, PAR DEFINITION DE 'F' : < < DF/DX=(RDN(X,Y,Z)-RDN(X-P,Y,Z))/P, < DF/DY=(RDN(X,Y+P,Z)-RDN(X,Y,Z))/P, < DF/DZ=(RDN(X,Y,Z)-RDN(X,Y,Z-P), < < ET, PAR CHANGEMENT D'ECHELLE (CE < QUI N'EST PAS GRAVE PUISQUE L'ON < "NORMALISERA" LA NORMALE) : < < DF/DX=RDN(X,Y,Z)-RDN(X-P,Y,Z), < DF/DY=RDN(X,Y+P,Z)-RDN(X,Y,Z), < DF/DZ=RDN(X,Y,Z)-RDN(X,Y,Z-P). < PSR X < SAUVEGARDE DE LA COORDONNEE 'X'... LB PASDER SBR B,X SB &ALIG < F(X,Y,Z)-F(X-P,Y,Z), PLR X < RESTAURATION DU 'X' COURANT... FLT #/FST# FXN < CE QUI DONNE LA PREMIERE COORDONNEE < DU VECTEUR NORMAL. LA &ALIGM < F(X,Y+P,Z), SB &ALIG < F(X,Y+P,Z)-F(X,Y,Z), FLT #/FST# FYN < CE QUI DONNE LA SECONDE COORDONNEE < DU VECTEUR NORMAL. PSR W < ET SAUVEGARDE DE LA COORDONNEE 'Z'... LB PASDER < PASSAGE AU PLAN PRECEDENT (Z-P), SBR B,W < Z-P, BSR AFONCT < RDN(X,Y,Z-P), FIX SB TCOUCH < F(X,Y,Z-P), PLR W < RESTAURATION DU 'Z' COURANT... SB &ALIG < F(X,Y,Z-P)-F(X,Y,Z), NGR A,A < F(X,Y,Z)-F(X,Y,Z-P), FLT #/FST# FZN < CE QUI DONNE LA TROISIEME COORDONNEE < DU VECTEUR NORMAL. BSR APVALN < ET TEST DE NON-NULLITE DE LA NORMALE... < < CALCUL DE L'ECLAIRAGE : < BSR AINTEN < CALCUL DE L'ECLAIRAGE AU POINT COURANT < EN FONCTION DE LA SOURCE LUMINEUSE... JMP GEN981 < ET VERS LE CALCUL DU NIVEAU ET LE < TRACE... < < CAS DU "DEPTH-CUEING" : < GEN702: EQU $ BSR APNIVC < (A,B)=NIVEAU A DONNER A TOUS LES POINTS < DE CE PLAN. < < CALCUL DU NIVEAU DE TRACE : < GEN981: EQU $ BSR APLIST < ET MISE DANS LISTN(X)... GEN313: EQU $ < < PASSAGE AU POINT SUIVANT : < GEN32: EQU $ ADRI -I,X < REGRESSION DE L'ABSCISSSE, LR X,A SB AXMIN CP PASDER < EST-ON EN DEBUT DE LIGNE ??? JL GEN31 < OUI, ON ABANDONNE... BSR AGOTO WORD GEN30 < NON, ON CONTINUE LE TRACE... GEN31: EQU $ < < < T R A C E D E L A L I G N E : < < LX VECTNC < (X)=ABSCISSE COURANTE... IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ IINTER < FAUT-IL INTERPOLER ??? JE GEN800 < NON, TRACE DIRECT DES NIVEAUX... < < CAS DE L'INTERPOLATION < ENTRE LES EXTREMITES DE < DROITE ET DE GAUCHE DE < CHAQUE SEGMENT HORIZONTAL : < STY VECGY1 < MISE EN PLACE STY VECGY2 < DE L'ORDONNEE COURANTE... GEN710: EQU $ LBY &ALISTN < (A)=NIVEAU(X,Y,Z) : JANE GEN711 < ON S'ARRETE SUR LE PREMIER NON NUL... ADRI -I,X < ON ELIMINE LES NULS PAR REGRESSION, GEN715: EQU $ LR X,A SB AXMIN CP PASDER < EST-ON EN DEBUT DE LIGNE ??? JGE GEN710 < NON, ON CONTINUE... JMP GEN712 < OUI, ON A TERMINE CETTE LIGNE... < < TRAITEMENT D'UN SEGMENT < HORIZONTAL : < GEN711: EQU $ FLT #/FST# INTEND < MEMORISATION DU NIVEAU "DROITE", IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ IINTMI < VRAIE OU FAUSSE INTERPOLATION ??? JE GEN802 < VRAIE... LA &ALIG < (A)=RDN(X,Y,Z) A "DROITE", STA FWORK < ET SAUVEGARDE... GEN802: EQU $ STX VECGX2 < ET DE L'ABSCISSE "DROITE"... GEN713: EQU $ IF NEXIST-K,,XEIF%, IF ATTENTION : LE TEST SUIVANT EST IDIOT !!! XEIF%: VAL ENDIF CPZ IINTMI < VRAIE OU FAUSSE INTERPOLATION ??? JE GEN804 < VRAIE... LA &ALIG < (A)=RDN(X,Y,Z), CP FWORK < EST-ON DANS UNE PHASE CROISSANTE DE LA < FONCTION RDN(X,Y,Z) ??? JLE GEN803 < NON, DECROISSANTE, 'EXTREM' EST BON < MAINTENANT, ET DONNE L'ABSCISSE DU < MAXIMUM... STX EXTREM < OUI, ON MEMORISE EN PERMANENCE L'ABSCISSE < AINSI, A LA FIN, 'EXTREM' DONNERA L'ABS- < CISSE DU MAXIMUM... STA FWORK < ET ON MEMORISE LE MAXIMUM COURANT AUSSI.. GEN803: EQU $ GEN804: EQU $ LBY &ALISTN < (A)=NIVEAU(X,Y,Z) ; ON FAIT AINSI (SANS < DECREMENTER 'X' AFIN DE PRENDRE EN < COMPTE LES SEGMENTS FAITS D'UN SEUL < POINT... JAE GEN714 < ON S'ARRETE EN FIN DE SEGMENT HORIZONTAL. FLT #/FST# INTENG < MEMORISATION DU NIVEAU "GAUCHE" COURANT, STX VECGX1 < ET DE L'ABSCISSE GAUCHE COURANTE... ADRI -I,X < ET REGRESSION DES ABSCISSES, LR X,A SB AXMIN CP PASDER < EST-ON EN DEBUT DE LIGNE ??? JGE GEN713 < NON, ON CONTINUE... GEN714: EQU $ < OUI, IL S'AGIT AUSSI D'UNE FIN DE SEG- < MENT HORIZONTAL... BSR ASEGH < ET ON TRACE PAR INTERPOLATION LE SEGMENT < HORIZONTAL COURANT... JMP GEN715 < VERS LA RECHERCHE D'UN EVENTUEL NOUVEAU < SEGMENT HORIZONTAL... < < CAS DU TRACE DIRECT (SANS < INTERPOLATION) DES NIVEAUX < CALCULES : < GEN800: EQU $ GEN801: EQU $ LBY &ALISTN < (A)=NIVEAU(X,Y,Z), BSR APOINT < QUE L'ON MARQUE... ADRI -I,X < PASSAGE AU POINT PRECEDENT, LR X,A SB AXMIN CP PASDER < S'IL EXISTE... JGE GEN801 < OUI... GEN712: EQU $ < OUI, C'EST LA FIN... < < "ROTATION" DES BUFFERS DE LIGNES : < GEN50: EQU $ LA ALIG XWOR%1: VAL $=FCTA XM ALIGM1 IF PASMAX-1,XEIF%,XEIF%, XM ALIGM2 IF PASMAX-2,XEIF%,XEIF%, XM ALIGM3 IF PASMAX-3,XEIF%,XEIF%, XM ALIGM4 IF PASMAX-4,XEIF%,XEIF%, XM ALIGM5 IF PASMAX-5,XEIF%,XEIF%, XM ALIGM6 IF PASMAX-6,XEIF%,XEIF%, XM ALIGM7 IF PASMAX-7,XEIF%,XEIF%, XM ALIGM8 XEIF%: VAL ENDIF XWOR%2: VAL $=FCTA IF XWOR%2-XWOR%1-PASMAX,,XEIF%, IF ATTENTION : INCOHERENCE !!! XEIF%: VAL ENDIF STA ALIG LA ALJG XWOR%1: VAL $=FCTA XM ALJGM1 IF PASMAX-1,XEIF%,XEIF%, XM ALJGM2 IF PASMAX-2,XEIF%,XEIF%, XM ALJGM3 IF PASMAX-3,XEIF%,XEIF%, XM ALJGM4 IF PASMAX-4,XEIF%,XEIF%, XM ALJGM5 IF PASMAX-5,XEIF%,XEIF%, XM ALJGM6 IF PASMAX-6,XEIF%,XEIF%, XM ALJGM7 IF PASMAX-7,XEIF%,XEIF%, XM ALJGM8 XEIF%: VAL ENDIF XWOR%2: VAL $=FCTA IF XWOR%2-XWOR%1-PASMAX,,XEIF%, IF ATTENTION : INCOHERENCE !!! XEIF%: VAL ENDIF STA ALJG < < < P O U R S U I T E D E L A G E N E R A T I O N : < < GEN20: EQU $ ADRI -I,Y < PASSAGE A LA LIGNE PRECEDENTE : LR Y,A CP AYMIN < EST-ON AU BOUT DE L'IMAGE ??? JL GEN40 < OUI, C'EST FINI... BSR AGOTO WORD GEN01 < NON... GEN40: EQU $ ADRI I,W < PASSAGE A LA COUCHE SUIVANTE : LR W,A CP NCOUCH < EST-ON AU BOUT DE NOS PEINES ??? JG GEN901 < OUI, C'EST FINI (IL DOIT ETRE BIEN < TARD...). BSR AGOTO WORD GEN900 < NON... GEN901: EQU $ BSR ATSFLO < < < E N T R Y A L T - M O D E : < < DEBUT5: EQU $ QUIT XXQUIT < A T T E N T E ... LRM C,L,K < ON REINITIALISE 'C', 'L' ET 'K' AU CAS < D'UNE RE-ENTREE PAR UN 'ALT-MODE'... WORD COM+DEPBAS < 'C', WORD LOC+DEPBAS < 'L', WORD STACK-DEPILE < 'K'. BSR AGOTO WORD DEBUT4 < (A)=ADRESSE D'ITERATION SUR ALT-MODE... PAGE < < < U P D A T E S : < < $EQU AMPLIR FLOAT 1.5 < AMPLIFICATEUR DE LA FONCTION. $EQU MOYENE FLOAT <NIV256/XXXMOY<K<K < VALEUR MOYENNE DE LA FONCTION. $EQU EXPOP0 FLOAT 0.5 < EXPOSANT DE DECROISSANCE DE PONDERATION. $EQU PASIX0 WORD 50 < PAS INITIAL SUR 'OX'. $EQU PASIY0 WORD 50 < PAS INITIAL SUR 'OY'. $EQU PASIZ0 WORD 50 < PAS INITIAL SUR 'OZ'. $EQU MRECUR WORD 1 < PROFONDEUR MAXIMALE DE RECURENCE. $EQU GRAINE WORD 4660 < GRAINE DU GENERATEUR ALEATOIRE. $EQU SUPRDN NTRN WORD XXN255/XXXMOY < SUP(RDN). TRN $EQU INFRDN NTRN WORD -XXN255/XXXMOY < INF(RDN). TRN $EQU MAXNIV WORD XXN255 < NIVEAU MAXIMAL AUTORISE... $EQU MINNIV WORD XXNOIR < NIVEAU MINIMAL AUTORISE... $EQU FXL FLOAT 1000 < X(SOURCE LUMINEUSE). $EQU FYL FLOAT 1000 < Y(SOURCE LUMINEUSE). $EQU FZL FLOAT 0 < Z(SOURCE LUMINEUSE). $EQU NPENOM WORD 8 < LARGEUR DES ZONES DE PENOMBRE. $EQU PASQ WORD W < PAS DE PARCOURS DE LA SPIRALE, $EQU NPM WORD 15 < NOMBRE DE POINTS DE CHAQUE SPIRALE. $EQU XCTCDA WORD TV1 < POUR ATTEINDRE L'IMAGE 'TV1'... $EQU PONRDN FLOAT <W<K<K < CONTRIBUTION DE LA GENERATION ALEATOIRE, $EQU PONSPI FLOAT <K<K<K < CONTRIBUTION DES SPIRALES. $EQU NCOUCH XWOR%1: VAL ZCOUCH-I WORD XWOR%1 < NOMBRE DE COUCHES VERTICALES (Z). $EQU SCOUCH WORD 208 < SEUIL DE DEFINITION DE LA SURFACE. $EQU ECOUCH WORD 1000 < DEFINITION DE L'EPAISSEUR DE LA SURFACE. < (+'SCOUCH'...) $EQU FCOUCH XWOR%2: VAL XWOR%1+I NTRN FLOAT <NIV256/XWOR%2<K<K TRN $EQU PASDER WORD PASMAX < PAS DE DERIVATION. $EQU TXGAUS XWOR%1: VAL XC512/XXXMOY WORD XWOR%1 < TRANSLATION DES COORDONNEES 'X', $EQU DXGAUS XWOR%2: VAL XWOR%1/XXXMOY FLOAT <XWOR%2*XWOR%2<NILK<NILK < NORMALISATEUR DE (X-TX)**2. $EQU TYGAUS XWOR%1: VAL XL512/XXXMOY WORD XWOR%1 < TRANSLATION DES COORDONNEES 'Y', $EQU DYGAUS XWOR%2: VAL XWOR%1/XXXMOY FLOAT <XWOR%2*XWOR%2<NILK<NILK < NORMALISATEUR DE (Y-TY)**2. $EQU TZGAUS XWOR%1: VAL ZCOUCH/XXXMOY WORD XWOR%1 < TRANSLATION DES COORDONNEES 'Z', $EQU DZGAUS XWOR%2: VAL XWOR%1/XXXMOY FLOAT <XWOR%2*XWOR%2<NILK<NILK < NORMALISATEUR DE (Z-TZ)**2. $EQU TRANMT FLOAT <K<K<K < TRANSLATION FONCTION BANDE. $EQU MULTMT FLOAT <W<K<K < ECHELLE FONCTION BANDE. $EQU FH FLOAT <K<K<K < "DEPTH-CUEING" MAXIMAL... PAGE < < < T A B L E D E S S Y M B O L E S : < < IF '00000000000@,XEIF%,,XEIF% EST XEIF%: VAL ENDIF DATE END DEBUT