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
Copyright © Jean-François COLONNA, 2022-2024.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2024.