DATE
         PROG
         TRN
<
< DEFINITIONS ARBITRAIRES POUR
< LA TAILLE DE LA LISTE DES NOEUDS :
<
XX::     VAL         32              < NOMBRE DE COLONNES.
YY::     VAL         2*29+1          < NOMBRE DE LIGNES.
                                     < (2 : CAR ON VA DE 2 EN 2,
                                     < 29 : AFIN D'AVOIR UN NOMBRE PAIR (29+1)
                                     <      DE BANDES, PUISQUE LES TRIANGLES
                                     <      SONT EN QUINCONCE...)
<
<
<        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  :
<
<
XXXIMA:  VAL         XUNDEF          < AFIN DE NE DEFINIR QUE LES 'XXIMA'...
         CALL        #SIP IMAGE 512#
XXXIMA:  VAL         XXIMA0          < DEFINITION DES CONSTANTES "IMAGES".
         CALL        #SIP IMAGE 512#
YYYIMA:  VAL         YYYIM1          < POUR ENVOYER SEQUENTIELLEMENT
                                     < (NIVEAU,X,Y) DANS 'STORP'...
<
<
<        D E F I N I T I O N   D E   L ' E S P A C E  :
<
<
DIMESP:: VAL         3               < ON TRAVAILLE DANS L'ESPACE EUCLIDIEN
                                     < A 3 DIMENSIONS...
         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
<
<
<        M E S S A G E S  :
<
<
         TABLE
<
<
<        L O C A L  :
<
<
         LOCAL
LOC:     EQU         $
<
< INDICATEURS DE CONTROLE
< DES GENERATIONS 'SGN' ET
< DES TRACES GRAPHIQUES :
<
ISGNFI:  WORD        EXIST           < GENERER ('EXIST') OU PAS ('NEXIST')
                                     < LES FACETTES "INTERNES".
ISGNFE:  WORD        EXIST           < GENERER ('EXIST') OU PAS ('NEXIST')
                                     < LES FACETTES "EXTERNES".
         IF          XOPT01-EXIST,XOPT1,,XOPT1
IWGFI:   WORD        EXIST           < TRACER ('EXIST') OU PAS ('NEXIST') LES
                                     < FACETTES "INTERNES".
IWGNFI:  WORD        EXIST           < TRACER ('EXIST') OU PAS ('NEXIST') LES
                                     < NORMALES AUX FACETTES "INTERNES".
IWGIFI:  WORD        EXIST           < TRACER ('EXIST') OU PAS ('NEXIST') LES
                                     < INTERSECTIONS DE LA DROITE 'D' ET DES
                                     < FACETTES "INTERNES".
IWGFE:   WORD        EXIST           < TRACER ('EXIST') OU PAS ('NEXIST') LES
                                     < FACETTES "EXTERNES".
IWGIFE:  WORD        EXIST           < TRACER ('EXIST') OU PAS ('NEXIST') LES
                                     < INTERSECTIONS DE LA DROITE 'D' ET DES
                                     < FACETTES "EXTERNES".
IWGIDS:  WORD        EXIST           < TRACER ('EXIST') OU PAS ('NEXIST') LES
                                     < INTERSECTIONS DE LA DROITE 'D' ET DE
                                     < LA SURFACE 'S'.
IWPRST:  WORD        EXIST           < TRACER ('EXIST') OU PAS ('NEXIST') LES
                                     < POINTS RASTER LORS DU BALAYAGE DE
                                     < L'ECRAN.
IWCONV:  WORD        EXIST           < TRACER ('EXIST') OU PAS ('NEXIST') LA
                                     < CONVERGENCE LORS DE LA RECHERCHE DE
                                     < L'INTERSECTION DE 'D' ET DE 'S'.
XOPT1:   VAL         ENDIF
IVSUR:   WORD        EXIST           < QUE DOIT-ON VISUALISER :
                                     < 'NEXIST' : UNIQUEMENT LES FACETTES PLANES
                                     < 'EXIST'  : LA SURFACE...
<
< NOM ET VALEUR COURANTE :
<
NMAIL:   ASCI        "X*"
LRMAIL:: VAL         $-NMAIL*NOCMO   < LONGUEUR DE LA RACINE DU NOM...
NMAIL1:  ASCI        "YYXX"
         BYTE        KEOT;K
LNMAIL:: VAL         $-NMAIL*NOCMO-W < LONGUEUR DU NOM DE LA MAILLE...
FVALS:   EQU         $
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-DIMESP,,XEIF%,
         IF          ATTENTION : INCOHERENCE DANS LES
         IF          DIMENSIONS DE L'ESPACE !!!
XEIF%:   VAL         ENDIF
XN:      FLOAT       <NILK<NILK<NILK < X(NORMALE AU NOEUD),
YN:      FLOAT       <NILK<NILK<NILK < Y(NORMALE AU NOEUD),
ZN:      FLOAT       <NILK<NILK<NILK < Z(NORMALE AU NOEUD).
VARU3D:  FLOAT       <NILK<NILK<NILK < COORDONNEE CURVILIGNE 'U',
VARV3D:  FLOAT       <NILK<NILK<NILK < COORDONNEE CURVILIGNE 'V'.
LMAIL::  VAL         $-NMAIL*NOCMO   < LONGUEUR TOTALE NOM+VALEUR DU NOEUD...
LVMAIL:: VAL         LMAIL-LNMAIL    < LONGUEUR DE LA VALEUR SEULE.
IDENT:   BYTE        NILK;NILK       < ENSEMBLE (I,J) REMPLACANT TOPOLOGIQUE-
                                     < MENT POUR CHAQUE NOEUD LE COUPLE (YR,XR)
                                     < RENVOYE DANS LE NOM...
LBUF4D:: VAL         $-CS3D          < LONGUEUR DU BLOC (FXS,FYS,FZS,NORMALE,
                                     <                   U,V,IDENT).
<
< DONNEES DE RECONSTITUTION
< DE SOUS-CATALOGUES 'SGN' :
<
ACATAL:  WORD        CATAL           < SOUS-PROGRAMME DE RECONSTITUTION DU
                                     < SOUS-CATALOGUE ARGUMENT.
APVAR:   WORD        NILK            < SOUS-PROGRAMME SPECIFIQUE A APPELER
                                     < POUR CHAQUE NOM RECUPERE.
ANOM:    WORD        NILK            < RELAI INDEXE VERS LE NOM COURANT.
DEMSGN:  BYTE        NILK;FAVW       < DEMANDE D'ACCES AU 'SGN' :
         WORD        NILK            < ADRESSE OCTET DU NOM COURANT.
         WORD        NILK            < LA LONGUEUR VARIE SUIVANT LE 'NVP'...
         WORD        FOLLOW
XRAC:    WORD        NILK            < NOMBRE DE CARACTERES DE LA RACINE
                                     < COURANTE DU CATALOGUE.
AGOSGN:  WORD        GOSGN           < SOUS-PROGRAMME D'ACCES AU 'SGN'...
<
< DONNEES DE CORRESPONDANCE (YR,XR) --> (I,J) :
<
NUMI:    WORD        NILK            < NUMERO DE LIGNE,
NUMJ:    WORD        NILK            < NUMERO DE COLONNE.
XR:      WORD        NILK            < 'XR' COURANT,
XRP:     WORD        NILK            < 'XR' ANTERIEUR.
YR:      WORD        NILK            < 'YR' COURANT,
YRP:     WORD        NILK            < 'YR' ANTERIEUR.
AMOCDN:  WORD        MOCD+N          < POUR INITIALISER 'YRP' ET 'XRP'...
                                     < (VALEUR IMPOSSIBLE POUR 'XR' ET 'YR')
IMAX::   VAL         YY              < VALEUR MAXIMALE (INACCESSIBLE) DE 'I'.
APLIGX:  WORD        PLIGX,X         < TABLE DES INDEX DE LIGNES DANS 'BUF'
                                     < POUR CHAQUE LIGNE 'I' MEMORISEE...
APLIGM:  WORD        PLIGM,X         < TABLE DES 'J' MAX POUR CHAQUE LIGNE
                                     < 'I' MEMORISEE.
<
< BUFFER DES NOEUDS :
<
XBUF:    WORD        NILK            < INDEX COURANT D'INSERTION,
                                     < N O T A :  'INDEX' SIGNIFIE EN FAIT PAR
                                     <            LA SUITE : ADRESSE PAR RAP-
                                     <            PORT A L'ORIGINE DE LA 'CDA'.
XBUFI0:  WORD        NILK            < XBUF(I,0), POUR 'SP3'...
XBUFMX:  WORD        XX*YY*LBUF4D    < VALEUR MAXIMALE DE L'INDEX 'XBUF'.
ABUF4D:  WORD        LBUF4D          < CONSTANTE MULTIPLICATIVE...
<
< RECONSTITUTION DES TRIANGLES :
<
ITORE:   WORD        K               < INDICATEUR DE "I-TORE" :
                                     < =K : NON,
                                     < #K : OUI, ON GERE UN "I-TORE"...
SAVEX0:  WORD        NILK            < XBUF(I,J),
SAVEX1:  WORD        NILK            < XBUF(I,J+2),
SAVEX2:  WORD        NILK            < XBUF(I+2,J+1),
SAVEX3:  WORD        NILK            < XBUF(I+2,J+1+2).
SNUMI:   WORD        NILK            < SAUVEGARDE DU 'I' DE LA LIGNE COURANTE.
ASP1:    WORD        SP1             < TRANSFERT D'UN NOEUD DE 'BUF' VERS
                                     < LE LOCAL ET PROJECTION 2D.
ASP2:    WORD        SP2             < TRACE D'UN VECTEUR ET CHAINAGE VERS
                                     < LE SUIVANT.
         IF          XOPT01-EXIST,XOPT1,,XOPT1
ASP2B:   WORD        SP2B            < IDENTIQUE A 'SP2', MAIS SANS L'APPEL
                                     < A 'SP1' A L'ENTREE...
ASP4:    WORD        SP4             < MISE EN PLACE DU PREMIER SOMMET D'UN
                                     < TRIANGLE, ET PLUS GENERALEMENT DE
                                     < L'ORIGINE D'UN VECTEUR.
ASP7:    WORD        SP7             < MISE EN PLACE DE L'EXTREMITE D'UN
                                     < VECTEUR.
ASP1E:   WORD        SP1E            < TRACE D'UNE FACETTE "EXTERNE"...
XOPT1:   VAL         ENDIF
ASP3:    WORD        SP3             < INCREMENTATION DE 'J' MODULO...
ASP5:    WORD        SP5             < INCREMENTATION DE 'I' SUIVANT "I-TORE".
XXXLOC:  VAL         YYYHIN          < 'YYYHIN'.
         CALL        #SIP UTILITAIRES#
XXXLOC:  VAL         YYYHEX          < 'YYYHEX'.
         CALL        #SIP UTILITAIRES#
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
< DONNEES DE VERIFICATION
< DES EQUATIONS DE PLAN :
<
ASPB:    WORD        SPB             < VERIFICATION DE L'APPARTENANCE DES 3
                                     < SOMMETS (A,B,C) AU PLAN 'P'.
ASPD:    WORD        SPD             < VERIFICATION DE L'APPARTENANCE DU POINT
                                     < 3D COURANT AU PLAN 'P'.
XOPT1:   VAL         ENDIF
<
< CALCUL DE LA VALEUR DE
< L'EQUATION D'UN PLAN EN
< LE POINT COURANT :
<
ASPC:    WORD        SPC             < CALCUL DE LA VALEUR DE L'EQUATION DU PLAN
                                     < (A,B,C) EN LE POINT COURANT 3D...
<
< DEFINITION D'UN SYSTEME
< LINEAIRE 3*3 :
<
FDETER:  FLOAT       <NILK<NILK<NILK < DETERMINANT D'UN SYSTEME 3*3...
MAT33:   EQU         $               < DEBUT DE LA MATRICE 3*3 :
M11:     FLOAT       <NILK<NILK<NILK
M12:     FLOAT       <NILK<NILK<NILK
M13:     FLOAT       <NILK<NILK<NILK
M14:     FLOAT       <NILK<NILK<NILK
M21:     FLOAT       <NILK<NILK<NILK
M22:     FLOAT       <NILK<NILK<NILK
M23:     FLOAT       <NILK<NILK<NILK
M24:     FLOAT       <NILK<NILK<NILK
M31:     FLOAT       <NILK<NILK<NILK
M32:     FLOAT       <NILK<NILK<NILK
M33:     FLOAT       <NILK<NILK<NILK
M34:     FLOAT       <NILK<NILK<NILK
LMAT33:: VAL         $-MAT33         < LONGUEUR D'UNE MATRICE 3*3 Y COMPRIS
                                     < LE VECTEUR COLONNE M(I,4), QUI SERA
                                     < PARFOIS VECTEUR DE TRANSLATION...
         IF          M12-M11-DFLOT,,XEIF%,
         IF          ATTENTION : 'M11' ET 'M12' DOIVENT ETRE CONTIGUS !!!
XEIF%:   VAL         ENDIF
         IF          M13-M12-DFLOT,,XEIF%,
         IF          ATTENTION : 'M12' ET 'M13' DOIVENT ETRE CONTIGUS !!!
XEIF%:   VAL         ENDIF
         IF          M22-M21-DFLOT,,XEIF%,
         IF          ATTENTION : 'M21' ET 'M22' DOIVENT ETRE CONTIGUS !!!
XEIF%:   VAL         ENDIF
         IF          M23-M22-DFLOT,,XEIF%,
         IF          ATTENTION : 'M22' ET 'M23' DOIVENT ETRE CONTIGUS !!!
XEIF%:   VAL         ENDIF
         IF          M32-M31-DFLOT,,XEIF%,
         IF          ATTENTION : 'M31' ET 'M32' DOIVENT ETRE CONTIGUS !!!
XEIF%:   VAL         ENDIF
         IF          M33-M32-DFLOT,,XEIF%,
         IF          ATTENTION : 'M32' ET 'M33' DOIVENT ETRE CONTIGUS !!!
XEIF%:   VAL         ENDIF
XXXLOC:  VAL         YYYDET          < 'YYYDET'.
         CALL        #SIP UTILITAIRES#
XXXLOC:  VAL         YYYCRA          < 'YYYCRA'.
         CALL        #SIP UTILITAIRES#
<
< DONNEES DE CALCUL D'UN
< PRODUIT SCALAIRE :
<
APRSCA:  WORD        PRSCA           < CE SOUS-PROGRAMME CALCULE LE PRODUIT
                                     < SCALAIRE DES 2 VECTEURS ARGUMENTS.
<
< DEFINITION D'UNE DROITE :
<
CD3D:    EQU         $               < POINT 'D' :
FXSD:    FLOAT       <NILK<NILK<NILK < X(POINT D),
FYSD:    FLOAT       <NILK<NILK<NILK < Y(POINT D),
FZSD:    FLOAT       <NILK<NILK<NILK < Z(POINT D).
DV3D:    EQU         $               < VECTEUR DIRECTEUR DE LA DROITE 'D' :
DVX:     FLOAT       <NILK<NILK<NILK < X(VECTEUR DIRECTEUR V),
DVY:     FLOAT       <NILK<NILK<NILK < Y(VECTEUR DIRECTEUR V),
DVZ:     FLOAT       <NILK<NILK<NILK < Z(VECTEUR DIRECTEUR V).
<
< DONNEES DU TRI DE
< TROIS NOMBRES :
<
ASPTRI:  WORD        SPTRI           < SOUS-PROGRAMME DE TRI DE TROIS NOMBRES
                                     < DONT ON SE DONNE LES ADRESSES.
<
< DONNEES D'INTERSECTION DE
< LA DROITE 'D' ET DE LA BOULE 'B' :
<
BINTER:  WORD        NILK            < (BINTER)='NEXIST' : SI LA DROITE 'D' NE
                                     <          COUPE PAS LA BOULE 'B',
                                     <         ='EXIST' : SI LA DROITE 'D' EST
                                     <          TANGENTE OU COUPE LA BOULE 'B'.
AINTDB:  WORD        INTDB           < CALCUL DE L'INTERSECTION DE 'D' ET 'B'.
<
< DONNEES POUR L'INTERSECTION DE
< LA DROITE 'D' ET DU PLAN 'P' :
<
PINTER:  WORD        NILK            < 'PINTER' N'A DE SENS QUE LORSQUE L'INDI-
                                     < CATEUR 'BINTER' VAUT 'EXIST', ET ALORS :
                                     < (PINTER)='NEXIST' SI AUCUN POINT D'INTER-
                                     <          SECTION ENTRE 'D' ET 'P' INTE-
                                     <          RIEUR A (A,B,C) N'A ETE TROUVE,
                                     < (PINTER)='EXIST', SINON, (FXSM,FYSM,FZSM)
                                     <          SONT SES COORDONNEES 3D, ET
                                     <          (ALPHA,BETA,GAMMA) SES COORDON-
                                     <          NEES BARYCENTRIQUES.
CM3D:    EQU         $               < POINT 'M' :
FXSM:    FLOAT       <NILK<NILK<NILK < X(POINT D'INTERSECTION M),
FYSM:    FLOAT       <NILK<NILK<NILK < Y(POINT D'INTERSECTION M),
FZSM:    FLOAT       <NILK<NILK<NILK < Z(POINT D'INTERSECTION M).
ALPHA:   FLOAT       <NILK<NILK<NILK < COORDONNEE BARYCENTRIQUE 1 DE M,
BETA:    FLOAT       <NILK<NILK<NILK < COORDONNEE BARYCENTRIQUE 2 DE M,
GAMMA:   FLOAT       <NILK<NILK<NILK < COORDONNEE BARYCENTRIQUE 3 DE M.
FRHOM:   FLOAT       <NILK<NILK<NILK < PARAMETRE DU POINT 'M' PAR RAPPORT AU
                                     < POINT 'D' SUR LA DROITE 'D'.
VARUM:   FLOAT       <NILK<NILK<NILK < COORDONNEE CURVILIGNE U(M),
VARVM:   FLOAT       <NILK<NILK<NILK < COORDONNEE CURVILIGNE V(M).
AINTDP:  WORD        INTDP           < CALCUL DE L'INTERSECTION DE 'D' ET 'P'.
APUVM:   WORD        PUVM            < CALCUL DE LA SOLUTION INITIALE LORS
                                     < DES ITERATIONS (VARUM,VARVM).
         IF          XOPT01-EXIST,XOPT1,,XOPT1
ASP8:    WORD        SP8             < TRACE DE CONTROLE DE (AM,BM,CM).
XOPT1:   VAL         ENDIF
<
< DONNEES POUR L'INTERSECTION DE
< LA DROITE 'D' ET DE LA SURFACE 'S' :
<
SINTER:  WORD        NILK            < 'SINTER' N'A DE SENS QUE LORSQUE L'INDI-
                                     < CATEUR 'BINTER' ET L'INDICATEUR 'PINTER'
                                     < VALENT TOUS DEUX 'EXIST', ET ALORS :
                                     < (SINTER)='NEXIST' : PAS DE POINT D'INTER-
                                     <          SECTION ENTRE 'D' ET 'S' A
                                     <          L'INTERIEUR DE LA FACETTE COU-
                                     <          RANTE,
                                     < (SINTER)='EXIST' : (FXS,FYS,FZS) EST UN
                                     <          POINT D'INTERSECTION ENTRE 'D'
                                     <          ET 'S' POUR LA FACETTE COURANTE.
DVARU:   FLOAT       <NILK<NILK<NILK < ACCROISSEMENT DE 'VARU',
DVARV:   FLOAT       <NILK<NILK<NILK < ACCROISSEMENT DE 'VARV',
DRHO:    FLOAT       <NILK<NILK<NILK < ACCROISSEMENT DE 'RHO'.
XWOR%3:  VAL         3               < AFIN DE DEFINIR 'FEPSUV' :
FEPSUV:  FLOAT       <W<K<-XWOR%3    < 'EPSILON' DE TEST DE CONVERGENCE DE LA
                                     < METHODE ITERATIVE DE RESOLUTION.
MAXCO1:: VAL         32              < NOMBRE MAXIMAL DE RELANCE DES ITERATIONS
                                     < SUR CONVERGENCE VERS UNE MAUVAISE
                                     < RACINE.
         IF          MAXCO1-K,,,XEIF%
         IF          ATTENTION : 'MAXCO1' EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
MAXCO2:: VAL         128             < LIMITE DU NOMBRE D'ITERATIONS DANS LA
                                     < RESOLUTION AVANT DE DECRETER LA NON-
                                     < CONVERGENCE...
         IF          MAXCO2-K,,,XEIF%
         IF          ATTENTION : 'MAXCO2' EST MAUVAIS !!!
XEIF%:   VAL         ENDIF
AINTDS:  WORD        INTDS           < SOUS-PROGRAMME CALCULANT L'INTERSECTION
                                     < ENTRE 'D' ET 'S' POUR LA FACETTE
                                     < "EXTERNE" COURANTE...
XWOR%1:  VAL         I+I             < FACTEUR D'EXTENSION DE LA NOTION DE
                                     < COORDONNEE BARYCENTRIQUE...
                                     < EN FAIT, (FBARI,FBARS) SONT CALCULES
                                     < DYNAMIQUEMENT EN FONCTION DE L'ANGLE
                                     < ENTRE LE PLAN 'P' DE LA FACETTE ET DE
                                     < LA DROITE 'D'...
FBARI:   FLOAT       <K-XWOR%1<K<K   < BORNE INFERIEURE DE DEFINITION DES
                                     < COORDONNEES BARYCENTRIQUES GENERALISEES,
FBARS:   FLOAT       <W+XWOR%1<K<K   < BORNE SUPERIEURE DE DEFINITION DES
                                     < COORDONNEES BARYCENTRIQUES GENERALISEES.
XNBARC:: VAL         XXXMOY*XXXMOY*XXXMOY*XXXMOY*XXXMOY*XXXMOY
                                     < POUR CALCULER 'FBARC'...
FBARC:   FLOAT       <XNBARC<K<K
                                     < CONSTANTE MULTIPLICATIVE DE CALCUL DE
                                     < (FBARI,FBARS) DANS 'INTDP'...
FREDUC:  FLOAT       <XXXMOY<K<K     < FACTEUR DE REDUCTION RELATIVEMENT ARBI-
                                     < TRAIRE, LORS DE LA RELANCE APRES UNE
                                     < CONVERGENCE VERS UNE MAUVAISE RACINE.
         IF          XOPT01-EXIST,XOPT1,,XOPT1
ASP8S:   WORD        SP8S            < MODULE DE VISUALISATION DE CETTE INTER-
                                     < SECTION...
XOPT1:   VAL         ENDIF
ATRIGU:  WORD        TRIGU           < DETERMINATION DE LA POSITION DU TRIANGLE
                                     < (A,B,C) DANS LE SEGMENT (MIN(U),MAX(U)).
ATRIGV:  WORD        TRIGV           < DETERMINATION DE LA POSITION DU TRIANGLE
                                     < (A,B,C) DANS LE SEGMENT (MIN(V),MAX(V)).
ASEGMU:  WORD        SEGMU           < DETERMINATION DE LA POSITION D'UN SEGMENT
                                     < (A,B), (B,C) OU (C,A) DANS LE SEGMENT
                                     < (MIN(U),MAX(U)).
ASEGMV:  WORD        SEGMV           < DETERMINATION DE LA POSITION D'UN SEGMENT
                                     < (A,B), (B,C) OU (C,A) DANS LE SEGMENT
                                     < (MIN(V),MAX(V)).
APERIU:  WORD        PERIU           < MISE DE 'VARU' DANS (MIL(U),MAX(U)).
APERIV:  WORD        PERIV           < MISE DE 'VARV' DANS (MIL(V),MAX(V)).
APSEGU:  WORD        PSEGU           < MISE DE 'VARU' DANS (MIN(U),MAX(U)).
APSEGV:  WORD        PSEGV           < MISE DE 'VARV' DANS (MIN(V),MAX(V)).
ALTORE:  WORD        LTORE,X         < RELAI INDEXE VERS UNE TABLE DONNANT DES
                                     < INFORMATIONS SUR L'ESPACE DES COORDON-
                                     < NEES CURVILIGNES (U,V), QUI EN GENERAL
                                     < EST UN TORE ; ON TROUVE :
                                     < ((MIN(U),MIL(U),MAX(U),PERIOD(U),EPS(U)),
                                     <  (MIN(V),MIL(V),MAX(V),PERIOD(V),EPS(V)))
FEPSTO:  FLOAT       <W<K<K
                                     < CONSTANTE MULTIPLICATIVE DE CALCUL DE
                                     < EPS(U) ET EPS(V) DANS 'INTDP'.
FPERSI:  FLOAT       <XXXMOY*XXXMOY*XXXMOY<K<K
                                     < CONSTANTE MULTIPLICATIVE PERMETTANT DE
                                     < PERTURBER LA SOLUTION INITIALE 'M' EN
                                     < 'MP' LE LONG DE LA PROJECTION DE 'D'
                                     < SUR 'P'.
<
< DONNEES DE GENERATION DES
< SPHERES :
<
ASPHER:  WORD        SPHERE          < SOUS-PROGRAMME DE GENERATION DE LA BOULE
                                     < MINIMALE CIRCONSCRITE A UNE FACETTE.
<
< DONNEES DE CALCUL DES
< PLANS DE TYPE 'P2' :
<
FPRMIX:  FLOAT       <NILK<NILK<NILK < PRODUIT MIXTE DE 3 VECTEURS.
FMODUL:  FLOAT       <NILK<NILK<NILK < MODULE AU CARRE D'UN VECTEUR.
<
< DONNEES DE CALCUL DES POINTS
< 'MAB', 'MBC', 'MCA' ET 'MABC' :
<
ASP1F:   WORD        SP1F            < SOUS-PROGRAMME DE NORMALISATION DU
                                     < VECTEUR LIGNE (M11,M12,M13).
<
< DONNEES DE GENERATION DES
< FACETTES "EXTERNES" :
<
AFACE:   WORD        FACE            < DETERMINATION DES 6 FACETTES "EXTERNES"
                                     < ASSOCIEES A LA FACETTE "INTERNE" (A,B,C).
                                     < (FACETTE COURANTE...)
<
< COORDONNEES DES POINTS
< DU TYPE 'MAB' :
<
CAB3D:   EQU         $               < POINT 'MAB' :
FXSAB:   FLOAT       <NILK<NILK<NILK < X(MAB),
FYSAB:   FLOAT       <NILK<NILK<NILK < Y(MAB),
FZSAB:   FLOAT       <NILK<NILK<NILK < Z(MAB).
<
< COORDONNEES DES POINTS
< DU TYPE 'MBC' :
<
CBC3D:   EQU         $               < POINT 'MBC' :
FXSBC:   FLOAT       <NILK<NILK<NILK < X(MBC),
FYSBC:   FLOAT       <NILK<NILK<NILK < Y(MBC),
FZSBC:   FLOAT       <NILK<NILK<NILK < Z(MBC).
<
< COORDONNEES DES POINTS
< DU TYPE 'MCA' :
<
CCA3D:   EQU         $               < POINT 'MCA' :
FXSCA:   FLOAT       <NILK<NILK<NILK < X(MCA),
FYSCA:   FLOAT       <NILK<NILK<NILK < Y(MCA),
FZSCA:   FLOAT       <NILK<NILK<NILK < Z(MCA).
<
< COORDONNEES DES POINTS
< DU TYPE 'MABC' :
<
CABC3D:  EQU         $               < POINT 'MABC' :
FXSABC:  FLOAT       <NILK<NILK<NILK < X(MABC),
FYSABC:  FLOAT       <NILK<NILK<NILK < Y(MABC),
FZSABC:  FLOAT       <NILK<NILK<NILK < Z(MABC).
<
< DONNEES DE CONVERGENCE
< HEURISTIQUE :
<
VARU0:   EQU         FXSAB           < COORDONNEE 'U' CALCULEE AU DEBUT DE
                                     < 'INTDS' PAR PERTURBATION DE CELLE FOUR-
                                     < NIE PAR 'INTDP',
VARV0:   EQU         FYSAB           < COORDONNEE 'V' CALCULEE AU DEBUT DE
                                     < 'INTDS' PAR PERTURBATION DE CELLE FOUR-
                                     < NIE PAR 'INTDP'.
<
< DONNEES DE LA PROJECTION :
<
FACT:    FLOAT       <NILK<NILK<NILK < FACTEUR D'ECHELLE...
PZ:      FLOAT       <NILK<NILK<NILK < POSITION DU POINT DE VUE SUR L'AXE OZ,
                                     < QUI EST DEVANT L'ECRAN...
TRX:     WORD        NILK            < TRANSLATION DU
TRY:     WORD        NILK            <                TRACE (VISU ET RASTER).
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,
LBUFGR:: VAL         LBUF2D+LBUF2D   < ET POUR UN VECTEUR.
APROJ:   WORD        PROJ            < SOUS-PROGRAMME DE PROJECTION 3D --> 2D...
<
< POUR LES TESTS DE COHERENCE :
<
ALIGNE:  WORD        LIGNE,X         < RELAI VERS UNE LIGNE RASTER, CONTENANT,
                                     < 'X' ETANT LA COORDONNE 'X' COURANTE
                                     < RASTER : SUR (0,X-1) : LA LIGNE COURANTE,
                                     <          SUR (X,511) : LA LIGNE PRECEDEN-
                                     <                        TE (Y-1).
NSEUIL:  WORD        NILK            < SEUIL INDIQUANT LE "GAP" MAXIMAL ENTRE
                                     < LE NIVEAU DU POINT COURANT ET CELUI DE
                                     < SES VOISINS (DE GAUCHE ET DU DESSOUS)
                                     < TEL QUE LA CONVERGENCE SOIT COHERENTE.
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
< DONNEES DE TRACE DE LA
< NORMALE A UN PLAN :
<
FACTN:   FLOAT       <NILK<NILK<NILK < FACTEUR D'ECHELLE DE LA NORMALE (CE QUI
                                     < DONNE D'AILLEURS SA LONGUEUR...).
ASP6:    WORD        SP6             < SOUS-PROGRAMME DE TRACE D'UN VECTEUR
                                     < COLINEAIRE AU VECTEUR NORMAL EN 'G' LE
                                     < BARYCENTRE D'UN FACETTE.
XOPT1:   VAL         ENDIF
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
< DONNEES DE TRACE DES COOR-
< DONNEES BARYCENTRIQUES :
<
FEPS:    EQU         FEPSUV          < 'EPSILON' POUR TESTER LA VALEUR DES
                                     < (ALPHA,BETA,GAMMA) PAR RAPPORT AUX
                                     < COORDONNEES (XM,YM,ZM) DEJA CONNUES...
ASP9:    WORD        SP9             < SOUS-PROGRAMME DE MISE EN PLACE DES
                                     < SOMMETS (A,B,C) PUIS DE TRACE DES
                                     < VECTEURS (AM,BM,CM)...
ASPA:    WORD        SPA             < TRACE D'UNE ETOILE (AM,BM,CM).
XOPT1:   VAL         ENDIF
XXXLOC:  VAL         YYYCCI          < 'YYYCCI'.
         CALL        #SIP UTILITAIRES#
<
< SOUS-PROGRAMMES DIVERS :
<
AMOVE3:  WORD        MOVE3           < SOUS-PROGRAMME EFFECTUANT UN 'MOVE' DE
                                     < 3 ('LBUF3D') MOTS, DE (A) VERS (B)...
<
< DONNEES DE CLEAR ET D'INDETER-
< MINATION D'UN VECTEUR NORMAL :
<
IDENTX:  BYTE        MOCD;MOCD       < IDENTIFICATEUR TOPOLOGIQUE D'UN POINT
                                     < N'APPARTENANT PAS AU MAILLAGE DE BASE
                                     < DE LA SURFACE ("X*"), MAIS AUX POINTS
                                     < CALCULES POUR LES FACETTES "EXTERNES"...
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
< DONNEES DU TRACE GRAPHIQUE :
<
BUFGR:   EQU         $
BUFGR1:  DZS         LBUF2D          < ORIGINE D'UN VECTEUR,
BUFGR2:  DZS         LBUF2D          < ET EXTREMITE.
DEMOG:   BYTE        NVPOUT;FAVOG    < MISE EN GRAPHIQUE DE LA VISU.
DEMCG:   BYTE        NVPOUT;FAVCG    < RETOUR EN ALPHA-NUMERIQUE DE LA VISU.
DEMWG:   BYTE        NVPOUT;FAVWG    < ECRITURE GRAPHIQUE D'UN VECTEUR.
         WORD        BUFGR=FCTA*NOCMO
         WORD        LBUFGR*NOCMO
DEMWD0:  BYTE        NVPOUT;FAVWD    < DEMANDE DE MISE EN MODE NORMAL...
         BYTE        KESC;'60;KEOT
DEMWD1:  BYTE        NVPOUT;FAVWD    < DEMANDE DE MISE EN POINTILLES...
         BYTE        KESC;'61;KEOT
DEMWD2:  BYTE        NVPOUT;FAVWD    < DEMANDE DE MISE EN TIRETES...
         BYTE        KESC;'63;KEOT
XOPT1:   VAL         ENDIF
<
< SUITE DES DONNEES DE CLEAR
< ET D'INDETERMINATION D'UN
< VECTEUR NORMAL (ZONE INAC-
< CESSIBLE DU 'LOCAL') :
<
NX3D:    EQU         $               < VECTEUR NORMAL INDETERMINE...
         DO          LBUF3D/DFLOT
         FLOAT       <K<K<K          < REMISE A 0 FLOTTANTE...
<
< DEMANDE DE TEMPORISATION
< APRES EFFACEMENT :
<
TEMPO:   BYTE        NVPSER;FONDOR
         WORD        NILK            < INUTILE...
         WORD        XXXMOY          < 2 PETITES SECONDES...
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
< DEMANDE D'EFFACEMENT
< DE L'ECRAN DE LA VISU :
<
DEMERA:  BYTE        NVPOUT;FAVER    < DEMANDE D'EFFACEMENT DE L'ECRAN DE LA
                                     < VISU DE DIALOGUE.
XOPT1:   VAL         ENDIF
         PAGE
<
<
<        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'...
<
< CONSTANTES FLOTTANTES DE BASE :
<
F0:      FLOAT       <K<K<K          < REMISE A ZERO FLOTTANTE...
F1:      FLOAT       <W<K<K          < L'UNITE EN FLOTTANT...
F3:      FLOAT       <W+W+W<K<K      < NOMBRE DE SOMMETS D'UN TRIANGLE...
XXXLOC:  VAL         YYYFLO          < 'YYYFLO'.
         CALL        #SIP UTILITAIRES#
APWORK:  EQU         APFWOR          < POUR LA COMPATIBILITE AVEC LES OVERLAYS
                                     < DE " +" (CF. 'SIO...').
<
< DONNEES DE TEST D'UNDER-
< FLOW FLOTTANT PREVISIBLE :
<
AFLEPS:  WORD        FLEPS           < CE SOUS-PROGRAMME TESTE LES NOMBRES
                                     < FLOTTANTS EN VALEUR ABSOLUE VOISINS
                                     < DU PLUS PETIT RECONNE...
XXXLOC:  VAL         YYYGOT          < 'YYYGOT'.
         CALL        #SIP UTILITAIRES#
<
< VARIABLES DE TRAVAIL :
<
FWORK1:  FLOAT       <NILK<NILK<NILK
FWORK2:  FLOAT       <NILK<NILK<NILK
<
<
<        D E F I N I T I O N   D E S   F A C E T T E S  :
<
<
IDEGEN:  WORD        NEXIST          < INDICATEUR DE DEGENERESCENCE DES
                                     < FACETTES :
                                     < 'NEXIST' : FACETTE COURANTE DEGENEREE,
                                     < 'EXIST'  : FACETTE COURANTE=VRAI TRIAN-
                                     <            GLE (A,B,C).
NFACET:  ASCI        "X/"            < NOM DES FACETTES "X/YYXX"...
         IF          $-NFACET*NOCMO-LRMAIL,,XEIF%,
         IF          ATTENTION : 'GCATAL' VA MERDER EN PASSANT DE LA RECU-
         IF          PERATION DES NOEUDS A CELLE DES FACETTES !!!
XEIF%:   VAL         ENDIF
NFACE1:  ASCI        "YYXX"          < DESTINE A CONTENIR L'INDICE TOPOLOGIQUE.
NFACE2:  BYTE        "Z";KEOT
LNFACE:: VAL         $-NFACET*NOCMO
                                     < LONGUEUR DU NOM D'UNE FACETTE...
FAC:     EQU         $               < DEBUT DE LA FACETTE :
CF3D:    EQU         $               < DEBUT DE LA LISTE DES SOMMETS :
CA3D:    EQU         $               < SOMMET 'A' :
FXSA:    FLOAT       <NILK<NILK<NILK < XA,
FYSA:    FLOAT       <NILK<NILK<NILK < YA,
FZSA:    FLOAT       <NILK<NILK<NILK < ZA.
NA3D:    EQU         $               < VECTEUR NORMAL EN 'A' :
XNA:     FLOAT       <NILK<NILK<NILK < XN(A),
YNA:     FLOAT       <NILK<NILK<NILK < YN(A),
ZNA:     FLOAT       <NILK<NILK<NILK < ZN(A).
VARUA:   FLOAT       <NILK<NILK<NILK < UA,
VARVA:   FLOAT       <NILK<NILK<NILK < VA.
IDENTA:  BYTE        NILK;NILK       < IDENTA.
CB3D:    EQU         $               < SOMMET 'B' :
FXSB:    FLOAT       <NILK<NILK<NILK < XB,
FYSB:    FLOAT       <NILK<NILK<NILK < YB,
FZSB:    FLOAT       <NILK<NILK<NILK < ZB.
NB3D:    EQU         $               < VECTEUR NORMAL EN 'B' :
XNB:     FLOAT       <NILK<NILK<NILK < XN(B),
YNB:     FLOAT       <NILK<NILK<NILK < YN(B),
ZNB:     FLOAT       <NILK<NILK<NILK < ZN(B).
VARUB:   FLOAT       <NILK<NILK<NILK < UB,
VARVB:   FLOAT       <NILK<NILK<NILK < VB.
IDENTB:  BYTE        NILK;NILK       < IDENTB.
CC3D:    EQU         $               < SOMMET 'C' :
FXSC:    FLOAT       <NILK<NILK<NILK < XC,
FYSC:    FLOAT       <NILK<NILK<NILK < YC,
FZSC:    FLOAT       <NILK<NILK<NILK < ZC.
NC3D:    EQU         $               < VECTEUR NORMAL EN 'C' :
XNC:     FLOAT       <NILK<NILK<NILK < XN(C),
YNC:     FLOAT       <NILK<NILK<NILK < YN(C),
ZNC:     FLOAT       <NILK<NILK<NILK < ZN(C).
VARUC:   FLOAT       <NILK<NILK<NILK < UC,
VARVC:   FLOAT       <NILK<NILK<NILK < VC.
IDENTC:  BYTE        NILK;NILK       < IDENTC.
PLAN3D:  EQU         $               < DEFINITION DU PLAN DE LA FACETTE :
PLANA:   FLOAT       <NILK<NILK<NILK < A=XN,
PLANB:   FLOAT       <NILK<NILK<NILK < B=YN,
PLANC:   FLOAT       <NILK<NILK<NILK < C=ZN,
PLAND:   FLOAT       <NILK<NILK<NILK < D.
CO3D:    EQU         $               < CENTRE 'O' DE LA BOULE CIRCONSCRITE :
FXSO:    FLOAT       <NILK<NILK<NILK < XO,
FYSO:    FLOAT       <NILK<NILK<NILK < YO,
FZSO:    FLOAT       <NILK<NILK<NILK < ZO,
FRAYO:   FLOAT       <NILK<NILK<NILK < CARRE DU RAYON DE LA BOULE (R**2).
XITYPE:: VAL         EXIST           < TYPE "FACETTE INTERNE",
XETYPE:: VAL         NEXIST          < TYPE "FACETTE EXTERNE".
         IF          XITYPE-XETYPE,XEIF%,,XEIF%
         IF          ATTENTION : ON NE POURRA PAS DISCRIMINER
         IF          LES FACETTES INTERNES DES FACETTES EXTERNES !!!
XEIF%:   VAL         ENDIF
FTYPE:   WORD        NILK            < TYPE 'XITYPE'/'XETYPE' DE LA FACETTE.
XNOCTA:: VAL         BIT>DIMESP      < NOMBRE D'OCTANTS DANS L'ESPACE A 3
                                     < DIMENSIONS...
FOCTA:   WORD        NILK            < CE MOT CONTIENT UNE VALEUR NUMERIQUE
                                     < DANS (K,XNOCTA*DFLOT-DFLOT), QUI PERMET
                                     < DE CONNAITRE LA DIRECTION DU VECTEUR
                                     < NORMAL (PLANA,PLANB,PLANC) DU PLAN, ET
                                     < QUI EST UTILISE DANS LE PROCESSUS
                                     < HEURISTIQUE DE CONVERGENCE.
LFAC::   VAL         $-FAC           < LONGUEUR EN MOTS DES DONNEES DECRIVANT
                                     < UNE FACETTE...
LFACET:: VAL         $-NFACET*NOCMO  < LONGUEUR TOTALE NOM+VALEUR D'UNE FACETTE.
<
< GENERATION DES FACETTES :
<
FIDENT:  BYTE        NILK;NILK       < IDENTIFICATEUR DE LA FACETTE COURANTE...
ASP1A:   WORD        SP1A            < GENERATION DE 'A', ET DU NOM DE (A,B,C).
ASP1B:   WORD        SP1B            < GENERATION DE 'B'.
ASP1C:   WORD        SP1C            < GENERATION DE 'C' ET DE LA FACETTE A
                                     < CONDITION QU'ELLE NE SOIT PAS DEGENEREE.
ASP1D:   WORD        SP1D            < SOUS-PROGRAMME D'ENVOI D'UNE FACETTE
                                     < AU 'SGN'...
<
< DONNEES DE CALCUL DE
< QUELQUES DISTANCES :
<
DAMAB:   FLOAT       <NILK<NILK<NILK < D(A,MAB),
DMABB:   FLOAT       <NILK<NILK<NILK < D(MAB,B),
DAMABB:  FLOAT       <NILK<NILK<NILK < D(A,MAB)+D(MAB,B).
DA:      FLOAT       <NILK<NILK<NILK < D(A,MABC),
DB:      FLOAT       <NILK<NILK<NILK < D(B,MABC),
DC:      FLOAT       <NILK<NILK<NILK < D(C,MABC),
DBDC:    FLOAT       <NILK<NILK<NILK < D(B,MABC)*D(C,MABC),
DCDA:    FLOAT       <NILK<NILK<NILK < D(C,MABC)*D(A,MABC),
DADB:    FLOAT       <NILK<NILK<NILK < D(A,MABC)*D(B,MABC),
DADBDC:  FLOAT       <NILK<NILK<NILK < D(B,MABC)*D(C,MABC)+
                                     < D(C,MABC)*D(A,MABC)+
                                     < D(A,MABC)+D(B,MABC).
<
< COORDONNEES CURVILIGNES 'U' ET 'V' :
<
VARUVW:  EQU         $               < LISTE ORDONNEE DES COORDONNEES (U,V) :
VARU:    FLOAT       <NILK<NILK<NILK < COORDONNEE CURVILIGNE 'U',
XVARU::  VAL         $-VARUVW-DFLOT  < INDEX COORDONNEE U.
VARV:    FLOAT       <NILK<NILK<NILK < COORDONNEE CURVILIGNE 'V'.
XVARV::  VAL         $-VARUVW-DFLOT  < INDEX COORDONNEE V.
XLASTX:: VAL         $-VARUVW-DFLOT  < DERNIER INDEX, POUR VALIDATION...
LVARUV:: VAL         $-VARUVW        < LONGUEUR DE LA ZONE (VARU,VARV)...
AVAR:    WORD        VARUVW,X        < RELAI D'ACCES AUX COORDONNEES.
FRHO:    FLOAT       <NILK<NILK<NILK < ABSCISSE COURANTE D'UN POINT SUR LA
                                     < DROITE 'D'...
<
< CONSTANTES DE DERIVATION :
<
XWOR%1:  VAL         W               < PARTIE ENTIERE,
XWOR%2:  VAL         K               < PARTIE DECIMALE,
XWOR%3:  VAL         2               < VALEUR ABSOLUE DE L'EXPOSANT,
FHU:     FLOAT       <XWOR%1<XWOR%2<-XWOR%3
                                     < PAS DE DERIVATION NUMERIQUE PAR RAPPORT
                                     < A 'U',
FHV:     FLOAT       <XWOR%1<XWOR%2+I<-XWOR%3
                                     < ET PAR RAPPORT A 'V' ; ON NOTERA QUE
                                     < (FHU)#(FHV)...
F2H:     FLOAT       <NILK<NILK<NILK < EN FAIT, 'F2H' EST RECALCULEE A CHAQUE
                                     < APPEL DE 'ADERIV'...
<
< SOUS PROGRAMMES DE CALCUL
< DE (X(U,V),Y(U,V),Z(U,V))
< ET DE DERIVATION NUMERIQUE :
<
ASPX:    WORD        SPX             < CALCUL
ASPY:    WORD        SPY             <        DIRECT
ASPZ:    WORD        SPZ             <               DE LA FONCTION.
SPXYZ:   EQU         $               < LISTE ORDONNEE SOUS-PROGRAMMES (X,Y,Z) :
ASPXP:   WORD        SPXP            < SOUS-PROGRAMME DE CALCUL DE X(U,V),
XSPX::   VAL         $-SPXYZ-D       < INDEX DE X(U,V).
ASPYP:   WORD        SPYP            < SOUS-PROGRAMME DE CALCUL DE Y(U,V),
XSPY::   VAL         $-SPXYZ-D       < INDEX DE Y(U,V).
ASPZP:   WORD        SPZP            < SOUS-PROGRAMME DE CALCUL DE Z(U,V),
XSPZ::   VAL         $-SPXYZ-D       < INDEX DE Z(U,V).
ASPXYZ:  WORD        SPXYZ,X         < RELAI VERS LES SOUS-PROGRAMMES...
ADERIP:  WORD        DERIP           < SOUS-PROGRAMME DE DERIVATION DU PREMIER
                                     < ORDRE EN 'U' OU 'V'.
<
< CONSTANTES DE CALCUL DES SINUS ET COSINUS :
<
ASIN:    WORD        SIN             < S/P DE CALCUL DU SINUS,
ACOS:    WORD        COS             < ET DU COSINUS.
SCWOR1:  FLOAT       <NILK<NILK<NILK
SCWOR2:  FLOAT       <NILK<NILK<NILK
ISIGSC:  WORD        NILK            < SIGNE...
DEUXPI:  FLOAT       6.2831853       < 2 PI
PI3141:  FLOAT       3.1415926       < PI
PISUR2:  FLOAT       1.5707963       < PI/2
POLSC1:  FLOAT       -0.6459636      < COEFFICIENTS
POLSC2:  FLOAT       0.7968969E-1    <              DU
POLSC3:  FLOAT       -0.4673766E-2   <                 POLYNOME
POLSC4:  FLOAT       0.1514842E-3    <                          SIN(X)/COS(X).
XXXIMA:  VAL         XXIMA2          < DEFINITION DES DONNEES DE L'IMAGE 512...
         CALL        #SIP IMAGE 512#
<
< CONSTANTES DE TRAVAIL ACCESSIBLES
< AU SOUS-PROGRAMME SPECIFIQUE PAR
< INDEXATION DOUBLE-MOT :
<
FK:      FLOAT       <W<K<K          < PAR COMPATIBILITE AVEC " +"...
NCT::    VAL         48+5-4          < NOMBRE DE CONSTANTES DE TRAVAIL.
ACT:     WORD        CT,X            < RELAI D'ACCES A LA LISTE DES CONSTANTES.
ASPCT:   WORD        SPCT            < SOUS-PROGRAMME COMMUN D'ACCES.
<
< DEFINITION D'UNE MATRICE DE
< TRANSFORMATION 3*3 :
<
<        (M(I,1),(MI,2),M(I,3)) EST UN VECTEUR LIGNE POUR PRODUIT SCALAIRE,
<        M(I,4) EST UNE CONSTANTE DE TRANSLATION.
<
MT11::   VAL         M11-MAT33
MT12::   VAL         M12-MAT33
MT13::   VAL         M13-MAT33
MT14::   VAL         M14-MAT33
MT21::   VAL         M21-MAT33
MT22::   VAL         M22-MAT33
MT23::   VAL         M23-MAT33
MT24::   VAL         M24-MAT33
MT31::   VAL         M31-MAT33
MT32::   VAL         M32-MAT33
MT33::   VAL         M33-MAT33
MT34::   VAL         M34-MAT33
         IF          MT12-MT11-DFLOT,,XEIF%,
         IF          ATTENTION : 'MT11' ET 'MT12' DOIVENT ETRE CONTIGUS !!!
XEIF%:   VAL         ENDIF
         IF          MT13-MT12-DFLOT,,XEIF%,
         IF          ATTENTION : 'MT12' ET 'MT13' DOIVENT ETRE CONTIGUS !!!
XEIF%:   VAL         ENDIF
         IF          MT22-MT21-DFLOT,,XEIF%,
         IF          ATTENTION : 'MT21' ET 'MT22' DOIVENT ETRE CONTIGUS !!!
XEIF%:   VAL         ENDIF
         IF          MT23-MT22-DFLOT,,XEIF%,
         IF          ATTENTION : 'MT22' ET 'MT23' DOIVENT ETRE CONTIGUS !!!
XEIF%:   VAL         ENDIF
         IF          MT32-MT31-DFLOT,,XEIF%,
         IF          ATTENTION : 'MT31' ET 'MT32' DOIVENT ETRE CONTIGUS !!!
XEIF%:   VAL         ENDIF
         IF          MT33-MT32-DFLOT,,XEIF%,
         IF          ATTENTION : 'MT32' ET 'MT33' DOIVENT ETRE CONTIGUS !!!
XEIF%:   VAL         ENDIF
AMTRAN:  WORD        MTRAN,X         < RELAI D'ACCES A LA MATRICE...
<
<
<        Z O N E   D E   S A U V E G A R D E   D E
<        L A   F A C E T T E   " I N T E R N E "
<                    C O U R A N T E  :
<
<
<
< RELAIS VERS LES INFOR-
< MATIONS UTILES DE LA
< FACETTE SAUVEGARDEE ; ON
< ACCEDE CES INFORMATIONS
< PAR UN RELAI AFIN DE NE
< PAS METTRE LA ZONE DE
< SAUVEGARDE DANS LE 'COM-
< MON' ADRESSABLE, ET AINSI
< PERDRE DES MOTS INUTI-
< LISES...
<
AFXSAS:  WORD        FXSAS           < RELAI VERS 'XAS',
AFYSAS:  WORD        FYSAS           < RELAI VERS 'YAS',
AFZSAS:  WORD        FZSAS           < RELAI VERS 'ZAS',
AVRUAS:  WORD        VARUAS          < RELAI VERS 'UAS',
AVRVAS:  WORD        VARVAS          < RELAI VERS 'VAS',
AIDNAS:  WORD        IDENAS          < RELAI VERS 'IDENAS'.
AFXSBS:  WORD        FXSBS           < RELAI VERS 'XBS',
AFYSBS:  WORD        FYSBS           < RELAI VERS 'YBS',
AFZSBS:  WORD        FZSBS           < RELAI VERS 'ZBS',
AVRUBS:  WORD        VARUBS          < RELAI VERS 'UBS',
AVRVBS:  WORD        VARVBS          < RELAI VERS 'VBS',
AIDNBS:  WORD        IDENBS          < RELAI VERS 'IDENBS'.
AFXSCS:  WORD        FXSCS           < RELAI VERS 'XCS',
AFYSCS:  WORD        FYSCS           < RELAI VERS 'YCS',
AFZSCS:  WORD        FZSCS           < RELAI VERS 'ZCS',
AVRUCS:  WORD        VARUCS          < RELAI VERS 'UCS',
AVRVCS:  WORD        VARVCS          < RELAI VERS 'VCS',
AIDNCS:  WORD        IDENCS          < RELAI VERS 'IDENCS'.
<
< ZONE DE SAUVEGARDE :
<
FACS:    EQU         $               < DEBUT DE LA FACETTE :
         DZS         LFAC            < ET RESERVATION DE L'ESPACE DE SAVE...
CF3DS:   EQU         CF3D-FAC+FACS   < DEBUT DE LA LISTE DES SOMMETS :
CA3DS:   EQU         CA3D-FAC+FACS   < SOMMET 'A' :
FXSAS:   EQU         FXSA-FAC+FACS   < XA,
FYSAS:   EQU         FYSA-FAC+FACS   < YA,
FZSAS:   EQU         FZSA-FAC+FACS   < ZA.
NA3DS:   EQU         NA3D-FAC+FACS   < VECTEUR NORMAL EN 'A' :
XNAS:    EQU         XNA-FAC+FACS    < XN(A),
YNAS:    EQU         YNA-FAC+FACS    < YN(A),
ZNAS:    EQU         ZNA-FAC+FACS    < ZN(A).
VARUAS:  EQU         VARUA-FAC+FACS  < UA,
VARVAS:  EQU         VARVA-FAC+FACS  < VA.
IDENAS:  EQU         IDENTA-FAC+FACS < IDENTA.
CB3DS:   EQU         CB3D-FAC+FACS   < SOMMET 'B' :
FXSBS:   EQU         FXSB-FAC+FACS   < XB,
FYSBS:   EQU         FYSB-FAC+FACS   < YB,
FZSBS:   EQU         FZSB-FAC+FACS   < ZB.
NB3DS:   EQU         NB3D-FAC+FACS   < VECTEUR NORMAL EN 'B' :
XNBS:    EQU         XNB-FAC+FACS    < XN(B),
YNBS:    EQU         YNB-FAC+FACS    < YN(B),
ZNBS:    EQU         ZNB-FAC+FACS    < ZN(B).
VARUBS:  EQU         VARUB-FAC+FACS  < UB,
VARVBS:  EQU         VARVB-FAC+FACS  < VB.
IDENBS:  EQU         IDENTB-FAC+FACS < IDENTB.
CC3DS:   EQU         CC3D-FAC+FACS   < SOMMET 'C' :
FXSCS:   EQU         FXSC-FAC+FACS   < XC,
FYSCS:   EQU         FYSC-FAC+FACS   < YC,
FZSCS:   EQU         FZSC-FAC+FACS   < ZC.
NC3DS:   EQU         NC3D-FAC+FACS   < VECTEUR NORMAL EN 'C' :
XNCS:    EQU         XNC-FAC+FACS    < XN(C),
YNCS:    EQU         YNC-FAC+FACS    < YN(C),
ZNCS:    EQU         ZNC-FAC+FACS    < ZN(C).
VARUCS:  EQU         VARUC-FAC+FACS  < UC,
VARVCS:  EQU         VARVC-FAC+FACS  < VC.
IDENCS:  EQU         IDENTC-FAC+FACS < IDENTC.
PLAN3S:  EQU         PLAN3D-FAC+FACS < DEFINITION DU PLAN :
PLANAS:  EQU         PLANA-FAC+FACS  < A=XN,
PLANBS:  EQU         PLANB-FAC+FACS  < B=YN,
PLANCS:  EQU         PLANC-FAC+FACS  < C=ZN,
PLANDS:  EQU         PLAND-FAC+FACS  < D.
CO3DS:   EQU         CO3D-FAC+FACS   < CENTRE 'O' DE LA BOULE CIRCONSCRITE :
FXSOS:   EQU         FXSO-FAC+FACS   < XO,
FYSOS:   EQU         FYSO-FAC+FACS   < YO,
FZSOS:   EQU         FZSO-FAC+FACS   < ZO,
FRAYOS:  EQU         FRAYO-FAC+FACS  < CARRE DU RAYON DE LA BOULE (R**2).
FTYPES:  EQU         FTYPE-FAC+FACS  < TYPE "INTERNE"/"EXTERNE" DE LA FACETTE.
FOCTAS:  EQU         FOCTA-FAC+FACS  < OCTANT DU VECTEUR NORMAL.
LFACES:: VAL         LFAC            < LONGUEUR EN MOTS DE LA ZONE DE SAUVE-
                                     < GARDE DE LA FACETTE "INTERNE"...
<
< DEMANDES DE GENERATION
< DES FACETTES (NON ADRES-
< SABLES PAR LA BASE 'C') :
<
DEMDFA:  BYTE        COSBT?XASSIM=FMASK(K?NVPDLN=FCINST;FAVW
                                     < DESTRUCTION D'UNE FACETTE.
         WORD        NFACET=FCTA*NOCMO
         WORD        LNFACE
         WORD        FOLLOW
DEMSFA:  BYTE        COSBT?XASSIM=FMASK(K?NVPSTN=FCINST;FAVW
                                     < GENERATION D'UNE FACETTE.
         WORD        NFACET=FCTA*NOCMO
         WORD        LFACET
         WORD        FOLLOW
         PAGE
<
<
<        L I S T E   D E S   C O N S T A N T E S
<        I N I T I A L I S E E S   A   L ' U N I T E  :
<
<
CT:      EQU         $               < LISTE DES CONSTANTES :
         DO          NCT
         FLOAT       <W<K<K
         PAGE
<
<
<        M A T R I C E   D E   T R A N S F O R M A T I O N
<        I N I T I A L I S E E   A   L ' U N I T E  :
<
<
MTRAN:   EQU         $
         FLOAT       <W<K<K          < MT11,
         FLOAT       <K<K<K          < MT12,
         FLOAT       <K<K<K          < MT13,
         FLOAT       <K<K<K          < MT14,
         FLOAT       <K<K<K          < MT21,
         FLOAT       <W<K<K          < MT22,
         FLOAT       <K<K<K          < MT23,
         FLOAT       <K<K<K          < MT24,
         FLOAT       <K<K<K          < MT31,
         FLOAT       <K<K<K          < MT32,
         FLOAT       <W<K<K          < MT33,
         FLOAT       <K<K<K          < MT34,
         IF          $-MTRAN-LMAT33,,XEIF%,
         IF          ATTENTION : INCOHERENCE DANS LA LONGUEUR
         IF          DES MATRICES 3*3 !!!
XEIF%:   VAL         ENDIF
         PAGE
<
<
<        T A B L E   D E   D E F I N I T I O N   D E   L ' E S P A C E
<        D E S   C O O R D O N N E S   C U R V I L I G N E S   ( U , V )  :
<
<
<        FONCTION :
<                      L'ESPACE DES COORDONNEES CURVI-
<                    LIGNES EST EN GENERAL UN TORE QUE
<                    L'ON DEFINIT ICI, EN DONNANT POUR
<                    CHACUNE DES COORDONNEES 'U' ET 'V',
<                    LE SEGMENT DE DEFINITION (MIN,MAX),
<                    LE MILIEUR 'MIL' DE SON SEGMENT
<                    DE DEFINITION, LE MAXIMUM 'MAX'
<                    DU SEGMENT DE DEFINITION, ET LA
<                    PERIODE 'PER', AINSI QU'UN
<                    'EPS' FONCTION DE LA "TAILLE"
<                    DE LA FACETTE COURANTE, ET
<                    DESTINE AUX TESTS DE CONVER-
<                    GENCE...
<                      ENFIN, ON TROUVE DES DONNEES
<                    PERMETTANT UNE AMELIORATION
<                    HEURISTIQUE DANS LE CHOIX DES
<                    SOLUTIONS INITIALES (U0,V0) :
<                    D'UNE PART (XHEURU,XHEURV) QUI
<                    SONT DES CONSTANTES MULTIPLICA-
<                    TIVES DE L'ERREUR ENTRE LA SOLU-
<                    TION REELLE (U,V) ET LA SOLUTION
<                    INTIALE (U0,V0), ET D'AUTRE PART
<                    CES ERREURS COURANTES (1 PAR OC-
<                    TANT)...
<
<
LTORE:   EQU         $
XMINU::  VAL         $-LTORE         < MIN(U),
         FLOAT       <NILK<NILK<NILK
XMILU::  VAL         $-LTORE         < MIL(U),
         FLOAT       <NILK<NILK<NILK
XMAXU::  VAL         $-LTORE         < MAX(U),
         FLOAT       <NILK<NILK<NILK
XPERU::  VAL         $-LTORE         < PERIOD(U),
         FLOAT       <NILK<NILK<NILK
XEPSU::  VAL         $-LTORE         < EPS(U),
         FLOAT       <NILK<NILK<NILK
XHEURU:: VAL         $-LTORE         < MULTIPLICATEUR DE (U-U0),
         FLOAT       <K<W+W<K
XEPSU0:: VAL         $-LTORE         < EPS(U0) PAR OCTANT.
         DO          XNOCTA
         FLOAT       <NILK<NILK<NILK
XMINV::  VAL         $-LTORE         < MIN(V),
         FLOAT       <NILK<NILK<NILK
XMILV::  VAL         $-LTORE         < MIL(V),
         FLOAT       <NILK<NILK<NILK
XMAXV::  VAL         $-LTORE         < MAX(V),
         FLOAT       <NILK<NILK<NILK
XPERV::  VAL         $-LTORE         < PERIOD(V),
         FLOAT       <NILK<NILK<NILK
XEPSV::  VAL         $-LTORE         < EPS(V),
         FLOAT       <NILK<NILK<NILK
XHEURV:: VAL         $-LTORE         < MULTIPLICATEUR DE (V-V0),
         FLOAT       <K<W+W<K
XEPSV0:: VAL         $-LTORE         < EPS(V0) PAR OCTANT.
         DO          XNOCTA
         FLOAT       <NILK<NILK<NILK
         PAGE
<
<
<        P I L E   D E   T R A V A I L  :
<
<
STACK:   EQU         $
         DZS         64
         PROG
XXXPRO:  VAL         YYYCCI          < 'YYYCCI'.
         CALL        #SIP UTILITAIRES#
XXXIMA:  VAL         XXIMA3          < DEFINITION DES PROGRAMMES IMAGE 512...
         CALL        #SIP IMAGE 512#
         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
         PAGE
<
<
<        M O V E   D E   ' L B U F 3 D '   M O T S  :
<
<
<        ARGUMENTS :
<                    (A)=ADRESSE DE L'EMETTEUR,
<                    (B)=ADRESSE DU RECEPTEUR.
<
<
<        RESULTAT :
<                    (X)=K...
<
<
MOVE3:   EQU         $
         LXI         LBUF3D          < (X)=NOMBRE DE MOTS A DEPLACER,
         MOVE                        < ET DEPLACEMENT DE (A) VERS (B)...
         RSR                         < THAT'S ALL FOLK...
XXXPRO:  VAL         YYYHIN          < 'YYYHIN'.
         CALL        #SIP UTILITAIRES#
XXXPRO:  VAL         YYYHEX          < 'YYYHEX'.
         CALL        #SIP UTILITAIRES#
XXXPRO:  VAL         YYYGOT          < 'YYYGOT'.
         CALL        #SIP UTILITAIRES#
         PAGE
<
<
<        A P P E L   D U   ' S G N '  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME PERMET
<                    D'APPELER LE 'SGN' POUR
<                    CONNAITRE SOIT LE SUIVANT
<                    SERIE, SOIT LE SUIVANT PA-
<                    RALLELE DE LA CHAINE DE CA-
<                    RACTERES COURANTE.
<
<
<        ARGUMENT :
<                    (A)='NVPLON', 'NVPNXS' OU 'NVPNXP',
<                    (X)=INDEX DU CARACTERE COURANT,
<                    (Y)=LONGUEUR EN OCTETS DE LA VALEUR SEULE.
<
<
<        RESULTAT :
<                    (A)=CODES D'ERREUR EVENTUELS.
<
<
GOSGN:   EQU         $
<
< INITIALISATIONS :
<
         PSR         X               < SAUVEGARDE DE L'INDEX COURANT...
         STBY        DEMSGN+NVPFON   < MISE EN PLACE DU 'NVP' CHOISI...
<
< VALIDATIONS :
<
         CPZR        X
         JGE         GOSGN1          < OK...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E...
GOSGN1:  EQU         $
<
< ACCES AU 'SGN' :
<
         CPI         COSBT?XASSIM=FMASK(K?NVPLON=FCINST
         JNE         GOSGN2          < CE N'EST PAS 'LON'...
         LR          Y,A             < CAS DE 'LON', ON MET ON PLACE LA LONGUEUR
                                     < NOM+VALEUR...
         CPI         LVMAIL          < EST-CE UN NOEUD ???
         LAI         LMAIL
         JE          GOSGN3          < OUI, ON PREND 'LMAIL'...
         LR          Y,A             < NON,
         CPI         LFAC*NOCMO      < EST-CE UNE FACETTE ???
         LAI         LFACET
         JE          GOSGN3          < OUI, ON PREND 'LFACET'...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
         JMP         GOSGN3
GOSGN2:  EQU         $               < CAS DE 'NXP' ET 'NXS' :
         LR          X,A             < ON CALCULE LA LONGUEUR DE LA CHAINE
         ADRI        Z,A             < COURANTE...
GOSGN3:  EQU         $
         STA         DEMSGN+COESC    < MISE EN PLACE DE LA LONGUEUR
                                     < COURANTE.
         LAD         DEMSGN
         SVC                         < APPEL DU 'SGN'.
<
< ET RETOUR :
<
         LR          X,A             < A=CONDITIONS DE RETOUR.
         PLR         X               < RESTAURE X COURANT.
         RSR
         PAGE
<
<
<        P R O J E C T I O N   3 D   -->   2 D  :
<
<
<        ARGUMENT :
<                    (FXS,FYS,FZS)=POINT 3D.
<
<
<        RESULTAT :
<                    (XS,YS)=POINT 2D PROJETE SUIVANT 'IPROJ'.
<
<
PROJ:    EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B             < SAUVEGARDES...
         #/FLD#      FZS
<
< PROJECTION PERSPECTIVE SUR 'OX' :
<
         FDV         PZ
         BSR         ATSFLO
         FSB         F1
         BSR         AFNEG
         BSR         ASFWOR          < 1-(FZS/PZ)
         BSR         AFCAZ
         JNE         EOK3            < OK, 1-(FZS/PZ)#0...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
EOK3:    EQU         $
         #/FLD#      FXS
         FDV         FWORK           < FXS/(1-(FZS/PZ))
         BSR         ATSFLO
<
< CALCUL DE 'XS' :
<
         FMP         FACT            < MISE A L'ECHELLE 2D...
         BSR         AROND
         AD          TRX             < TRANSLATION 2D...
         STA         XS
<
< PROJECTION PERSPECTIVE SUR 'OY' :
<
         #/FLD#      FYS
         FDV         FWORK           < FYS/(1-(FZS/PZ))
         BSR         ATSFLO
<
< CALCUL DE 'YS' :
<
         FMP         FACT            < MISE A L'ECHELLE 2D...
         BSR         AROND
         AD          TRY             < TRANSLATION 2D...
         STA         YS
<
< SORTIE :
<
         PLR         A,B             < RESTAURATIONS...
         RSR
XXXPRO:  VAL         YYYFLO          < 'YYYFLO'.
         CALL        #SIP UTILITAIRES#
         PAGE
<
<
<        R E C U P E R A T I O N   D ' U N   P O I N T   3 D  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME RECUPERE
<                    DANS 'BUF' UN POINT TRI-DIMENSIONNEL
<                    ET ENSUITE LE PROJETTE.
<
<
<        ARGUMENT :
<                    (X)='XBUF' DU POINT A RECUPERER.
<
<
SP1:     EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
<
< RECUPERATION DU POINT COURANT :
<
         LAD         CS3D
         LR          A,B
         LR          X,A
         LXI         LBUF4D
         RCDA
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
< PROJECTION 3D --> 2D :
<
         BSR         APROJ
XOPT1:   VAL         ENDIF
<
< ET RETOUR :
<
         PLR         A,B,X
         RSR
         PAGE
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
<
<        M I S E   E N   P L A C E   D U   P R E M I E R
<        S O M M E T   D ' U N   T R I A N G L E
<        E T   P L U S   G E N E R A L E M E N T
<        D E   L ' O R I G I N E   D ' U N   V E C T E U R  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME INSERE
<                    DANS LA LISTE D'EDITION
<                    GRAPHIQUE 'BUFGR' LE PREMIER
<                    SOMMET D'UN TRIANGLE.
<
<
SP4:     EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
<
< TRANSFERT 2D --> 'BUFGR' :
<
         LRM         A,B,X
         WORD        CS2D
         WORD        BUFGR1
         WORD        LBUF2D
         MOVE                        < MISE EN PLACE DE L'ORIGINE.
<
< ET RETOUR :
<
         PLR         A,B,X
         RSR
XOPT1:   VAL         ENDIF
         PAGE
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
<
<        I N S E R T I O N   D E   L ' E X T R E M I T E
<                    D ' U N   V E C T E U R  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME INSERE
<                    DANS LA LISTE D'EDITION
<                    GRAPHIQUE 'BUFGR' L'EXTRE-
<                    MITE D'UN VECTEUR.
<
<
SP7:     EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
<
< TRANSFERT 2D --> 'BUFGR' :
<
         LRM         A,B,X
         WORD        CS2D
         WORD        BUFGR2
         WORD        LBUF2D
         MOVE                        < LE POINT 2D COURANT DEVIENT L'EXTREMITE
                                     < DU COTE COURANT DU TRIANGLE COURANT...
<
< ET RETOUR :
<
         PLR         A,B,X
         RSR
XOPT1:   VAL         ENDIF
         PAGE
<
<
<        T R A C E   D ' U N   C O T E   D ' U N   T R I A N G L E
<                    E T   C H A I N A G E  :
<
<
<        FONCTION :
<                      CE MODULE RECUPERE L'EXTREMITE
<                    COURANTE DU COTE COURANT DU
<                    TRIANGLE COURANT, PUIS L'INSERE
<                    DANS LA LISTE GRAPHIQUE 'BUFGR',
<                    EDITE CE COTE ; PUIS, ENFIN,
<                    CHAINE, C'EST-A-DIRE QU'IL
<                    FAIT DE L'EXTREMITE COURANTE
<                    LA FUTURE ORIGINE...
<
<
<        F A C E T T E S   " I N T E R N E S "  :
<
<
SP2:     EQU         $               < ENTRY 1 :
<
< INITIALISATIONS :
<
         BSR         ASP1            < RECUPERATION DE L'EXTREMITE...
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         PSR         A,B,X
<
< MISE EN PLACE DE L'EXTREMITE :
<
         BSR         ASP7            < LE POINT 2D COURANT DEVIENT L'EXTREMITE
                                     < DU COTE COURANT DU TRIANGLE COURANT...
<
< TRACE DU COTE COURANT :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IWGFI           < TRACE-T'ON LES FACETTES "INTERNES" ???
                                     < (POUR LES FACETTES "EXTERNES" VOIR LE
                                     < SOUS-PROGRAMME 'SP1E'...)
         JE          E200            < NON...
E240:    EQU         $               < CAS DES FACETTES "EXTERNES"...
         LAD         DEMWG
         SVC                         < TRACE DU VECTEUR CONTENU DANS 'BUFGR'.
E200:    EQU         $
<
< CHAINAGE : EXTREMITE --> ORIGINE :
<
         LRM         A,B,X
         WORD        BUFGR2
         WORD        BUFGR1
         WORD        LBUF2D
         MOVE                        < ET CHAINAGE...
<
< ET RETOUR :
<
         PLR         A,B,X
XOPT1:   VAL         ENDIF
         RSR
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
<
<        F A C E T T E S   " E X T E R N E S "  :
<
<
SP2B:    EQU         $               < ENTRY 2 :
<
< INITIALISATIONS :
<
         PSR         A,B,X
<
< MISE EN PLACE DE L'EXTREMITE :
<
         BSR         ASP7            < LE POINT 2D COURANT DEVIENT L'EXTREMITE
                                     < DU COTE COURANT DU TRIANGLE COURANT...
         JMP         E240            < VERS LE TRACE...
XOPT1:   VAL         ENDIF
         PAGE
<
<
<        I N C R E M E N T A T I O N   M O D U L O   D E   ' J '  :
<
<
<        ARGUMENTS :
<                    (W)='J' COURANT,
<                    (X)=INCREMENT DE 'J',
<                    (B)='J' MAX SUR LA LIGNE COURANTE 'I',
<                    XBUFI0=XBUF(I,0).
<
<
<        RESULTAT :
<                    (W)=NOUVELLE VALEUR DE 'J',
<                    (X)=XBUF(I,J), OU 'J' REPRESENTE LE NOUVEAU 'J'...
<
<
SP3:     EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B
<
< INCREMENTATION MODULO DE 'J' :
<
         ADR         X,W             < PASSAGE A J+1 OU J+2,
         CPR         B,W             < GESTION MODULO, CAR ON EST SUR UN J-TORE,
         JLE         SP31            < (W) <= (B) : DONC ON N'EST PAS REVENU
                                     < EN DEBUT DE LIGNE...
         SBR         B,W             < ET CALCUL DE 'W'
         ADRI        -Z,W            <                  MODULO (B)+Z...
SP31:    EQU         $
<
< CALCUL DE XBUF(I,J) :
<
         LR          W,A             < J+2,
         MP          ABUF4D
         LX          XBUFI0          < (X)=XBUF(I,0), OU XBUF(I+2,0)...
         ADR         B,X             < (X)=XBUF(I,J+2), OU XBUF(I+2,J+2)...
<
< ET RETOUR :
<
         PLR         A,B
         RSR
         PAGE
<
<
<        I N C R E M E N T A T I O N   M O D U L O   D E   ' I '  :
<
<
<        ARGUMENT :
<                    (X)='I' COURANT.
<
<
<        RESULTAT :
<                    (X)='I' INCREMENTE MODULO (NUMI)+Z.
<
<
SP5:     EQU         $
<
< INITIALISATIONS :
<
         PSR         A
<
< INCREMENTATION DE 'I' :
<
PASI::   VAL         W+W             < PAS DE 'I'.
         ADRI        PASI,X          < INCREMENTATION DE 'I',
         LR          X,A
         CP          NUMI            < ET CALCUL MODULO (NUMI)+Z :
         JLE         SP51            < (X) <= (NUMI)...
I0::     VAL         K               < NUMERO DE LA PREMIERE LIGNE...
         LXI         I0              < (X) > (NUMI)...
SP51:    EQU         $
<
< ET RETOUR :
<
         PLR         A
         RSR
         PAGE
<
<
<        G E N E R A T I O N   D U   S O M M E T   ' A '  :
<
<
<        FONCTION :
<                      CE MODULE, GENERE LE PREMIER
<                    SOMMET ('A') D'UNE FACETTE ; PUIS
<                    IL PREPARE LE NOM DE LA FACETTE
<                    A PARTIR DE L'INDICE TOPOLOGIQUE
<                    'IDENT' DE 'A'.
<
<
SP1A:    EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
<
< GENERATION DE 'A' :
<
         LRM         A,B,X
         WORD        CS3D            < (A)=POINT 3D COURANT,
         WORD        CA3D            < (B)=SOMMET 'A',
         WORD        LBUF4D          < (X)=NOMBRE DE MOTS A DEPLACER,
         MOVE                        < GENERATION DE 'A'...
<
< PREPARATION DU NOM DE LA FACETTE :
<
PASJ::   VAL         W+W             < PAS DE 'J'.
XWOR%1:  VAL         NBITMO-B
XWOR%2:  VAL         CORBT?XWOR%1=FMASK(K?PASJ=FCINST
         IF          PASJ-XWOR%2,,XEIF%,
         IF          ATTENTION : 'PASJ' EST TEL QUE LES 'IDENT'
         IF          SUCCESSIFS NE PEUVENT TOUS ETRE PAIRS !!!
XEIF%:   VAL         ENDIF
         LBY         IDENT           < (A)=INDICE TOPOLOGIQUE DE 'A',
                                     <     (DONT ON NE GARDE QUE 'I')
         SLRS        PASJ=K          < ET ON PROCEDE A UNE REDUCTION...
         JNC         SP1A1           < OK...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
SP1A1:   EQU         $
         STBY        FIDENT          < QUI DEVIENT CELUI DE LA FACETTE...
                                     < LA PARTIE 'J' SERA INCREMENTEE APRES
                                     < LA GENERATION DE LA FACETTE COURANTE...
         LAD         NFACE1          < (A)=ADRESSE DU BUFFER DE GENERATION,
         LB          FIDENT          < (B)=IDENTIFICATEUR DE LA FACETTE,
         LXI         K               < (X)=INDEX DU PREMIER CARACTERE,
         BSR         AHEXEX          < ET GENERATION DU NOM "X/YYXX"...
<
< ET RETOUR :
<
         PLR         A,B,X
         RSR
         PAGE
<
<
<        G E N E R A T I O N   D U   S O M M E T   ' B '  :
<
<
<        FONCTION :
<                      CE MODULE, GENERE LE SECOND
<                    SOMMET ('B') D'UNE FACETTE.
<
<
SP1B:    EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
<
< GENERATION DE 'B' :
<
         LRM         A,B,X
         WORD        CS3D            < (A)=POINT 3D COURANT,
         WORD        CB3D            < (B)=SOMMET 'B',
         WORD        LBUF4D          < (X)=NOMBRE DE MOTS A DEPLACER,
         MOVE                        < GENERATION DE 'B'...
<
< ET RETOUR :
<
         PLR         A,B,X
         RSR
         PAGE
<
<
<        G E N E R A T I O N   D U   S O M M E T   ' C '
<        E T   D E S   F A C E T T E S   A S S O C I E E S  :
<
<
<        FONCTION :
<                      CE MODULE GENERE LE TROISIEME
<                    SOMMET ('C') D'UNE FACETTE ; EN-
<                    SUITE, SI LE TRIANGLE N'EST PAS
<                    DEGENERE (REDUIT A UN SEGMENT, OU
<                    A UN POINT), IL GENERE LES FACETTES
<                    AUX 3 POINTS 'A', 'B' ET 'C'.
<                      EN UTILISANT UNE TERMINOLOGIE
<                    PROPRE AUX SURFACES CONVEXES, IL
<                    GENERE 2 TYPES DE FACETTES :
<
<                    1 - UNE FACETTE "INTERNE" (OU "INS-
<                    SCRITE") : IL S'AGIT EN FAIT DU
<                    TRIANGLE (A,B,C) ; ELLE EST DITE
<                    "INTERNE", CAR EN EFFET, SI LE
<                    POLYHEDRE EST CONVEXE, (A,B,C) SE
<                    TROUVE A L'INTERIEUR.
<
<                    2 - SIX FACETTES "EXTERNES" (OU
<                    "CIRCONSCRITES") : EN EFFET LES
<                    FACETTES "INTERNES", SI LE POLY-
<                    HEDRE EST UNE APPROXIMATION D'UNE
<                    SURFACE, NE SUFFISENT PAS A CALCULER
<                    LES INTERSECTIONS DE CELLES-CI AVEC
<                    UNE DROITE QUELCONQUE, PUISQUE DES
<                    POINTS DE L'ESPACE 3D APPARTIENNENT
<                    A L'INTERIEUR DE LA SURFACE, TOUT EN
<                    ETANT EXTERIEURS AU POLYHEDRE... ON
<                    DOIT DONC RAJOUTER UNE COUVERTURE
<                    "EXTERNE" A LA SURFACE DE LA FACON
<                    SUIVANTE :
<                    * ON CONSIDERE LES 3 PLANS TANGENTS
<                    A LA SURFACE EN 'A', 'B' ET 'C', ET
<                    DONC DE VECTEURS NORMAUX RESPECTIFS
<                    'NA', 'NB' ET 'NC' : SOIT PTA, PTB
<                    ET PTC CES 3 PLANS TANGENTS.
<                    * SOIENT LES 3 DROITES D'INTERSECTION
<                    DES PLANS TANGENTS 2 A 2 :
<                                    DAB=PTA.INTER.PTB,
<                                    DBC=PTB.INTER.PTC,
<                                    DCA=PTC.INTER.PTA.
<                    * SOIENT ENSUITE LES 3 PLANS SUIVANTS :
<                                    P1AB : AB.E.P1AB, P1AB//DAB,
<                                    P1BC : BC.E.P1BC, P1BC//DBC,
<                                    P1CA : CA.E.P1CA, P1CA//DCA.
<                                    (OU .E. EXPRIME L'APPARTENANCE)
<                    * SOIENT ENFIN LES 3 PLANS :
<                                    P2AB : AB.E.P2AB, P2AB.T.P1AB,
<                                    P2BC : BC.E.P2BC, P2BC.T.P1BC,
<                                    P2CA : CA.E.P2CA, P2CA.T.P1CA.
<                                    (OU .T. EXPRIME L'ORTHOGONALITE)
<                    * ON CALCULE ALORS LES 4 POINTS SUIVANTS :
<                                    MAB=PTA.INTER.PTB.INTER.P2AB,
<                                    MBC=PTB.INTER.PTC.INTER.P2BC,
<                                    MCA=PTC.INTER.PTA.INTER.P2CA,
<                                    MABC=PTA.INTER.PTB.INTER.PTC.
<                    * LES 6 FACETTES "EXTERNES" SONT ALORS :
<                                    (A,MAB,MABC),
<                                    (MAB,B,MABC),
<                                    (B,MBC,MABC),
<                                    (MBC,C,MABC),
<                                    (C,MCA,MABC),
<                                    (MCA,A,MABC).
<                      ON NOTERA QUE CES 6 FACETTES
<                    "EXTERNES" SONT TOUTES TANGENTES
<                    A LA SURFACE, ET DONC ORTHOGONALES
<                    AUX VECTEURS 'NA', 'NB' ET 'NC'.
<
<
<        RESULTAT :
<                    IDEGEN='NEXIST' SI LA FACETTE EST DEGENEREE,
<                          ='EXIST' SI ELLE EST UN VRAI TRIANGLE.
<
<
SP1C:    EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE 'STZ' QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         STZ         IDEGEN          < A PRIORI, LA FACETTE SERA DEGENEREE...
<
< GENERATION DE 'C' :
<
         LRM         A,B,X
         WORD        CS3D            < (A)=POINT 3D COURANT,
         WORD        CC3D            < (B)=SOMMET 'C',
         WORD        LBUF4D          < (X)=NOMBRE DE MOTS A DEPLACER.
         MOVE                        < ET GENERATION DE 'C'...
<
< TEST DE DEGENERESCENCE DE (A,B,C) :
<
         #/FLD#      FXSA
         FCAM        FXSB
         JNE         SP1C1           < A#B...
         #/FLD#      FYSA
         FCAM        FYSB
         JNE         SP1C1           < A#B...
         #/FLD#      FZSA
         FCAM        FZSB
         JE          SP1C9           < A=B : LE TRIANGLE EST DEGENERE, ON
                                     <       L'IGNORE...
SP1C1:   EQU         $
         #/FLD#      FXSA
         FCAM        FXSC
         JNE         SP1C2           < A#C...
         #/FLD#      FYSA
         FCAM        FYSC
         JNE         SP1C2           < A#C...
         #/FLD#      FZSA
         FCAM        FZSC
         JE          SP1C9           < A=C : LE TRIANGLE EST DEGENERE, ON
                                     <       L'IGNORE...
SP1C2:   EQU         $
         #/FLD#      FXSB
         FCAM        FXSC
         JNE         SP1C3           < B#C...
         #/FLD#      FYSB
         FCAM        FYSC
         JNE         SP1C3           < B#C...
         #/FLD#      FZSB
         FCAM        FZSC
         JNE         SP1C3           < B#C...
<
< CAS DES TRIANGLES DEGENERES :
<
SP1C9:   EQU         $               < CAS DES TRIANGLES DEGENERES :
         BSR         AGOTO
         WORD        SP1C8           < ON LES IGNORE...
<
<
<        C A L C U L   D E   L A   F A C E T T E   " I N T E R N E "  :
<
<
<
< EQUATION D'UN PLAN PASSANT
< PAR 3 POINTS (A,B,C) :
<
<        I    X-XA    Y-YA    Z-ZA   I
<        I   XB-XA   YB-YA   ZB-ZA   I = 0
<        I   XC-XA   YC-YA   ZC-ZA   I
<
< LE VECTEUR NORMAL A POUR
< COMPOSANTE LES COFACTEURS DE
< (X-XA), (Y-YA), (Z-ZA)
< RESPECTIVEMENT...
<
SP1C3:   EQU         $
<
< CAS D'UN TRIANGLE (A,B,C) NON
< DEGENERE, CALCUL DE L'EQUATION
< DE SON VECTEUR NORMAL :
<
         #/FLD#      FYSC            < YC,
         FSB         FYSA            < YC-YA,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FZSB            < ZB,
         FSB         FZSA            < ZB-ZA,
         FMP         FWORK           < (YC-YA)*(ZB-ZA),
         #/FST#      PLANA           < ET SAVE...
         #/FLD#      FYSB            < YB,
         FSB         FYSA            < YB-YA,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FZSC            < ZC,
         FSB         FZSA            < ZC-ZA,
         FMP         FWORK           < (YB-YA)*(ZC-ZA),
         FSB         PLANA           < (YB-YA)*(ZC-ZA)-(YC-YA)*(ZB-ZA).
         #/FST#      PLANA           < SOIT 'XN', PREMIERE COMPOSANTE DU
                                     < VECTEUR NORMAL...
         #/FLD#      FXSC            < XC,
         FSB         FXSA            < XC-XA,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FZSB            < ZB,
         FSB         FZSA            < ZB-ZA,
         FMP         FWORK           < (XC-XA)*(ZB-ZA),
         #/FST#      PLANB           < ET SAVE...
         #/FLD#      FXSB            < XB,
         FSB         FXSA            < XB-XA,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FZSC            < ZC,
         FSB         FZSA            < ZC-ZA,
         FMP         FWORK           < (XB-XA)*(ZC-ZA),
         FSB         PLANB           < (XB-XA)*(ZC-ZA)-(XC-XA)*(ZB-ZA),
         BSR         AFNEG           < -((XB-XA)*(ZC-ZA)-(XC-XA)*(ZB-ZA)).
                                     < (A NOTER QUE CETTE PROGRAMMATION N'EST
                                     < PAS OPTIMISEE ('FNEG'), MAIS QU'AINSI
                                     < LES FORMULES SONT RESPECTEES...)
         #/FST#      PLANB           < SOIT 'YN', DEUXIEME COMPOSANTE
                                     < DU VECTEUR NORMAL...
         #/FLD#      FXSC            < XC,
         FSB         FXSA            < XC-XA,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FYSB            < YB,
         FSB         FYSA            < YB-YA,
         FMP         FWORK           < (XC-XA)*(YB-YA),
         #/FST#      PLANC           < ET SAVE...
         #/FLD#      FXSB            < XB,
         FSB         FXSA            < XB-XA,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FYSC            < YC,
         FSB         FYSA            < YC-YA,
         FMP         FWORK           < (XB-XA)*(YC-YA),
         FSB         PLANC           < (XB-XA)*(YC-YA)-(XC-XA)*(YB-YA).
         #/FST#      PLANC           < SOIT 'ZN', TROISIEME COMPOSANTE
                                     < DU VECTEUR NORMAL...
<
< "NORMALISATION" DU VECTEUR NORMAL :
<
         LRM         A,B
         WORD        PLAN3D          < (A)=ADRESSE DE (XN,YN,ZN),
         WORD        PLAN3D          < (B)=ADRESSE DE (XN,YN,ZN).
         BSR         APRSCA          < XN*XN+YN*YN+ZN*ZN,
         BSR         ARAC            < ET CALCUL DE LA NORME DU VECTEUR NORMAL,
         BSR         ATSFLO
         BSR         AFNEG           < AFIN D'AVOIR DES NORMALES DIRIGEES VERS
                                     < L'EXTERIEUR DES SURFACES "ORDINAIRES"...
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      PLANA
         FDV         FWORK
         BSR         ATSFLO
         #/FST#      PLANA           < ET NORMALISATION
         #/FLD#      PLANB
         FDV         FWORK
         BSR         ATSFLO
         #/FST#      PLANB           <                  DU VECTEUR
         #/FLD#      PLANC
         FDV         FWORK
         BSR         ATSFLO
         #/FST#      PLANC           <                             NORMAL...
<
< CALCUL DU COEFFICIENT 'D' DU PLAN :
<
         LRM         A,B
         WORD        PLAN3D          < (A)=ADRESSE DE (XN,YN,ZN),
         WORD        CA3D            < (B)=ADRESSE DE (XA,YA,ZA).
         BSR         APRSCA          < XN*XA+YN*YA+ZN*ZA,
         BSR         AFNEG           < -XN*XA-YN*YA-ZN*ZA,
         #/FST#      PLAND           < SOIT LE COEFFICIENT 'D' DU PLAN DE LA
                                     < FACETTE...
<
< GENERATION DE LA BOULE MINIMALE
< ASSOCIEE A LA FACETTE "INTERNE" :
<
         BSR         ASPHER
<
< GENERATION DE LA FACETTE :
<
         IF          EXIST-K,,,XEIF%
         IF          ATTENTION : LE 'IC' QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         IC          IDEGEN          < ET BIEN, LA FACETTE N'EST PAS DEGENEREE..
NUFACI:: VAL         HZERO           < NUMERO A DONNER A LA FACETTE "INTERNE",
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         ISGNFI          < GENERE-T'ON LES FACETTES "INTERNES" ???
         JE          E201            < NON...
         LAI         NUFACI
         BSR         ASP1D           < GENERATION DE LA FACETTE "INTERNE"
                                     < DE NOM "X/YYXX0"...
E201:    EQU         $
<
< SAUVEGARDE DE LA FACETTE "INTERNE" :
<
         LRM         A,B,X
         WORD        CF3D            < (A)=ADRESSE DE LA FACETTE "INTERNE",
         WORD        CF3DS           < (B)=ADRESSE DE LA ZONE DE SAUVEGARDE,
         WORD        LFACES          < (X)=NOMBRE DE MOTS A DEPLACER...
         MOVE                        < ET SAUVEGARDE DE LA FACETTE "INTERNE"...
         IC          FIDENT          < ET ON FAIT PROGRESSER L'INDICE 'J'
                                     < DES FACETTES SUR LA LIGNE COURANTE...
<
<
<        C A L C U L   D E S   6   F A C E T T E S   " E X T E R N E S "  :
<
<
<
<
<        C A L C U L   D E   ' M A B '  :
<
<
SP1C10:  EQU         $
<
< INITIALISATION DU CALCULATEUR
< DE DETERMINANT, TEL QUE LES
< 2 DERNIERES LIGNES DE LA MATRICE
< M(I,J) CONTIENNENT LES VECTEURS
< NORMAUX : M(2)='NA' ET M(3)='NB' :
<
         LAD         XNA
         STA         AM21            < M21 --> XN(A),
         LAD         YNA
         STA         AM22            < M22 --> YN(A),
         LAD         ZNA
         STA         AM23            < M23 --> ZN(A).
         LAD         XNB
         STA         AM31            < M31 --> XN(B),
         LAD         YNB
         STA         AM32            < M32 --> YN(B),
         LAD         ZNB
         STA         AM33            < M33 --> ZN(B).
<
< CALCUL DES COMPOSANTES DU VECTEUR 'AB' :
<
         #/FLD#      FXSB            < XB,
         FSB         FXSA            < XB-XA,
         #/FST#      M14             < M14=XB-XA.
         #/FLD#      FYSB            < YB,
         FSB         FYSA            < YB-YA,
         #/FST#      M24             < M24=YB-YA.
         #/FLD#      FZSB            < ZB,
         FSB         FZSA            < ZB-ZA,
         #/FST#      M34             < M34=ZB-ZA.
<
< CALCUL DU VECTEUR NORMAL 'NAB'
< AU PLAN P2AB :
<
<        CELUI-CI EST DEFINI PAR :
<                    NAB=AB$(AB$(NA$NB)), OU '$' DESIGNE LE PRODUIT VECTORIEL.
<        EN EFFET,
<                    NA$NB EST PARALLELE A LA DROIRE DAB,
<                    AB$(NA$NB) EST DONC UN VECTEUR NORMAL AU PLAN P1AB,
<                    AB$(AB$(NA$NB)) EST DONC NORMAL AU PLAN P2AB.
<
<        ON A :
<                    NAB=AB$(AB$(NA$NB)),
<                    NAB=(AB.(NA$NB))AB-(AB.AB)(NA$NB), OU '.' EST LE PRODUIT
<                                                       SCALAIRE,
<                    NAB=(AB,NA,NB)AB-(AB.AB)(NA$NB), OU LE PREMIER TERME
<                                                     REPRESENTE LE PRODUIT
<                                                     MIXTE DE 3 VECTEURS.
<
NAB3D:   EQU         M11             < VECTEUR NORMAL 'NAB'...
<
< CALCUL DU PRODUIT MIXTE :
<
<                     I XB-XA YB-YA ZB-ZA I
<        (AB,NA,NB) = I  XNA   YNA   ZNA  I
<                     I  XNB   YNB   ZNB  I
<
         LAD         M14
         STA         AM11            < M11 --> M14=XB-XA,
         LAD         M24
         STA         AM12            < M12 --> M24=YB-YA,
         LAD         M34
         STA         AM13            < M13 --> M34=ZB-ZA.
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ADETER          < (A,B)=PRODUIT MIXTE (AB,NA,NB).
         #/FST#      FPRMIX          < ET SAUVEGARDE...
<
< CALCUL DU CARRE DU MODULE
< DU VECTEUR 'AB', SOIT (AB.AB) :
<
         #/FLD#      M14             < XB-XA,
         FMP         M14             < (XB-XA)*(XB-XA),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      M24             < YB-YA,
         FMP         M24             < (YB-YA)*(YB-YA),
         BSR         APFWOR          < (XB-XA)*(XB-XA)+(YB-YA)*(YB-YA).
         #/FLD#      M34             < ZB-ZA,
         FMP         M34             < (ZB-ZA)*(ZB-ZA),
         BSR         APFWOR          < CE QUI DONNE LE CARRE DU MODULE DU
                                     < VECTEUR 'AB', SOIT :
         #/FST#      FMODUL          < (XB-XA)**2+(YB-YA)**2+(ZB-ZA)**2.
<
< CALCUL DE LA COMPOSANTE XNAB :
<
<        XNAB=(AB,NA,NB)*(XB-XA)-(AB.AB)*(YNA*ZNB-YNB*ZNA).
<
XNAB:    EQU         M11
         IF          NAB3D-XNAB,,XEIF%,
         IF          ATTENTION : INCOHERENCE !!!
XEIF%:   VAL         ENDIF
         #/FLD#      YNA             < YNA,
         FMP         ZNB             < YNA*ZNB,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      YNB             < YNB,
         FMP         ZNA             < YNB*ZNA,
         FSB         FWORK           < -(YNA*ZNB-YNB*ZNA),
         FMP         FMODUL          < -(AB.AB)*(YNA*ZNB-YNB*ZNA),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FPRMIX          < (AB,NA,NB),
         FMP         M14             < (AB,NA,NB)*(XB-XA),
         BSR         APFWOR          < (AB,NA,NB)*(XB-XA)-(AB.AB)*(YNA*ZNB-
                                     < -YNB*ZNA),
         #/FST#      XNAB            < CE QUI DONNE XNAB DANS 'M11'...
<
< CALCUL DE LA COMPOSANTE YNAB :
<
<        YNAB=(AB,NA,NB)*(YB-YA)+(AB.AB)*(XNA*ZNB-XNB*ZNA).
<
YNAB:    EQU         M12
         #/FLD#      XNB             < XNB,
         FMP         ZNA             < XNB*ZNA,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      XNA             < XNA,
         FMP         ZNB             < XNA*ZNB,
         FSB         FWORK           < +(XNA*ZNB-XNB*ZNA),
         FMP         FMODUL          < +(AB.AB)*(XNA*ZNB-XNB*ZNA),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FPRMIX          < (AB,NA,NB),
         FMP         M24             < (AB,NA,NB)*(YB-YA),
         BSR         APFWOR          < (AB,NA,NB)*(YB-YA)+(AB.AB)*(XNA*ZNB-
                                     < -XNB*ZNA),
         #/FST#      YNAB            < CE QUI DONNE YNAB DANS 'M12'...
<
< CALCUL DE LA COMPOSANTE ZNAB :
<
<        ZNAB=(AB,NA,NB)*(ZB-ZA)-(AB.AB)*(XNA*YNB-XNB*YNA).
<
ZNAB:    EQU         M13
         #/FLD#      XNA             < XNA,
         FMP         YNB             < XNA*YNB,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      XNB             < XNB,
         FMP         YNA             < XNB*YNA,
         FSB         FWORK           < -(XNA*YNB-XNB*YNA),
         FMP         FMODUL          < -(AB.AB)*(XNA*YNB-XNB*YNA),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FPRMIX          < (AB,NA,NB),
         FMP         M34             < (AB,NA,NB)*(ZB-ZA),
         BSR         APFWOR          < (AB,NA,NB)*(ZB-ZA)-(AB.AB)*(XNA*YNB-
                                     < -XNB*YNA),
         #/FST#      ZNAB            < CE QUI DONNE ZNAB DANS 'M13'.
<
< NORMALISATION DU VECTEUR NORMAL 'NAB' :
<
         BSR         ASP1F           < ON NORMALISE (M11,M12,M13)...
<
< CALCUL DES SECONDS MEMBRES DU
< SYSTEME LINEAIRE 3*3 A RESOUDRE
< POUR CALCULER LE POINT :
<
<        MAB=PTA.INTER.PTB.INTER.P2AB.
<
<        LE SYSTEME EST :
<
<        (P2AB) : XNAB*(X-XA)+YNAB*(Y-YA)+ZNAB*(Z-ZA)=0,
<        (PTA)  : XNA*(X-XA) +YNA*(Y-YA) +ZNA*(Z-ZA) =0,
<        (PTB)  : XNB*(X-XB) +YNB*(Y-YB) +ZNB*(Z-ZB) =0.
<
<        SOIT :
<
<        (P2AB) : XNAB*X+YNAB*Y+ZNAB*Z=XNAB*XA+YNAB*YA+ZNAB*ZA,
<        (PTA)  : XNA*X +YNA*Y +ZNA*Z =XNA*XA +YNA*YA +ZNA*ZA,
<        (PTB)  : XNB*X +YNB*Y +ZNB*Z =XNB*XB +YNB*YB +ZNB*ZB.
<
         LRM         A,B
         WORD        NAB3D           < (A)=ADRESSE DE (XNAB,YNAB,ZNAB),
         WORD        CA3D            < (B)=ADRESSE DE (FXSA,FYSA,FZSA).
         BSR         APRSCA          < XNAB*XA+YNAB*YA+ZNAB*ZA,
         #/FST#      M14             < CE QUI DONNE 'M14'...
         LRM         A,B
         WORD        NA3D            < (A)=ADRESSE DE (XNA,YNA,ZNA),
         WORD        CA3D            < (B)=ADRESSE DE (FXSA,FYSA,FZSA).
         BSR         APRSCA          < XNA*XA+YNA*YA+ZNA*ZA,
         #/FST#      M24             < CE QUI DONNE 'M24'...
         LRM         A,B
         WORD        NB3D            < (A)=ADRESSE DE (XNB,YNB,ZNB),
         WORD        CB3D            < (B)=ADRESSE DE (FXSB,FYSB,FZSB).
         BSR         APRSCA          < XNB*XB+YNB*YB+ZNB*ZB,
         #/FST#      M34             < CE QUI DONNE 'M34'...
<
< PREPARATION DU CALCUL DU
< DETERMINANT DU SYSTEME :
<
         LAD         XNAB
         STA         AM11            < M11 --> XNAB,
         LAD         YNAB
         STA         AM12            < M12 --> YNAB,
         LAD         ZNAB
         STA         AM13            < M13 --> ZNAB.
<
< CALCUL DU POINT 'MAB' :
<
         LAD         FXSAB
         STA         AVARX           < ADRESSE DE LA PREMIERE VARIABLE,
         LAD         FYSAB
         STA         AVARY           < ADRESSE DE LA SECONDE VARIABLE,
         LAD         FZSAB
         STA         AVARZ           < ADRESSE DE LA TROISEME VARIABLE.
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ACRAMR          < ET CALCUL DE (FXSAB,FYSAB,FZSAB) PAR
                                     < UTILISATION DE LA METHODE DE CRAMER...
         BSR         ATSFLO
<
<
<        C A L C U L   D E   ' M B C '  :
<
<
SP1C20:  EQU         $
<
< INITIALISATION DU CALCULATEUR
< DE DETERMINANT, TEL QUE LES
< 2 DERNIERES LIGNES DE LA MATRICE
< M(I,J) CONTIENNENT LES VECTEURS
< NORMAUX : M(2)='NB' ET M(3)='NC' :
<
         LAD         XNB
         STA         AM21            < M21 --> XN(B),
         LAD         YNB
         STA         AM22            < M22 --> YN(B),
         LAD         ZNB
         STA         AM23            < M23 --> ZN(B).
         LAD         XNC
         STA         AM31            < M31 --> XN(C),
         LAD         YNC
         STA         AM32            < M32 --> YN(C),
         LAD         ZNC
         STA         AM33            < M33 --> ZN(C).
<
< CALCUL DES COMPOSANTES DU VECTEUR 'BC' :
<
         #/FLD#      FXSC            < XC,
         FSB         FXSB            < XC-XB,
         #/FST#      M14             < M14=XC-XB.
         #/FLD#      FYSC            < YC,
         FSB         FYSB            < YC-YB,
         #/FST#      M24             < M24=YC-YB.
         #/FLD#      FZSC            < ZC,
         FSB         FZSB            < ZC-ZB,
         #/FST#      M34             < M34=ZC-ZB.
<
< CALCUL DU VECTEUR NORMAL 'NBC'
< AU PLAN P2BC :
<
<        CELUI-CI EST DEFINI PAR :
<                    NBC=BC$(BC$(NB$NC)), OU '$' DESIGNE LE PRODUIT VECTORIEL.
<        EN EFFET,
<                    NB$NC EST PARALLELE A LA DROIRE DBC,
<                    BC$(NB$NC) EST DONC UN VECTEUR NORMAL AU PLAN P1BC,
<                    BC$(BC$(NB$NC)) EST DONC NORMAL AU PLAN P2BC.
<
<        ON A :
<                    NBC=BC$(BC$(NB$NC)),
<                    NBC=(BC.(NB$NC))BC-(BC.BC)(NB$NC), OU '.' EST LE PRODUIT
<                                                       SCALAIRE,
<                    NBC=(BC,NB,NC)BC-(BC.BC)(NB$NC), OU LE PREMIER TERME
<                                                     REPRESENTE LE PRODUIT
<                                                     MIXTE DE 3 VECTEURS.
<
NBC3D:   EQU         NAB3D           < VECTEUR NORMAL 'NBC'...
<
< CALCUL DU PRODUIT MIXTE :
<
<                     I XC-XB YC-YB ZC-ZB I
<        (BC,NB,NC) = I  XNB   YNB   ZNB  I
<                     I  XNC   YNC   ZNC  I
<
         LAD         M14
         STA         AM11            < M11 --> M14=XC-XB,
         LAD         M24
         STA         AM12            < M12 --> M24=YC-YB,
         LAD         M34
         STA         AM13            < M13 --> M34=ZC-ZB.
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ADETER          < (A,B)=PRODUIT MIXTE (BC,NB,NC).
         #/FST#      FPRMIX          < ET SAUVEGARDE...
<
< CALCUL DU CARRE DU MODULE
< DU VECTEUR 'BC', SOIT (BC.BC) :
<
         #/FLD#      M14             < XC-XB,
         FMP         M14             < (XC-XB)*(XC-XB),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      M24             < YC-YB,
         FMP         M24             < (YC-YB)*(YC-YB),
         BSR         APFWOR          < (XC-XB)*(XC-XB)+(YC-YB)*(YC-YB).
         #/FLD#      M34             < ZC-ZB,
         FMP         M34             < (ZC-ZB)*(ZC-ZB),
         BSR         APFWOR          < CE QUI DONNE LE CARRE DU MODULE DU
                                     < VECTEUR 'BC', SOIT :
         #/FST#      FMODUL          < (XC-XB)**2+(YC-YB)**2+(ZC-ZB)**2.
<
< CALCUL DE LA COMPOSANTE XNBC :
<
<        XNBC=(BC,NB,NC)*(XC-XB)-(BC.BC)*(YNB*ZNC-YNC*ZNB).
<
XNBC:    EQU         M11
         IF          XNBC-NBC3D,,XEIF%,
         IF          ATTENTION : INCOHERENCE !!!
XEIF%:   VAL         ENDIF
         #/FLD#      YNB             < YNB,
         FMP         ZNC             < YNB*ZNC,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      YNC             < YNC,
         FMP         ZNB             < YNC*ZNB,
         FSB         FWORK           < -(YNB*ZNC-YNC*ZNB),
         FMP         FMODUL          < -(BC.BC)*(YNB*ZNC-YNC*ZNB),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FPRMIX          < (BC,NB,NC),
         FMP         M14             < (BC,NB,NC)*(XC-XB),
         BSR         APFWOR          < (BC,NB,NC)*(XC-XB)-(BC.BC)*(YNB*ZNC-
                                     < -YNC*ZNB),
         #/FST#      XNBC            < CE QUI DONNE XNBC DANS 'M11'...
<
< CALCUL DE LA COMPOSANTE YNBC :
<
<        YNBC=(BC,NB,NC)*(YC-YB)+(BC.BC)*(XNB*ZNC-XNC*ZNB).
<
YNBC:    EQU         M12
         #/FLD#      XNC             < XNC,
         FMP         ZNB             < XNC*ZNB,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      XNB             < XNB,
         FMP         ZNC             < XNB*ZNC,
         FSB         FWORK           < +(XNB*ZNC-XNC*ZNB),
         FMP         FMODUL          < +(BC.BC)*(XNB*ZNC-XNC*ZNB),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FPRMIX          < (BC,NB,NC),
         FMP         M24             < (BC,NB,NC)*(YC-YB),
         BSR         APFWOR          < (BC,NB,NC)*(YC-YB)+(BC.BC)*(XNB*ZNC-
                                     < -XNC*ZNB),
         #/FST#      YNBC            < CE QUI DONNE YNBC DANS 'M12'...
<
< CALCUL DE LA COMPOSANTE ZNBC :
<
<        ZNBC=(BC,NB,NC)*(ZC-ZB)-(BC.BC)*(XNB*YNC-XNC*YNB).
<
ZNBC:    EQU         M13
         #/FLD#      XNB             < XNB,
         FMP         YNC             < XNB*YNC,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      XNC             < XNC,
         FMP         YNB             < XNC*YNB,
         FSB         FWORK           < -(XNB*YNC-XNC*YNB),
         FMP         FMODUL          < -(BC.BC)*(XNB*YNC-XNC*YNB),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FPRMIX          < (BC,NB,NC),
         FMP         M34             < (BC,NB,NC)*(ZC-ZB),
         BSR         APFWOR          < (BC,NB,NC)*(ZC-ZB)-(BC.BC)*(XNB*YNC-
                                     < -XNC*YNB),
         #/FST#      ZNBC            < CE QUI DONNE ZNBC DANS 'M13'.
<
< NORMALISATION DU VECTEUR NORMAL 'NBC' :
<
         BSR         ASP1F           < ON NORMALISE (M11,M12,M13)...
<
< CALCUL DES SECONDS MEMBRES DU
< SYSTEME LINEAIRE 3*3 A RESOUDRE
< POUR CALCULER LE POINT :
<
<        MBC=PTB.INTER.PTC.INTER.P2BC.
<
<        LE SYSTEME EST :
<
<        (P2BC) : XNBC*(X-XB)+YNBC*(Y-YB)+ZNBC*(Z-ZB)=0,
<        (PTB)  : XNB*(X-XB) +YNB*(Y-YB) +ZNB*(Z-ZB) =0,
<        (PTC)  : XNC*(X-XC) +YNC*(Y-YC) +ZNC*(Z-ZC) =0.
<
<        SOIT :
<
<        (P2BC) : XNBC*X+YNBC*Y+ZNBC*Z=XNBC*XB+YNBC*YB+ZNBC*ZB,
<        (PTB)  : XNB*X +YNB*Y +ZNB*Z =XNB*XB +YNB*YB +ZNB*ZB,
<        (PTC)  : XNC*X +YNC*Y +ZNC*Z =XNC*XC +YNC*YC +ZNC*ZC.
<
         LRM         A,B
         WORD        NBC3D           < (A)=ADRESSE DE (XNBC,YNBC,ZNBC),
         WORD        CB3D            < (B)=ADRESSE DE (FXSB,FYSB,FZSB).
         BSR         APRSCA          < XNBC*XB+YNBC*YB+ZNBC*ZB,
         #/FST#      M14             < CE QUI DONNE 'M14'...
         LRM         A,B
         WORD        NB3D            < (A)=ADRESSE DE (XNB,YNB,ZNB),
         WORD        CB3D            < (B)=ADRESSE DE (FXSB,FYSB,FZSB).
         BSR         APRSCA          < XNB*XB+YNB*YB+ZNB*ZB,
         #/FST#      M24             < CE QUI DONNE 'M24'...
         LRM         A,B
         WORD        NC3D            < (A)=ADRESSE DE (XNC,YNC,ZNC),
         WORD        CC3D            < (B)=ADRESSE DE (FXSC,FYSC,FZSC).
         BSR         APRSCA          < XNC*XC+YNC*YC+ZNC*ZC,
         #/FST#      M34             < CE QUI DONNE 'M34'...
<
< PREPARATION DU CALCUL DU
< DETERMINANT DU SYSTEME :
<
         LAD         XNBC
         STA         AM11            < M11 --> XNBC,
         LAD         YNBC
         STA         AM12            < M12 --> YNBC,
         LAD         ZNBC
         STA         AM13            < M13 --> ZNBC.
<
< CALCUL DU POINT 'MBC' :
<
         LAD         FXSBC
         STA         AVARX           < ADRESSE DE LA PREMIERE VARIABLE,
         LAD         FYSBC
         STA         AVARY           < ADRESSE DE LA SECONDE VARIABLE,
         LAD         FZSBC
         STA         AVARZ           < ADRESSE DE LA TROISIEME VARIABLE.
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ACRAMR          < ET CALCUL DE (FXSBC,FYSBC,FZSBC) PAR
                                     < UTILISATION DE LA METHODE DE CRAMER...
         BSR         ATSFLO
<
<
<        C A L C U L   D E   ' M C A '  :
<
<
SP1C30:  EQU         $
<
< INITIALISATION DU CALCULATEUR
< DE DETERMINANT, TEL QUE LES
< 2 DERNIERES LIGNES DE LA MATRICE
< M(I,J) CONTIENNENT LES VECTEURS
< NORMAUX : M(2)='NC' ET M(3)='NA' :
<
         LAD         XNC
         STA         AM21            < M21 --> XN(C),
         LAD         YNC
         STA         AM22            < M22 --> YN(C),
         LAD         ZNC
         STA         AM23            < M23 --> ZN(C).
         LAD         XNA
         STA         AM31            < M31 --> XN(A),
         LAD         YNA
         STA         AM32            < M32 --> YN(A),
         LAD         ZNA
         STA         AM33            < M33 --> ZN(A).
<
< CALCUL DES COMPOSANTES DU VECTEUR 'CA' :
<
         #/FLD#      FXSA            < XA,
         FSB         FXSC            < XA-XC,
         #/FST#      M14             < M14=XA-XC.
         #/FLD#      FYSA            < YA,
         FSB         FYSC            < YA-YC,
         #/FST#      M24             < M24=YA-YC.
         #/FLD#      FZSA            < ZA,
         FSB         FZSC            < ZA-ZC,
         #/FST#      M34             < M34=ZA-ZC.
<
< CALCUL DU VECTEUR NORMAL 'NCA'
< AU PLAN P2CA :
<
<        CELUI-CI EST DEFINI PAR :
<                    NCA=CA$(CA$(NC$NA)), OU '$' DESIGNE LE PRODUIT VECTORIEL.
<        EN EFFET,
<                    NC$NA EST PARALLELE A LA DROIRE DCA,
<                    CA$(NC$NA) EST DONC UN VECTEUR NORMAL AU PLAN P1CA,
<                    CA$(CA$(NC$NA)) EST DONC NORMAL AU PLAN P2CA.
<
<        ON A :
<                    NCA=CA$(CA$(NC$NA)),
<                    NCA=(CA.(NC$NA))CA-(CA.CA)(NC$NA), OU '.' EST LE PRODUIT
<                                                       SCALAIRE,
<                    NCA=(CA,NC,NA)CA-(CA.CA)(NC$NA), OU LE PREMIER TERME
<                                                     REPRESENTE LE PRODUIT
<                                                     MIXTE DE 3 VECTEURS.
NCA3D:   EQU         NAB3D           < VECTEUR NORMAL 'NCA'...
<
< CALCUL DU PRODUIT MIXTE :
<
<                     I XA-XC YA-YC ZA-ZC I
<        (CA,NC,NA) = I  XNC   YNC   ZNC  I
<                     I  XNA   YNA   ZNA  I
<
         LAD         M14
         STA         AM11            < M11 --> M14=XA-XC,
         LAD         M24
         STA         AM12            < M12 --> M24=YA-YC,
         LAD         M34
         STA         AM13            < M13 --> M34=ZA-ZC.
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ADETER          < (A,B)=PRODUIT MIXTE (CA,NC,NA).
         #/FST#      FPRMIX          < ET SAUVEGARDE...
<
< CALCUL DU CARRE DU MODULE
< DU VECTEUR 'CA', SOIT (CA.CA) :
<
         #/FLD#      M14             < XA-XC,
         FMP         M14             < (XA-XC)*(XA-XC),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      M24             < YA-YC,
         FMP         M24             < (YA-YC)*(YA-YC),
         BSR         APFWOR          < (XA-XC)*(XA-XC)+(YA-YC)*(YA-YC).
         #/FLD#      M34             < ZA-ZC,
         FMP         M34             < (ZA-ZC)*(ZA-ZC),
         BSR         APFWOR          < CE QUI DONNE LE CARRE DU MODULE DU
                                     < VECTEUR 'CA', SOIT :
         #/FST#      FMODUL          < (XA-XC)**2+(YA-YC)**2+(ZA-ZC)**2.
<
< CALCUL DE LA COMPOSANTE XNCA :
<
<        XNCA=(CA,NC,NA)*(XA-XC)-(CA.CA)*(YNC*ZNA-YNA*ZNC).
<
XNCA:    EQU         M11
         IF          XNCA-NCA3D,,XEIF%,
         IF          ATTENTION : INCOHERENCE !!!
XEIF%:   VAL         ENDIF
         #/FLD#      YNC             < YNC,
         FMP         ZNA             < YNC*ZNA,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      YNA             < YNA,
         FMP         ZNC             < YNA*ZNC,
         FSB         FWORK           < -(YNC*ZNA-YNA*ZNC),
         FMP         FMODUL          < -(CA.CA)*(YNC*ZNA-YNA*ZNC),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FPRMIX          < (CA,NC,NA),
         FMP         M14             < (CA,NC,NA)*(XA-XC),
         BSR         APFWOR          < (CA,NC,NA)*(XA-XC)-(CA.CA)*(YNC*ZNA-
                                     < -YNA*ZNC),
         #/FST#      XNCA            < CE QUI DONNE XNCA DANS 'M11'...
<
< CALCUL DE LA COMPOSANTE YNCA :
<
<        YNCA=(CA,NC,NA)*(YA-YC)+(CA.CA)*(XNC*ZNA-XNA*ZNC).
<
YNCA:    EQU         M12
         #/FLD#      XNA             < XNA,
         FMP         ZNC             < XNA*ZNC,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      XNC             < XNC,
         FMP         ZNA             < XNC*ZNA,
         FSB         FWORK           < +(XNC*ZNA-XNA*ZNC),
         FMP         FMODUL          < +(CA.CA)*(XNC*ZNA-XNA*ZNC),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FPRMIX          < (CA,NC,NA),
         FMP         M24             < (CA,NC,NA)*(YA-YC),
         BSR         APFWOR          < (CA,NC,NA)*(YA-YC)+(CA.CA)*(XNC*ZNA-
                                     < -XNA*ZNC),
         #/FST#      YNCA            < CE QUI DONNE YNCA DANS 'M12'...
<
< CALCUL DE LA COMPOSANTE ZNCA :
<
<        ZNCA=(CA,NC,NA)*(ZA-ZC)-(CA.CA)*(XNC*YNA-XNA*YNC).
<
ZNCA:    EQU         M13
         #/FLD#      XNC             < XNC,
         FMP         YNA             < XNC*YNA,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      XNA             < XNA,
         FMP         YNC             < XNA*YNC,
         FSB         FWORK           < -(XNC*YNA-XNA*YNC),
         FMP         FMODUL          < -(CA.CA)*(XNC*YNA-XNA*YNC),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FPRMIX          < (CA,NC,NA),
         FMP         M34             < (CA,NC,NA)*(ZA-ZC),
         BSR         APFWOR          < (CA,NC,NA)*(ZA-ZC)-(CA.CA)*(XNC*YNA-
                                     < -XNA*YNC),
         #/FST#      ZNCA            < CE QUI DONNE ZNCA DANS 'M13'.
<
< NORMALISATION DU VECTEUR NORMAL 'NCA' :
<
         BSR         ASP1F           < ON NORMALISE (M11,M12,M13)...
<
< CALCUL DES SECONDS MEMBRES DU
< SYSTEME LINEAIRE 3*3 A RESOUDRE
< POUR CALCULER LE POINT :
<
<        MCA=PTC.INTER.PTA.INTER.P2CA.
<
<        LE SYSTEME EST :
<
<        (P2CA) : XNCA*(X-XC)+YNCA*(Y-YC)+ZNCA*(Z-ZC)=0,
<        (PTC)  : XNC*(X-XC) +YNC*(Y-YC) +ZNC*(Z-ZC) =0,
<        (PTA)  : XNA*(X-XA) +YNA*(Y-YA) +ZNA*(Z-ZA) =0.
<
<        SOIT :
<
<        (P2CA) : XNCA*X+YNCA*Y+ZNCA*Z=XNCA*XC+YNCA*YC+ZNCA*ZC,
<        (PTC)  : XNC*X +YNC*Y +ZNC*Z =XNC*XC +YNC*YC +ZNC*ZC,
<        (PTA)  : XNA*X +YNA*Y +ZNA*Z =XNA*XA +YNA*YA +ZNA*ZA.
<
         LRM         A,B
         WORD        NCA3D           < (A)=ADRESSE DE (XNCA,YNCA,ZNCA),
         WORD        CC3D            < (B)=ADRESSE DE (FXSC,FYSC,FZSC).
         BSR         APRSCA          < XNCA*XC+YNCA*YC+ZNCA*ZC,
         #/FST#      M14             < CE QUI DONNE 'M14'...
         LRM         A,B
         WORD        NC3D            < (A)=ADRESSE DE (XNC,YNC,ZNC),
         WORD        CC3D            < (B)=ADRESSE DE (FXSC,FYSC,FZSC).
         BSR         APRSCA          < XNC*XC+YNC*YC+ZNC*ZC,
         #/FST#      M24             < CE QUI DONNE 'M24'...
         LRM         A,B
         WORD        NA3D            < (A)=ADRESSE DE (XNA,YNA,ZNA),
         WORD        CA3D            < (B)=ADRESSE DE (FXSA,FYSA,FZSA).
         BSR         APRSCA          < XNA*XA+YNA*YA+ZNA*ZA,
         #/FST#      M34             < CE QUI DONNE 'M34'...
<
< PREPARATION DU CALCUL DU
< DETERMINANT DU SYSTEME :
<
         LAD         XNCA
         STA         AM11            < M11 --> XNCA,
         LAD         YNCA
         STA         AM12            < M12 --> YNCA,
         LAD         ZNCA
         STA         AM13            < M13 --> ZNCA.
<
< CALCUL DU POINT 'MCA' :
<
         LAD         FXSCA
         STA         AVARX           < ADRESSE DE LA PREMIERE VARIABLE,
         LAD         FYSCA
         STA         AVARY           < ADRESSE DE LA SECONDE VARIABLE,
         LAD         FZSCA
         STA         AVARZ           < ADRESSE DE LA TROISIEME VARIABLE.
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ACRAMR          < ET CALCUL DE (FXSCA,FYSCA,FZSCA) PAR
                                     < UTILISATION DE LA METHODE DE CRAMER...
         BSR         ATSFLO
<
<
<        C A L C U L   D E   ' M A B C '  :
<
<
SP1C40:  EQU         $
<
< INITIALISATION DU CALCULATEUR
< DE DETERMINANT, TEL QUE LES
< 3 LIGNES DE LA MATRICE M(I,J)
< CONTIENNENT LES VECTEURS NORMAUX :
< M(1)='NA', M(2)='NB' ET M(3)='NC' :
<
         LAD         XNA
         STA         AM11            < M11 --> XN(A),
         LAD         YNA
         STA         AM12            < M12 --> YN(A),
         LAD         ZNA
         STA         AM13            < M13 --> ZN(A).
         LAD         XNB
         STA         AM21            < M21 --> XN(B),
         LAD         YNB
         STA         AM22            < M22 --> YN(B),
         LAD         ZNB
         STA         AM23            < M23 --> ZN(B).
         LAD         XNC
         STA         AM31            < M31 --> XN(C),
         LAD         YNC
         STA         AM32            < M32 --> YN(C),
         LAD         ZNC
         STA         AM33            < M33 --> ZN(C).
<
< CALCUL DES SECONDS MEMBRES DU
< SYSTEME LINEAIRE 3*3 A RESOUDRE
< POUR CALCULER LE POINT :
<
<        MABC=PTA.INTER.PTB.INTER.PTC.
<
<        LE SYSTEME EST :
<
<        (PTA) : XNA*(X-XA)+YNA*(Y-YA)+ZNA*(Z-ZA)=0,
<        (PTB) : XNB*(X-XB)+YNB*(Y-YB)+ZNB*(Z-ZB)=0,
<        (PTC) : XNC*(X-XC)+YNC*(Y-YC)+ZNC*(Z-ZC)=0.
<
<        SOIT :
<
<        (PTA) : XNA*X+YNA*Y+ZNA*Z=XNA*XA+YNA*YA+ZNA*ZA,
<        (PTB) : XNB*X+YNB*Y+ZNB*Z=XNB*XB+YNB*YB+ZNB*ZB.
<        (PTC) : XNC*X+YNC*Y+ZNC*Z=XNC*XC+YNC*YC+ZNC*ZC.
<
         LRM         A,B
         WORD        NA3D            < (A)=ADRESSE DE (XNA,YNA,ZNA),
         WORD        CA3D            < (B)=ADRESSE DE (FXSA,FYSA,FZSA).
         BSR         APRSCA          < XNA*XA+YNA*YA+ZNA*ZA,
         #/FST#      M14             < CE QUI DONNE 'M14'...
         LRM         A,B
         WORD        NB3D            < (A)=ADRESSE DE (XNB,YNB,ZNB),
         WORD        CB3D            < (B)=ADRESSE DE (FXSB,FYSB,FZSB).
         BSR         APRSCA          < XNB*XB+YNB*YB+ZNB*ZB,
         #/FST#      M24             < CE QUI DONNE 'M24'...
         LRM         A,B
         WORD        NC3D            < (A)=ADRESSE DE (XNC,YNC,ZNC),
         WORD        CC3D            < (B)=ADRESSE DE (FXSC,FYSC,FZSC).
         BSR         APRSCA          < XNC*XC+YNC*YC+ZNC*ZC,
         #/FST#      M34             < CE QUI DONNE 'M34'...
<
< CALCUL DU POINT 'MABC' :
<
         LAD         FXSABC
         STA         AVARX           < ADRESSE DE LA PREMIERE VARIABLE,
         LAD         FYSABC
         STA         AVARY           < ADRESSE DE LA SECONDE VARIABLE,
         LAD         FZSABC
         STA         AVARZ           < ADRESSE DE LA TROISIEME VARIABLE.
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ACRAMR          < ET CALCUL DE (FXSABC,FYSABC,FZSABC) PAR
                                     < UTILISATION DE LA METHODE DE CRAMER...
         BSR         ATSFLO
<
< ET RETOUR :
<
SP1C8:   EQU         $
         PLR         A,B,X
         RSR
         PAGE
<
<
<        N O R M A L I S A T I O N   D U   V E C T E U R
<                    ( M 1 1 , M 1 2 , M 1 3 )  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME NORMALISE
<                    LE VECTEUR-LIGNE (M11,M12,M13)
<                    LORS DU CALCUL DES POINTS 'MAB',
<                    'MBC' ET 'MCA'...
<
<
SP1F:    EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B
<
< CALCUL DE LA NORME DU
< VECTEUR (M11,M12,M13) :
<
         LRM         A,B
         WORD        M11             < (A)=ADRESSE DE (M11,M12,M13),
         WORD        M11             < (B)=ADRESSE DE (M11,M12,M13).
         IF          M12-M11-DFLOT,,XEIF%,
         IF          ATTENTION : MAUVAISE IMPLANTATION !!!
XEIF%:   VAL         ENDIF
         IF          M13-M12-DFLOT,,XEIF%,
         IF          ATTENTION : MAUVAISE IMPLANTATION !!!
XEIF%:   VAL         ENDIF
         BSR         APRSCA          < XN*XN+YN*YN+ZN*ZN,
         BSR         ARAC            < ET CALCUL DE LA NORME DU VECTEUR NORMAL,
         BSR         ATSFLO
         BSR         ASFWOR          < ET SAVE...
<
< ET NORMALISATION :
<
         #/FLD#      M11
         FDV         FWORK
         BSR         ATSFLO
         #/FST#      M11             < ET NORMALISATION
         #/FLD#      M12
         FDV         FWORK
         BSR         ATSFLO
         #/FST#      M12             <                  DU VECTEUR
         #/FLD#      M13
         FDV         FWORK
         BSR         ATSFLO
         #/FST#      M13             <                             NORMAL...
<
< ET RETOUR :
<
         PLR         A,B
         RSR
         PAGE
<
<
<        C A L C U L   D E S   6   F A C E T T E S   " E X T E R N E S "  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME CALCULE
<                    LES 6 FACETTES "EXTERNES"
<                    ASSOCIEES A LA FACETTE "INTER-
<                    NE COURANTE.
<
<
FACE:    EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X,Y
<
< IDENTIFICATION DES SEGMENTS :
< (POUR 'SEGMU' ET 'SEGMV')
<
XSEGAB:: VAL         K               < SEGMENT (A,B),
XSEGBC:: VAL         XSEGAB+I        < SEGMENT (B,C),
XSEGCA:: VAL         XSEGBC+I        < SEGMENT (C,A).
         IF          XSEGAB-XSEGBC,XEIF%,,XEIF%
         IF          ATTENTION : IDENTIFICATEUR DE (A,B)=
         IF          IDENTIFICATEUR DE (B,C) !!!
XEIF%:   VAL         ENDIF
         IF          XSEGBC-XSEGCA,XEIF%,,XEIF%
         IF          ATTENTION : IDENTIFICATEUR DE (B,C)=
         IF          IDENTIFICATEUR DE (C,A) !!!
XEIF%:   VAL         ENDIF
         IF          XSEGCA-XSEGAB,XEIF%,,XEIF%
         IF          ATTENTION : IDENTIFICATEUR DE (C,A)=
         IF          IDENTIFICATEUR DE (A,B) !!!
XEIF%:   VAL         ENDIF
<
<
<        F A C E T T E   ( A , M A B , M A B C )  :
<
<
<
< GENERATION DES 3 SOMMETS :
<
         LRM         A,B
         WORD        CA3DS
         WORD        CA3D
         BSR         AMOVE3          < PREMIER SOMMET <-- 'A'.
         LRM         A,B
         WORD        CAB3D
         WORD        CB3D
         BSR         AMOVE3          < DEUXIEME SOMMET <-- 'MAB'.
         LRM         A,B
         WORD        CABC3D
         WORD        CC3D
         BSR         AMOVE3          < TROISIEME SOMMET <-- 'MABC'.
<
< GENERATION DES NORMALES
< A LA SURFACE AUX 3 SOMMETS :
<
         LRM         A,B
         WORD        NA3DS
         WORD        NA3D
         BSR         AMOVE3          < VECTEUR NORMAL EN 'A'.
         LRM         A,B
         WORD        NX3D
         WORD        NB3D
         BSR         AMOVE3          < LA NORMALE EN 'MAB' EST INDEFINIE...
         LRM         A,B
         WORD        NX3D
         WORD        NC3D
         BSR         AMOVE3          < LA NORMALE EN 'MABC' EST INDEFINIE...
<
< EQUATION DU PLAN DE LA FACETTE :
<
         LRM         A,B
         WORD        NA3DS
         WORD        PLAN3D
         BSR         AMOVE3          < C'EST LE PLAN TANGENT EN 'A'.
         LRM         A,B
         WORD        NA3DS           < (A)=ADRESSE DE (XNAS,YNAS,ZNAS),
         WORD        CA3DS           < (B)=ADRESSE DE (FXSAS,FYSAS,FZSAS).
         BSR         APRSCA          < XN*XA+YN*YA+ZN*ZA,
         BSR         AFNEG           < -XN*XA-YN*YA-ZN*ZA,
         #/FST#      PLAND           < SOIT LE COEFFICIENT 'D' DU PLAN DE LA
                                     < FACETTE...
<
< IDENTIFICATEURS DES SOMMETS
< DE LA FACETTE COURANTE :
<
         LA          IDENTX
         LB          &AIDNAS
         STB         IDENTA          < SOMMET 'A',
         STA         IDENTB          < SOMMET 'MAB',
         STA         IDENTC          < SOMMET 'MABC'...
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'A' :
<
         FLD         &AVRUAS
         #/FST#      VARUA           < UA <-- UA,
         FLD         &AVRVAS
         #/FST#      VARVA           < VA <-- VA.
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'MAB' :
<
         FLD         &AFXSAS         < XA,
         FSB         FXSAB           < XA-XAB,
         #/FST#      FMODUL
         FMP         FMODUL          < (XA-XAB)**2.
         BSR         ASFWOR          < ET SAVE...
         FLD         &AFYSAS         < YA,
         FSB         FYSAB           < YA-YAB,
         #/FST#      FMODUL
         FMP         FMODUL          < (YA-YAB)**2,
         BSR         APFWOR          < (XA-XAB)**2+(YA-YAB)**2.
         FLD         &AFZSAS         < ZA,
         FSB         FZSAB           < ZA-ZAB,
         #/FST#      FMODUL
         FMP         FMODUL          < (ZA-ZAB)**2,
         BSR         APFWOR          < (XA-XAB)**2+(YA-YAB)**2+(ZA-ZAB)**2,
         BSR         ARAC            < CALCUL DE LA DISTANCE DE 'A' A 'MAB',
         BSR         ATSFLO
         #/FST#      DAMAB           < DAMAB=D(A,MAB).
         #/FLD#      FXSAB           < XAB,
         FSB         &AFXSBS         < XAB-XB,
         #/FST#      FMODUL
         FMP         FMODUL          < (XAB-XB)**2.
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FYSAB           < YAB,
         FSB         &AFYSBS         < YAB-YB,
         #/FST#      FMODUL
         FMP         FMODUL          < (YAB-YB)**2,
         BSR         APFWOR          < (XAB-XB)**2+(YAB-YB)**2.
         #/FLD#      FZSAB           < ZAB,
         FSB         &AFZSBS         < ZAB-ZB,
         #/FST#      FMODUL
         FMP         FMODUL          < (ZAB-ZB)**2,
         BSR         APFWOR          < (XAB-XB)**2+(YAB-YB)**2+(ZAB-ZB)**2,
         BSR         ARAC            < CALCUL DE LA DISTANCE DE 'MAB' A 'B',
         BSR         ATSFLO
         #/FST#      DMABB           < DMABB=D(MAB,B).
         FAD         DAMAB
         #/FST#      DAMABB          < DAMABB=D(A,MAB)+D(MAB,B)...
         LAI         XSEGAB
         BSR         ASEGMU          < POSITION DU SEGMENT (A,B) --> 'Y'...
         FLD         &AVRUBS         < UB,
         BSR         APERIU
         FMP         DAMAB           < D(A,MAB)*UB,
         BSR         ASFWOR          < ET SAVE...
         FLD         &AVRUAS         < UA,
         BSR         APERIU
         FMP         DMABB           < D(MAB,B)*UA,
         BSR         APFWOR          < D(A,MAB)*UB+D(MAB,B)*UA,
         FDV         DAMABB
         BSR         ATSFLO
         BSR         APSEGU          < POSITIONNEMENT DANS LA PERIODE DE 'U'...
         #/FST#      VARUB           < UB <-- UAB=(D(A,MAB)*UB+D(MAB,B)*UA))/
                                     <            (D(A,MAB)+D(MAB,B)).
         LAI         XSEGAB
         BSR         ASEGMV          < POSITION DU SEGMENT (A,B) --> 'Y'...
         FLD         &AVRVBS         < VB,
         BSR         APERIV
         FMP         DAMAB           < D(A,MAB)*VB,
         BSR         ASFWOR          < ET SAVE...
         FLD         &AVRVAS         < VA,
         BSR         APERIV
         FMP         DMABB           < D(MAB,B)*VA,
         BSR         APFWOR          < D(A,MAB)*VB+D(MAB,B)*VA,
         FDV         DAMABB
         BSR         ATSFLO
         BSR         APSEGV          < POSITIONNEMENT DANS LA PERIODE DE 'V'...
         #/FST#      VARVB           < VB <-- VAB=(D(A,MAB)*VB+D(MAB,B)*VA))/
                                     <            (D(A,MAB)+D(MAB,B)).
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'MABC' :
<
         FLD         &AFXSAS         < XA,
         FSB         FXSABC          < XA-XABC,
         #/FST#      FMODUL
         FMP         FMODUL          < (XA-XABC)**2.
         BSR         ASFWOR          < ET SAVE...
         FLD         &AFYSAS         < YA,
         FSB         FYSABC          < YA-YABC,
         #/FST#      FMODUL
         FMP         FMODUL          < (YA-YABC)**2,
         BSR         APFWOR          < (XA-XABC)**2+(YA-YABC)**2.
         FLD         &AFZSAS         < ZA,
         FSB         FZSABC          < ZA-ZABC,
         #/FST#      FMODUL
         FMP         FMODUL          < (ZA-ZB)**2,
         BSR         APFWOR          < (XA-XABC)**2+(YA-YABC)**2+(ZA-ZABC)**2,
         BSR         ARAC            < CALCUL DE LA DISTANCE DE 'A' A 'MABC',
         BSR         ATSFLO
         #/FST#      DA              < DA=D(A,MABC).
         FLD         &AFXSBS         < XB,
         FSB         FXSABC          < XB-XABC,
         #/FST#      FMODUL
         FMP         FMODUL          < (XB-XABC)**2.
         BSR         ASFWOR          < ET SAVE...
         FLD         &AFYSBS         < YB,
         FSB         FYSABC          < YB-YABC,
         #/FST#      FMODUL
         FMP         FMODUL          < (YB-YABC)**2,
         BSR         APFWOR          < (XB-XABC)**2+(YB-YABC)**2.
         FLD         &AFZSBS         < ZB,
         FSB         FZSABC          < ZB-ZABC,
         #/FST#      FMODUL
         FMP         FMODUL          < (ZB-ZB)**2,
         BSR         APFWOR          < (XB-XABC)**2+(YB-YABC)**2+(ZB-ZABC)**2,
         BSR         ARAC            < CALCUL DE LA DISTANCE DE 'B' A 'MABC',
         BSR         ATSFLO
         #/FST#      DB              < DB=D(B,MABC).
         FLD         &AFXSCS         < XC,
         FSB         FXSABC          < XC-XABC,
         #/FST#      FMODUL
         FMP         FMODUL          < (XC-XABC)**2.
         BSR         ASFWOR          < ET SAVE...
         FLD         &AFYSCS         < YC,
         FSB         FYSABC          < YC-YABC,
         #/FST#      FMODUL
         FMP         FMODUL          < (YC-YABC)**2,
         BSR         APFWOR          < (XC-XABC)**2+(YC-YABC)**2.
         FLD         &AFZSCS         < ZC,
         FSB         FZSABC          < ZC-ZABC,
         #/FST#      FMODUL
         FMP         FMODUL          < (ZC-ZB)**2,
         BSR         APFWOR          < (XC-XABC)**2+(YC-YABC)**2+(ZC-ZABC)**2,
         BSR         ARAC            < CALCUL DE LA DISTANCE DE 'C' A 'MABC',
         BSR         ATSFLO
         #/FST#      DC              < DC=D(C,MABC).
                                     < NOTONS EN ABREGE D(X,MABC) PAR 'DX'...
         FMP         DB              < DB*DC,
         #/FST#      DBDC            < DBDC=DB*DC,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      DC              < DC,
         FMP         DA              < DC*DA,
         #/FST#      DCDA            < DCDA=DC*DA,
         BSR         APFWOR          < DB*DC+DC*DA,
         #/FLD#      DA              < DA,
         FMP         DB              < DA*DB,
         #/FST#      DADB            < DADB=DA*DB,
         BSR         APFWOR          < DB*DC+DC*DA+DA*DB,
         #/FST#      DADBDC          < DADBDC=DB*DC+DC*DA+DA*DB.
         PSR         A,B,X
         LXI         XPERU           < (X)=INDEX DE LA PERIOD(U).
         LYI         EXIST           < (Y)=INDICATEUR :
                                     <    ='EXIST'  : (A,B,C) EST SUR LE REBOU-
                                     <                CLAGE DU TORE,
                                     <    ='NEXIST' : (A,B,C) EST "NORMAL"...
         FLD         &AVRUAS         < UA,
         FSB         &AVRUBS         < UA-UB,
         BSR         AFABS           < ABS(UA-UB),
         FDV         F05             < 2*ABS(UA-UB), ET CECI AFIN DE COMPARER
                                     < ABS(UA-UB) A LA PERIOD(U)...
         FCAM        &ALTORE         < ALORS, (UA-UB) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(U),MAX(U)) ???
         JG          TRIGU9          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUCLAGE DU TORE...
         FLD         &AVRUBS         < UB,
         FSB         &AVRUCS         < UB-UC,
         BSR         AFABS           < ABS(UB-UC),
         FDV         F05             < 2*ABS(UB-UC), ET CECI AFIN DE COMPARER
                                     < ABS(UB-UC) A LA PERIOD(U)...
         FCAM        &ALTORE         < ALORS, (UB-UC) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(U),MAX(U)) ???
         JG          TRIGU9          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUBLAGE DU TORE...
         FLD         &AVRUCS         < UC,
         FSB         &AVRUAS         < UC-UA,
         BSR         AFABS           < ABS(UC-UA),
         FDV         F05             < 2*ABS(UC-UA), ET CECI AFIN DE COMPARER
                                     < ABS(UC-UA) A LA PERIOD(U)...
         FCAM        &ALTORE         < ALORS, (UC-UA) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(U),MAX(U)) ???
         JG          TRIGU9          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUCLAGE DU TORE...
         LYI         NEXIST          < ET BIEN, LE TRIANGLE (A,B,C) SEMBLE
                                     < "NORMAL" :
                                     < ABS(UU-UU)<PERIOD(U)/2, OU "UU" REPRE-
                                     < SENTE 'UA', 'UB' ET 'UC'...
TRIGU9:  EQU         $
         PLR         A,B,X
         FLD         &AVRUAS         < UA,
         BSR         APERIU
         FMP         DBDC            < DB*DC*UA,
         BSR         ASFWOR          < ET SAVE...
         FLD         &AVRUBS         < UB,
         BSR         APERIU
         FMP         DCDA            < DC*DA*UB,
         BSR         APFWOR          < DB*DC*UA+DC*DA*UB,
         FLD         &AVRUCS         < UC,
         BSR         APERIU
         FMP         DADB            < DA*DB*UC,
         BSR         APFWOR          < DB*DC*UA+DC*DA*UB+DA*DB*UC,
         FDV         DADBDC          < ET DIVISION PAR (DB*DC+DC*DA+DA*DB),
         BSR         ATSFLO
         BSR         APSEGU          < POSITIONNEMENT DANS LA PERIODE DE 'U'...
         #/FST#      VARUC           < UC <-- UABC=(DB*DC*UA+DC*DA*UB+DA*DB*UC)/
                                     <             (DB*DC+DC*DA+DA*DB)...
         PSR         A,B,X
         LXI         XPERV           < (X)=INDEX DE LA PERIOD(V).
         LYI         EXIST           < (Y)=INDICATEUR :
                                     <    ='EXIST'  : (A,B,C) EST SUR LE REBOU-
                                     <                CLAGE DU TORE,
                                     <    ='NEXIST' : (A,B,C) EST "NORMAL"...
         FLD         &AVRVAS         < VA,
         FSB         &AVRVBS         < VA-VB,
         BSR         AFABS           < ABS(VA-VB),
         FDV         F05             < 2*ABS(VA-VB), ET CECI AFIN DE COMPARER
                                     < ABS(VA-VB) A LA PERIOD(V)...
         FCAM        &ALTORE         < ALORS, (VA-VB) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(V),MAX(V)) ???
         JG          TRIGV9          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUCLAGE DU TORE...
         FLD         &AVRVBS         < VB,
         FSB         &AVRVCS         < VB-VC,
         BSR         AFABS           < ABS(VB-VC),
         FDV         F05             < 2*ABS(VB-VC), ET CECI AFIN DE COMPARER
                                     < ABS(VB-VC) A LA PERIOD(V)...
         FCAM        &ALTORE         < ALORS, (VB-VC) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(V),MAX(V)) ???
         JG          TRIGV9          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUBLAGE DU TORE...
         FLD         &AVRVCS         < VC,
         FSB         &AVRVAS         < VC-VA,
         BSR         AFABS           < ABS(VC-VA),
         FDV         F05             < 2*ABS(VC-VA), ET CECI AFIN DE COMPARER
                                     < ABS(VC-VA) A LA PERIOD(V)...
         FCAM        &ALTORE         < ALORS, (VC-VA) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(V),MAX(V)) ???
         JG          TRIGV9          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUCLAGE DU TORE...
         LYI         NEXIST          < ET BIEN, LE TRIANGLE (A,B,C) SEMBLE
                                     < "NORMAL" :
                                     < ABS(VV-VV)<PERIOD(V)/2, OU "VV" REPRE-
                                     < SENTE 'VA', 'VB' ET 'VC'...
TRIGV9:  EQU         $
         PLR         A,B,X
         FLD         &AVRVAS         < VA,
         BSR         APERIV
         FMP         DBDC            < DB*DC*VA,
         BSR         ASFWOR          < ET SAVE...
         FLD         &AVRVBS         < VB,
         BSR         APERIV
         FMP         DCDA            < DC*DA*VB,
         BSR         APFWOR          < DB*DC*VA+DC*DA*VB,
         FLD         &AVRVCS         < VC,
         BSR         APERIV
         FMP         DADB            < DA*DB*VC,
         BSR         APFWOR          < DB*DC*VA+DC*DA*VB+DA*DB*VC,
         FDV         DADBDC          < ET DIVISION PAR (DB*DC+DC*DA+DA*DB),
         BSR         ATSFLO
         BSR         APSEGV          < POSITIONNEMENT DANS LA PERIODE DE 'V'...
         #/FST#      VARVC           < VC <-- VABC=(DB*DC*VA+DC*DA*VB+DA*DB*VC)/
                                     <             (DB*DC+DC*DA+DA*DB)...
<
< GENERATION DE LA BOULE MINIMALE
< ASSOCIEE A LA FACETTE "EXTERNE" :
<
         BSR         ASPHER
<
< GENERATION ET TRACE DE LA FACETTE :
<
NUFACE:: VAL         NUFACI+I        < NUMERO DE LA PREMIERE FACETTE "EXTERNE".
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         ISGNFE          < GENERE-T'ON LES FACETTES "EXTERNES" ???
         JE          E202            < NON...
         LAI         NUFACE
         BSR         ASP1D           < ENVOI DE LA PREMIERE FACETTE "EXTERNE".
E202:    EQU         $
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         BSR         ASP1E           < ET TRACE GRAPHIQUE...
XOPT1:   VAL         ENDIF
<
<
<        F A C E T T E   ( M A B , B , M A B C )  :
<
<
<
< GENERATION DES 3 SOMMETS :
<
         LRM         A,B
         WORD        CAB3D
         WORD        CA3D
         BSR         AMOVE3          < PREMIER SOMMET <-- 'MAB'.
         LRM         A,B
         WORD        CB3DS
         WORD        CB3D
         BSR         AMOVE3          < DEUXIEME SOMMET <-- 'B'.
                                     < (TROISIEME SOMMET INCHANGE : 'MABC')
<
< GENERATION DES NORMALES
< A LA SURFACE AUX 3 SOMMETS :
<
         LRM         A,B
         WORD        NX3D
         WORD        NA3D
         BSR         AMOVE3          < LA NORMALE EN 'MAB' EST INDEFINIE...
         LRM         A,B
         WORD        NB3DS
         WORD        NB3D
         BSR         AMOVE3          < VECTEUR NORMAL EN 'B'.
                                     < (NORMALE EN 'MABC' TOUJOURS INDEFINIE)
<
< EQUATION DU PLAN DE LA FACETTE :
<
         LRM         A,B
         WORD        NB3DS
         WORD        PLAN3D
         BSR         AMOVE3          < C'EST LE PLAN TANGENT EN 'B'.
         LRM         A,B
         WORD        NB3DS           < (A)=ADRESSE DE (XNBS,YNBS,ZNBS),
         WORD        CB3DS           < (B)=ADRESSE DE (FXSBS,FYSBS,FZSBS).
         BSR         APRSCA          < XN*XB+YN*YB+ZN*ZB,
         BSR         AFNEG           < -XN*XB-YN*YB-ZN*ZB,
         #/FST#      PLAND           < SOIT LE COEFFICIENT 'D' DU PLAN DE LA
                                     < FACETTE...
<
< IDENTIFICATEURS DES SOMMETS
< DE LA FACETTE COURANTE :
<
         LA          IDENTX
         LB          &AIDNBS
         STA         IDENTA          < SOMMET 'MAB',
         STB         IDENTB          < SOMMET 'B',
                                     < (IDENTIFICATEUR DE 'MABC' INCHANGE)
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'MAB' :
<
         LAI         XSEGAB
         BSR         ASEGMU          < POSITION DU SEGMENT (A,B) --> 'Y'...
         FLD         &AVRUBS         < UB,
         BSR         APERIU
         FMP         DAMAB           < D(A,MAB)*UB,
         BSR         ASFWOR          < ET SAVE...
         FLD         &AVRUAS         < UA,
         BSR         APERIU
         FMP         DMABB           < D(MAB,B)*UA,
         BSR         APFWOR          < D(A,MAB)*UB+D(MAB,B)*UA,
         FDV         DAMABB
         BSR         ATSFLO
         BSR         APSEGU          < POSITIONNEMENT DANS LA PERIODE DE 'U'...
         #/FST#      VARUA           < UA <-- UAB=(D(A,MAB)*UB+D(MAB,B)*UA))/
                                     <            (D(A,MAB)+D(MAB,B)).
         LAI         XSEGAB
         BSR         ASEGMV          < POSITION DU SEGMENT (A,B) --> 'Y'...
         FLD         &AVRVBS         < VB,
         BSR         APERIV
         FMP         DAMAB           < D(A,MAB)*VB,
         BSR         ASFWOR          < ET SAVE...
         FLD         &AVRVAS         < VA,
         BSR         APERIV
         FMP         DMABB           < D(MAB,B)*VA,
         BSR         APFWOR          < D(A,MAB)*VB+D(MAB,B)*VA,
         FDV         DAMABB
         BSR         ATSFLO
         BSR         APSEGV          < POSITIONNEMENT DANS LA PERIODE DE 'V'...
         #/FST#      VARVA           < VA <-- VAB=(D(A,MAB)*VB+D(MAB,B)*VA))/
                                     <            (D(A,MAB)+D(MAB,B)).
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'B' :
<
         FLD         &AVRUBS
         #/FST#      VARUB           < UB <-- UB,
         FLD         &AVRVBS
         #/FST#      VARVB           < VB <-- VB.
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'MABC' :
<
                                     < ELLES SONT INCHANGEES :
                                     < UABC=(DB*DC*UA+DC*DA*UB+DA*DB*UC)/
                                     <      (DB*DC+DC*DA+DA*DB)...
                                     < VABC=(DB*DC*VA+DC*DA*VB+DA*DB*VC)/
                                     <      (DB*DC+DC*DA+DA*DB)...
<
< GENERATION DE LA  BOULE MINIMALE
< ASSOCIEE A LA FACETTE "EXTERNE" :
<
         BSR         ASPHER
<
< GENERATION ET TRACE DE LA FACETTE :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         ISGNFE          < GENERE-T'ON LES FACETTES "EXTERNES" ???
         JE          E203            < NON...
         LAI         NUFACE+I
         BSR         ASP1D           < ENVOI DE LA DEUXIEME FACETTE "EXTERNE".
E203:    EQU         $
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         BSR         ASP1E           < ET TRACE GRAPHIQUE...
XOPT1:   VAL         ENDIF
<
<
<        F A C E T T E   ( B , M B C , M A B C )  :
<
<
<
< GENERATION DES 3 SOMMETS :
<
         LRM         A,B
         WORD        CB3DS
         WORD        CA3D
         BSR         AMOVE3          < PREMIER SOMMET <-- 'B'.
         LRM         A,B
         WORD        CBC3D
         WORD        CB3D
         BSR         AMOVE3          < DEUXIEME SOMMET <-- 'MBC'.
                                     < (TROISIEME SOMMET INCHANGE : 'MABC')
<
< GENERATION DES NORMALES
< A LA SURFACE AUX 3 SOMMETS :
<
         LRM         A,B
         WORD        NB3DS
         WORD        NA3D
         BSR         AMOVE3          < VECTEUR NORMAL EN 'B'.
         LRM         A,B
         WORD        NX3D
         WORD        NB3D
         BSR         AMOVE3          < LA NORMALE EN 'MBC' EST INDEFINIE...
                                     < (NORMALE EN 'MABC' TOUJOURS INDEFINIE)
<
< EQUATION DU PLAN DE LA FACETTE :
<
                                     < C'EST LE PLAN TANGENT EN 'B'.
<
< IDENTIFICATEURS DES SOMMETS
< DE LA FACETTE COURANTE :
<
         LA          IDENTX
         LB          &AIDNBS
         STB         IDENTA          < SOMMET 'B',
         STA         IDENTB          < SOMMET 'MBC',
                                     < (IDENTIFICATEUR DE 'MABC' INCHANGE)
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'B' :
<
DBMBC:   EQU         DAMAB           < D(B,MBC),
DMBCC:   EQU         DMABB           < D(MBC,C),
DBMBCC:  EQU         DAMABB          < D(B,MBC)+D(MBC,C).
         FLD         &AVRUBS
         #/FST#      VARUA           < UA <-- UB,
         FLD         &AVRVBS
         #/FST#      VARVA           < VA <-- VB.
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'MBC' :
<
         FLD         &AFXSBS         < XB,
         FSB         FXSBC           < XB-XBC,
         #/FST#      FMODUL
         FMP         FMODUL          < (XB-XBC)**2.
         BSR         ASFWOR          < ET SAVE...
         FLD         &AFYSBS         < YB,
         FSB         FYSBC           < YB-YBC,
         #/FST#      FMODUL
         FMP         FMODUL          < (YB-YBC)**2,
         BSR         APFWOR          < (XB-XBC)**2+(YB-YBC)**2.
         FLD         &AFZSBS         < ZB,
         FSB         FZSBC           < ZB-ZBC,
         #/FST#      FMODUL
         FMP         FMODUL          < (ZB-ZBC)**2,
         BSR         APFWOR          < (XB-XBC)**2+(YB-YBC)**2+(ZB-ZBC)**2,
         BSR         ARAC            < CALCUL DE LA DISTANCE DE 'B' A 'MBC',
         BSR         ATSFLO
         #/FST#      DBMBC           < DBMBC=D(B,MBC).
         #/FLD#      FXSBC           < XBC,
         FSB         &AFXSCS         < XBC-XC,
         #/FST#      FMODUL
         FMP         FMODUL          < (XBC-XC)**2.
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FYSBC           < YBC,
         FSB         &AFYSCS         < YBC-YC,
         #/FST#      FMODUL
         FMP         FMODUL          < (YBC-YC)**2,
         BSR         APFWOR          < (XBC-XC)**2+(YBC-YC)**2.
         #/FLD#      FZSBC           < ZBC,
         FSB         &AFZSCS         < ZBC-ZC,
         #/FST#      FMODUL
         FMP         FMODUL          < (ZBC-ZC)**2,
         BSR         APFWOR          < (XBC-XC)**2+(YBC-YC)**2+(ZBC-ZC)**2,
         BSR         ARAC            < CALCUL DE LA DISTANCE DE 'MBC' A 'C',
         BSR         ATSFLO
         #/FST#      DMBCC           < DMBCC=D(MBC,C).
         FAD         DBMBC
         #/FST#      DBMBCC          < DBMBCC=D(B,MBC)+D(MBC,C)...
         LAI         XSEGBC
         BSR         ASEGMU          < POSITION DU SEGMENT (B,C) --> 'Y'...
         FLD         &AVRUCS         < UC,
         BSR         APERIU
         FMP         DBMBC           < D(B,MBC)*UC,
         BSR         ASFWOR          < ET SAVE...
         FLD         &AVRUBS         < UB,
         BSR         APERIU
         FMP         DMBCC           < D(MBC,C)*UB,
         BSR         APFWOR          < D(B,MBC)*UC+D(MBC,C)*UB,
         FDV         DBMBCC
         BSR         ATSFLO
         BSR         APSEGU          < POSITIONNEMENT SUR LA PERIODE DE 'U'...
         #/FST#      VARUB           < UB <-- UBC=(D(B,MBC)*UC+D(MBC,C)*UB))/
                                     <            (D(B,MBC)+D(MBC,C)).
         LAI         XSEGBC
         BSR         ASEGMV          < POSITION DU SEGMENT (B,C) --> 'Y'...
         FLD         &AVRVCS         < VC,
         BSR         APERIV
         FMP         DBMBC           < D(B,MBC)*VC,
         BSR         ASFWOR          < ET SAVE...
         FLD         &AVRVBS         < VB,
         BSR         APERIV
         FMP         DMBCC           < D(MBC,C)*VB,
         BSR         APFWOR          < D(B,MBC)*VC+D(MBC,C)*VB,
         FDV         DBMBCC
         BSR         ATSFLO
         BSR         APSEGV          < POSITIONNEMENT SUR LA PERIODE DE 'V'...
         #/FST#      VARVB           < VB <-- VBC=(D(B,MBC)*VC+D(MBC,C)*VB))/
                                     <            (D(B,MBC)+D(MBC,C)).
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'MABC' :
<
                                     < ELLES SONT INCHANGEES :
                                     < UABC=(DB*DC*UA+DC*DA*UB+DA*DB*UC)/
                                     <      (DB*DC+DC*DA+DA*DB)...
                                     < VABC=(DB*DC*VA+DC*DA*VB+DA*DB*VC)/
                                     <      (DB*DC+DC*DA+DA*DB)...
<
< GENERATION DE LA BOULE MINIMALE
< ASSOCIEE A LA FACETTE "EXTERNE" :
<
         BSR         ASPHER
<
< GENERATION ET TRACE DE LA FACETTE :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         ISGNFE          < GENERE-T'ON LES FACETTES "EXTERNES" ???
         JE          E204            < NON...
         LAI         NUFACE+I+I
         BSR         ASP1D           < ENVOI DE LA TROISIEME FACETTE "EXTERNE".
E204:    EQU         $
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         BSR         ASP1E           < ET TRACE GRAPHIQUE...
XOPT1:   VAL         ENDIF
<
<
<        F A C E T T E   ( M B C , C , M A B C )  :
<
<
<
< GENERATION DES 3 SOMMETS :
<
         LRM         A,B
         WORD        CBC3D
         WORD        CA3D
         BSR         AMOVE3          < PREMIER SOMMET <-- 'MBC'.
         LRM         A,B
         WORD        CC3DS
         WORD        CB3D
         BSR         AMOVE3          < DEUXIEME SOMMET <-- 'C'.
                                     < (TROISIEME SOMMET INCHANGE : 'MABC')
<
< GENERATION DES NORMALES
< A LA SURFACE AUX 3 SOMMETS :
<
         LRM         A,B
         WORD        NX3D
         WORD        NA3D
         BSR         AMOVE3          < LA NORMALE EN 'MBC' EST INDEFINIE...
         LRM         A,B
         WORD        NC3DS
         WORD        NB3D
         BSR         AMOVE3          < VECTEUR NORMAL EN 'C'.
                                     < (NORMALE EN 'MABC' TOUJOURS INDEFINIE)
<
< EQUATION DU PLAN DE LA FACETTE :
<
         LRM         A,B
         WORD        NC3DS
         WORD        PLAN3D
         BSR         AMOVE3          < C'EST LE PLAN TANGENT EN 'C'.
         LRM         A,B
         WORD        NC3DS           < (A)=ADRESSE DE (XNCS,YNCS,ZNCS),
         WORD        CC3DS           < (B)=ADRESSE DE (FXSCS,FYSCS,FZSCS).
         BSR         APRSCA          < XN*XC+YN*YC+ZN*ZC,
         BSR         AFNEG           < -XN*XC-YN*YC-ZN*ZC,
         #/FST#      PLAND           < SOIT LE COEFFICIENT 'D' DU PLAN DE LA
                                     < FACETTE...
<
< IDENTIFICATEURS DES SOMMETS
< DE LA FACETTE COURANTE :
<
         LA          IDENTX
         LB          &AIDNCS
         STA         IDENTA          < SOMMET 'MBC',
         STB         IDENTB          < SOMMET 'C',
                                     < (IDENTIFICATEUR DE 'MABC' INCHANGE)
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'MBC' :
<
         LAI         XSEGBC
         BSR         ASEGMU          < POSITION DU SEGMENT (B,C) --> 'Y'...
         FLD         &AVRUCS         < UC,
         BSR         APERIU
         FMP         DBMBC           < D(B,MBC)*UC,
         BSR         ASFWOR          < ET SAVE...
         FLD         &AVRUBS         < UB,
         BSR         APERIU
         FMP         DMBCC           < D(MBC,C)*UB,
         BSR         APFWOR          < D(B,MBC)*UC+D(MBC,C)*UB,
         FDV         DBMBCC
         BSR         ATSFLO
         BSR         APSEGU          < POSITIONNEMENT SUR LA PERIODE DE 'U'...
         #/FST#      VARUA           < UA <-- UBC=(D(B,MBC)*UC+D(MBC,C)*UB))/
                                     <            (D(B,MBC)+D(MBC,C)).
         LAI         XSEGBC
         BSR         ASEGMV          < POSITION DU SEGMENT (B,C) --> 'Y'...
         FLD         &AVRVCS         < VC,
         BSR         APERIV
         FMP         DBMBC           < D(B,MBC)*VC,
         BSR         ASFWOR          < ET SAVE...
         FLD         &AVRVBS         < VB,
         BSR         APERIV
         FMP         DMBCC           < D(MBC,C)*VB,
         BSR         APFWOR          < D(B,MBC)*VC+D(MBC,C)*VB,
         FDV         DBMBCC
         BSR         ATSFLO
         BSR         APSEGV          < POSITIONNEMENT SUR LA PERIODE DE 'V'...
         #/FST#      VARVA           < VA <-- VBC=(D(B,MBC)*VC+D(MBC,C)*VB))/
                                     <            (D(B,MBC)+D(MBC,C)).
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'C' :
<
         FLD         &AVRUCS
         #/FST#      VARUB           < UB <-- UC,
         FLD         &AVRVCS
         #/FST#      VARVB           < VB <-- VC.
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'MABC' :
<
                                     < ELLES SONT INCHANGEES :
                                     < UABC=(DB*DC*UA+DC*DA*UB+DA*DB*UC)/
                                     <      (DB*DC+DC*DA+DA*DB)...
                                     < VABC=(DB*DC*VA+DC*DA*VB+DA*DB*VC)/
                                     <      (DB*DC+DC*DA+DA*DB)...
<
< GENERATION DE LA BOULE MINIMALE
< ASSOCIEE A LA FACETTE "EXTERNE" :
<
         BSR         ASPHER
<
< GENERATION ET TRACE DE LA FACETTE :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         ISGNFE          < GENERE-T'ON LES FACETTES "EXTERNES" ???
         JE          E205            < NON...
         LAI         NUFACE+I+I+I
         BSR         ASP1D           < ENVOI DE LA QUATRIEME FACETTE "EXTERNE".
E205:    EQU         $
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         BSR         ASP1E           < ET TRACE GRAPHIQUE...
XOPT1:   VAL         ENDIF
<
<
<        F A C E T T E   ( C , M C A , M A B C )  :
<
<
<
< GENERATION DES 3 SOMMETS :
<
         LRM         A,B
         WORD        CC3DS
         WORD        CA3D
         BSR         AMOVE3          < PREMIER SOMMET <-- 'C'.
         LRM         A,B
         WORD        CCA3D
         WORD        CB3D
         BSR         AMOVE3          < DEUXIEME SOMMET <-- 'MCA'.
                                     < (TROISIEME SOMMET INCHANGE : 'MABC')
<
< GENERATION DES NORMALES
< A LA SURFACE AUX 3 SOMMETS :
<
         LRM         A,B
         WORD        NC3DS
         WORD        NA3D
         BSR         AMOVE3          < VECTEUR NORMAL EN 'C'.
         LRM         A,B
         WORD        NX3D
         WORD        NB3D
         BSR         AMOVE3          < LA NORMALE EN 'MCA' EST INDEFINIE...
                                     < (NORMALE EN 'MABC' TOUJOURS INDEFINIE)
<
< EQUATION DU PLAN DE LA FACETTE :
<
                                     < C'EST LE PLAN TANGENT EN 'C'.
<
< IDENTIFICATEURS DES SOMMETS
< DE LA FACETTE COURANTE :
<
         LA          IDENTX
         LB          &AIDNCS
         STB         IDENTA          < SOMMET 'C',
         STA         IDENTB          < SOMMET 'MCA',
                                     < (IDENTIFICATEUR DE 'MABC' INCHANGE)
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'C' :
<
DCMCA:   EQU         DAMAB           < D(C,MCA),
DMCAA:   EQU         DMABB           < D(MCA,A),
DCMCAA:  EQU         DAMABB          < D(C,MCA)+D(MCA,A).
         FLD         &AVRUCS
         #/FST#      VARUA           < UA <-- UC,
         FLD         &AVRVCS
         #/FST#      VARVA           < VA <-- VC.
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'MCA' :
<
         FLD         &AFXSCS         < XC,
         FSB         FXSCA           < XC-XCA,
         #/FST#      FMODUL
         FMP         FMODUL          < (XC-XCA)**2.
         BSR         ASFWOR          < ET SAVE...
         FLD         &AFYSCS         < YC,
         FSB         FYSCA           < YC-YCA,
         #/FST#      FMODUL
         FMP         FMODUL          < (YC-YCA)**2,
         BSR         APFWOR          < (XC-XCA)**2+(YC-YCA)**2.
         FLD         &AFZSCS         < ZC,
         FSB         FZSCA           < ZC-ZCA,
         #/FST#      FMODUL
         FMP         FMODUL          < (ZC-ZCA)**2,
         BSR         APFWOR          < (XC-XCA)**2+(YC-YCA)**2+(ZC-ZCA)**2,
         BSR         ARAC            < CALCUL DE LA DISTANCE DE 'C' A 'MCA',
         BSR         ATSFLO
         #/FST#      DCMCA           < DCMCA=D(C,MCA).
         #/FLD#      FXSCA           < XCA,
         FSB         &AFXSAS         < XCA-XA,
         #/FST#      FMODUL
         FMP         FMODUL          < (XCA-XA)**2.
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FYSCA           < YCA,
         FSB         &AFYSAS         < YCA-YA,
         #/FST#      FMODUL
         FMP         FMODUL          < (YCA-YA)**2,
         BSR         APFWOR          < (XCA-XA)**2+(YCA-YA)**2.
         #/FLD#      FZSCA           < ZCA,
         FSB         &AFZSAS         < ZCA-ZA,
         #/FST#      FMODUL
         FMP         FMODUL          < (ZCA-ZA)**2,
         BSR         APFWOR          < (XCA-XA)**2+(YCA-YA)**2+(ZCA-ZA)**2,
         BSR         ARAC            < CALCUL DE LA DISTANCE DE 'MCA' A 'A',
         BSR         ATSFLO
         #/FST#      DMCAA           < DMCAA=D(MCA,A).
         FAD         DCMCA
         #/FST#      DCMCAA          < DCMCAA=D(C,MCA)+D(MCA,A)...
         LAI         XSEGCA
         BSR         ASEGMU          < POSITION DU SEGMENT (C,A) --> 'Y'...
         FLD         &AVRUAS         < UA,
         BSR         APERIU
         FMP         DCMCA           < D(C,MCA)*UA,
         BSR         ASFWOR          < ET SAVE...
         FLD         &AVRUCS         < UC,
         BSR         APERIU
         FMP         DMCAA           < D(MCA,A)*UC,
         BSR         APFWOR          < D(C,MCA)*UA+D(MCA,A)*UC,
         FDV         DCMCAA
         BSR         ATSFLO
         BSR         APSEGU          < POSITIONNEMENT SUR LA PERIODE DE 'U'...
         #/FST#      VARUB           < UB <-- UCA=(D(C,MCA)*UA+D(MCA,A)*UC))/
                                     <            (D(C,MCA)+D(MCA,A)).
         LAI         XSEGCA
         BSR         ASEGMV          < POSITION DU SEGMENT (C,A) --> 'Y'...
         FLD         &AVRVAS         < VA,
         BSR         APERIV
         FMP         DCMCA           < D(C,MCA)*VA,
         BSR         ASFWOR          < ET SAVE...
         FLD         &AVRVCS         < VC,
         BSR         APERIV
         FMP         DMCAA           < D(MCA,A)*VC,
         BSR         APFWOR          < D(C,MCA)*VA+D(MCA,A)*VC,
         FDV         DCMCAA
         BSR         ATSFLO
         BSR         APSEGV          < POSITIONNEMENT SUR LA PERIODE DE 'V'...
         #/FST#      VARVB           < VB <-- VCA=(D(C,MCA)*VA+D(MCA,A)*VC))/
                                     <            (D(C,MCA)+D(MCA,A)).
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'MABC' :
<
                                     < ELLES SONT INCHANGEES :
                                     < UABC=(DB*DC*UA+DC*DA*UB+DA*DB*UC)/
                                     <      (DB*DC+DC*DA+DA*DB)...
                                     < VABC=(DB*DC*VA+DC*DA*VB+DA*DB*VC)/
                                     <      (DB*DC+DC*DA+DA*DB)...
<
< GENERATION DE LA BOULE MINIMALE
< ASSOCIEE A LA FACETTE "EXTERNE" :
<
         BSR         ASPHER
<
< GENERATION ET TRACE DE LA FACETTE :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         ISGNFE          < GENERE-T'ON LES FACETTES "EXTERNES" ???
         JE          E206            < NON...
         LAI         NUFACE+I+I+I+I
         BSR         ASP1D           < ENVOI DE LA CINQUIEME FACETTE "EXTERNE".
E206:    EQU         $
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         BSR         ASP1E           < ET TRACE GRAPHIQUE...
XOPT1:   VAL         ENDIF
<
<
<        F A C E T T E   ( M C A , A , M A B C )  :
<
<
<
< GENERATION DES 3 SOMMETS :
<
         LRM         A,B
         WORD        CCA3D
         WORD        CA3D
         BSR         AMOVE3          < PREMIER SOMMET <-- 'MCA'.
         LRM         A,B
         WORD        CA3DS
         WORD        CB3D
         BSR         AMOVE3          < DEUXIEME SOMMET <-- 'A'.
                                     < (TROISIEME SOMMET INCHANGE : 'MABC')
<
< GENERATION DES NORMALES
< A LA SURFACE AUX 3 SOMMETS :
<
         LRM         A,B
         WORD        NX3D
         WORD        NA3D
         BSR         AMOVE3          < LA NORMALE EN 'MCA' EST INDEFINIE...
         LRM         A,B
         WORD        NA3DS
         WORD        NB3D
         BSR         AMOVE3          < VECTEUR NORMAL EN 'A'.
                                     < (NORMALE EN 'MABC' TOUJOURS INDEFINIE)
<
< EQUATION DU PLAN DE LA FACETTE :
<
         LRM         A,B
         WORD        NA3DS
         WORD        PLAN3D
         BSR         AMOVE3          < C'EST LE PLAN TANGENT EN 'A'.
         LRM         A,B
         WORD        NA3DS           < (A)=ADRESSE DE (XNAS,YNAS,ZNAS),
         WORD        CA3DS           < (B)=ADRESSE DE (FXSAS,FYSAS,FZSAS).
         BSR         APRSCA          < XN*XA+YN*YA+ZN*ZA,
         BSR         AFNEG           < -XN*XA-YN*YA-ZN*ZA,
         #/FST#      PLAND           < SOIT LE COEFFICIENT 'D' DU PLAN DE LA
                                     < FACETTE...
<
< IDENTIFICATEURS DES SOMMETS
< DE LA FACETTE COURANTE :
<
         LA          IDENTX
         LB          &AIDNAS
         STA         IDENTA          < SOMMET 'MCA',
         STB         IDENTB          < SOMMET 'A',
                                     < (IDENTIFICATEUR DE 'MABC' INCHANGE)
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'MCA' :
<
         LAI         XSEGCA
         BSR         ASEGMU          < POSITION DU SEGMENT (C,A) --> 'Y'...
         FLD         &AVRUAS         < UA,
         BSR         APERIU
         FMP         DCMCA           < D(C,MCA)*UA,
         BSR         ASFWOR          < ET SAVE...
         FLD         &AVRUCS         < UC,
         BSR         APERIU
         FMP         DMCAA           < D(MCA,A)*UC,
         BSR         APFWOR          < D(C,MCA)*UA+D(MCA,A)*UC,
         FDV         DCMCAA
         BSR         ATSFLO
         BSR         APSEGU          < POSITIONNEMENT SUR LA PERIODE DE 'U'...
         #/FST#      VARUA           < UA <-- UAB=(D(C,MCA)*UA+D(MCA,A)*UC))/
                                     <            (D(C,MCA)+D(MCA,A)).
         LAI         XSEGCA
         BSR         ASEGMV          < POSITION DU SEGMENT (C,A) --> 'Y'...
         FLD         &AVRVAS         < VA,
         BSR         APERIV
         FMP         DCMCA           < D(C,MCA)*VA,
         BSR         ASFWOR          < ET SAVE...
         FLD         &AVRVCS         < VC,
         BSR         APERIV
         FMP         DMCAA           < D(MCA,A)*VC,
         BSR         APFWOR          < D(C,MCA)*VA+D(MCA,A)*VC,
         FDV         DCMCAA
         BSR         ATSFLO
         BSR         APSEGV          < POSITIONNEMENT SUR LA PERIODE DE 'V'...
         #/FST#      VARVA           < VA <-- VAB=(D(C,MCA)*VA+D(MCA,A)*VC))/
                                     <            (D(C,MCA)+D(MCA,A)).
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'A' :
<
         FLD         &AVRUAS
         #/FST#      VARUB           < UB <-- UA,
         FLD         &AVRVAS
         #/FST#      VARVB           < VB <-- VA.
<
< COORDONNEES CURVILIGNES
< AU SOMMET 'MABC' :
<
                                     < ELLES SONT INCHANGEES :
                                     < UABC=(DB*DC*UA+DC*DA*UB+DA*DB*UC)/
                                     <      (DB*DC+DC*DA+DA*DB)...
                                     < VABC=(DB*DC*VA+DC*DA*VB+DA*DB*VC)/
                                     <      (DB*DC+DC*DA+DA*DB)...
<
< GENERATION DE LA BOULE MINIMALE
< ASSOCIEE A LA FACETTE "EXTERNE" :
<
         BSR         ASPHER
<
< GENERATION ET TRACE DE LA FACETTE :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         ISGNFE          < GENERE-T'ON LES FACETTES "EXTERNES" ???
         JE          E207            < NON...
         LAI         NUFACE+I+I+I+I+I
         BSR         ASP1D           < ENVOI DE LA SIXIEME FACETTE "EXTERNE".
E207:    EQU         $
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         BSR         ASP1E           < ET TRACE GRAPHIQUE...
XOPT1:   VAL         ENDIF
<
< ET RETOUR :
<
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        E N V O I   D ' U N E   F A C E T T E   A U   ' S G N '  :
<
<
<        FONCTION :
<                      CE MODULE ENVOIE UNE FACETTE
<                    "INTERNE" OU "EXTERNE" AU 'SGN'
<                    APRES AVOIR COMPLETE SON NOM, ET
<                    INSERE SON TYPE "INTERNE"/"EXTERNE"...
<
<
<        ARGUMENT :
<                    (A)=NUMERO DE FACETTE ("0" POUR "INTERNE", ET
<                        SUIVANTS POUR LES FACETTES "EXTERNES").
<
<
SP1D:    EQU         $
<
< INITIALISATIONS :
<
         PSR         A,X
         STBY        NFACE2          < MISE EN PLACE DU NUMERO DE LA FACETTE
                                     < DANS SON NOM...
<
< "TYPE" DE LA FACETTE :
<
         IF          NUFACI-NUFACE,XEIF%,,XEIF%
         IF          ATTENTION : ON NE PEUT DISCRIMINER LES
         IF          FACETTES "INTERNES" DES FACETTES "EXTERNES" !!!
XEIF%:   VAL         ENDIF
         CPI         NUFACI          < EST-CE UNE FACETTE "INTERNE" ???
         LAI         XITYPE          < OUI A PRIORI...
         JE          SP1D2           < OUI : (A)=TYPE "INTERNE"...
         LAI         XETYPE          < NON : (A)=TYPE "EXTERNE"...
SP1D2:   EQU         $
         STA         FTYPE           < ET MEMORISATION DU TYPE DE LA FACETTE...
<
< CALCUL DE L'OCTANT DU
< VECTEUR NORMAL AU PLAN :
<
         LAI         K               < INITIALISATION DE 'FOCTA',
         FCMZ        PLANA           < TEST DE 'XN' ???
         JGE         SP1D3           < POSITIF OU NUL...
         SBT         NBITMO-B        < NEGATIF : ON LE MARQUE...
SP1D3:   EQU         $
         SLLS        S               < ET CADRAGE...
         FCMZ        PLANB           < TEST DE 'YN' ???
         JGE         SP1D4           < POSITIF OU NUL...
         SBT         NBITMO-B        < NEGATIF : ON LE MARQUE...
SP1D4:   EQU         $
         SLLS        S               < ET CADRAGE...
         FCMZ        PLANC           < TEST DE 'ZN' ???
         JGE         SP1D5           < POSITIF OU NUL...
         SBT         NBITMO-B        < NEGATIF : ON LE MARQUE...
SP1D5:   EQU         $
XWOR%1:  VAL         DFLOT=K
         IF          BIT>XWOR%1-DFLOT,,XEIF%,
         IF          ATTENTION : 'DFLOT' N'EST PAS UNE PUISSANCE DE 2 !!!
XEIF%:   VAL         ENDIF
         SLLS        XWOR%1          < ET CONVERSION EN UN INDEX FLOTTANT,
         STA         FOCTA           < QUE L'ON MEMORISE...
<
< ENVOI AU 'SGN' :
<
         LRM         A
         WORD        DEMDFA
         SVC                         < DESTRUCTION PRELIMINAIRE...
         LRM         A
         WORD        DEMSFA
         SVC                         < ET ENVOI DE LA FACETTE COURANTE AU 'SGN',
         JE          SP1D1           < OK...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
SP1D1:   EQU         $
<
< ET RETOUR :
<
         PLR         A,X
         RSR
         PAGE
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
<
<        T R A C E   D ' U N E   F A C E T T E   " E X T E R N E "  :
<
<
<        FONCTION :
<                      CE MODULE PREND LA FACETTE
<                    "EXTERNE" (A,B,C) COURANTE,
<                    LA PROJETTE ET LA TRACE SUR
<                    L'ECRAN.
<
<
SP1E:    EQU         $
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IWGFE           < TRACE-T'ON LES FACETTES "EXTERNES" ???
         JE          E208            < NON...
<
< INITIALISATIONS :
<
         PSR         A,B,X
         LAD         DEMOG
         SVC                         < DECHAINAGE DE LA FACETTE COURANTE...
<
< PREMIER SOMMET :
<
         LRM         A,B
         WORD        CA3D
         WORD        CS3D
         BSR         AMOVE3          < RECUPERATION DU SOMMET 'A',
         BSR         APROJ           < ET PROJECTION,
         BSR         ASP4            < ET MISE EN PLACE DE L'ORIGINE DU TRACE...
<
< DEUXIEME SOMMET :
<
         LRM         A,B
         WORD        CB3D
         WORD        CS3D
         BSR         AMOVE3          < RECUPERATION DU SOMMET 'B',
         BSR         APROJ           < ET PROJECTION,
         BSR         ASP2B           < PUIS TRACE DU COTE 'AB', ET CHAINAGE...
<
< TROISIEME SOMMET :
<
         LRM         A,B
         WORD        CC3D
         WORD        CS3D
         BSR         AMOVE3          < RECUPERATION DU SOMMET 'C',
         BSR         APROJ           < ET PROJECTION,
         BSR         ASP2B           < PUIS TRACE DU COTE 'BC', ET CHAINAGE...
<
< RETOUR AU PREMIER SOMMET :
<
         LRM         A,B
         WORD        CA3D
         WORD        CS3D
         BSR         AMOVE3          < RECUPERATION DU SOMMET 'A',
         BSR         APROJ           < ET PROJECTION,
         BSR         ASP2B           < PUIS TRACE DU COTE 'CA'...
<
< ET RETOUR :
<
         PLR         A,B,X
E208:    EQU         $
         RSR
XOPT1:   VAL         ENDIF
         PAGE
<
<
<        D E T E R M I N A T I O N   D E   L A   P L U S
<        P E T I T E   S P H E R E   E N V E L O P P A N T
<        L A   F A C E T T E   C O U R A N T E  :
<
<
<        FONCTION :
<                      SI L'ON ENVELOPPE CHAQUE FACETTE
<                    D'UNE SPHERE MINIMALE OBTENUE A
<                    PARTIR DU CERCLE CIRCONSCRIT A
<                    LA FACETTE 'ABC', IL EST POSSIBLE,
<                    AVANT DE DETERMINER L'INTERSECTION
<                    D'UNE DROITE 'D' AVEC CETTE FACETTE
<                    'ABC', DE REGARDER SI L'EQUATION DU
<                    SECOND DEGRE DONNANT L'INTERSECTION
<                    DE LA DROITE 'D' ET DE LA SPHERE
<                    MINIMALE A DES SOLUTIONS REELLES
<                    PAR EXAMEN DE SON DISCRIMINANT...
<
<                    EQUATION DE LA SPHERE :
<
<                                    (X-XO)**2+(Y-YO)**2+(Z-ZO)**2=R**2,
<
<                    LES 3 POINTS 'A', 'B' ET 'C' LA VERIFIENT :
<
<                    (1)             (XA-XO)**2+(YA-YO)**2+(ZA-ZO)**2=R**2,
<                    (2)             (XB-XO)**2+(YB-YO)**2+(ZB-ZO)**2=R**2,
<                    (3)             (XC-XO)**2+(YC-YO)**2+(ZC-ZO)**2=R**2,
<
<                    DE PLUS LE CENTRE 'O' DU CERCLE EST DANS LE PLAN 'ABC' :
<
<                                    I  XO-XA  YO-YA  ZO-ZA  I
<                    (4)             I  XB-XA  YB-YA  ZB-ZA  I = 0
<                                    I  XC-XA  YC-YA  ZC-ZA  I
<
<                    POSONS :
<                                    DA**2=XA**2+YA**2+ZA**2,
<                                    DB**2=XB**2+YB**2+ZB**2,
<                                    DC**2=XC**2+YC**2+ZC**2,
<
<                    ET :
<
<                                           I  YB-YA  ZB-ZA  I
<                                    COX = +I                I
<                                           I  YC-YA  ZC-ZA  I
<
<                                           I  XB-XA  ZB-ZA  I
<                                    COY = -I                I
<                                           I  XC-XA  ZC-ZA  I
<
<                                           I  XB-XA  YB-YA  I
<                                    COZ = +I                I
<                                           I  XC-XA  YC-YA  I
<
<                    PAR UNE SIMPLE MANIPULATION, ON A LE SYSTEME 3*3
<                    EN (XO,YO,ZO) :
<
<        (1)-(2)     (XB-XA)*XO+(YB-YA)*YO+(ZB-ZA)*ZO=(DB**2-DA**2)/2
<        (1)-(3)     (XC-XA)*XO+(YC-YA)*YO+(ZC-ZA)*ZO=(DC**2-DA**2)/2
<        (4)             COX*XO    +COY*YO    +COZ*ZO=COX*XA+COY*YA+COZ*ZA
<
<                    ENFIN, LE CARRE DU RAYON EST DONNE PAR (1), (2) OU (3)...
<
<
<        RESULTAT :
<                      LE CENTRE (FXSO,FYSO,FZSO),
<                    AINSI QUE LE CARRE DU RAYON DE
<                    LA SPHERE CIRCONSCRITE MINIMALE
<                    SONT RANGES DANS LA FACETTE COU-
<                    RANTE.
<
<
SPHERE:  EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
<
< INITIALISATION DU MODULE
< DE RESOLUTION DES SYSTEMES
< LINEAIRES 3*3, INITIALI-
< SATION DES COEFFICIENTS :
<
         LAD         M11
         STA         AM11
         LAD         M12
         STA         AM12
         LAD         M13
         STA         AM13
         LAD         M21
         STA         AM21
         LAD         M22
         STA         AM22
         LAD         M23
         STA         AM23
         LAD         M31
         STA         AM31
         LAD         M32
         STA         AM32
         LAD         M33
         STA         AM33
<
< INITIALISATION DU MODULE
< DE RESOLUTION DES SYSTEMES
< LINEAIRES 3*3, INITIALI-
< SATION DES VARIABLES :
<
         LAD         FXSO
         STA         AVARX           < PREMIERE VARIABLE : XO,
         LAD         FYSO
         STA         AVARY           < DEUXIEME VARIABLE : YO,
         LAD         FZSO
         STA         AVARZ           < TROISIEME VARIABLE : ZO.
<
< CALCUL DU VECTEUR LIGNE 'AB' :
<
         #/FLD#      FXSB            < XB,
         FSB         FXSA            < XB-XA,
         #/FST#      M11             < M11=XB-XA.
         #/FLD#      FYSB            < YB,
         FSB         FYSA            < YB-YA,
         #/FST#      M12             < M12=YB-YA.
         #/FLD#      FZSB            < ZB,
         FSB         FZSA            < ZB-ZA,
         #/FST#      M13             < M13=ZB-ZA.
<
< CALCUL DU VECTEUR LIGNE 'AC' :
<
         #/FLD#      FXSC            < XC,
         FSB         FXSA            < XC-XA,
         #/FST#      M21             < M21=XC-XA.
         #/FLD#      FYSC            < YC,
         FSB         FYSA            < YC-YA,
         #/FST#      M22             < M22=YC-YA.
         #/FLD#      FZSC            < ZC,
         FSB         FZSA            < ZC-ZA,
         #/FST#      M23             < M23=ZC-ZA.
<
< CALCUL DES 3 DISTANCES DES
< POINTS 'A', 'B' ET 'C' A
< L'ORIGINE DES COORDONNEES :
<
         LRM         A,B
         WORD        CA3D            < (A)=VECTEUR ORIGINE --> 'A',
         WORD        CA3D            < (B)=VECTEUR ORIGINE --> 'A',
         BSR         APRSCA          < XA**2+YA**2+ZA**2,
         #/FST#      M34             < ET SAVE TEMPORAIRE DA**2...
         LRM         A,B
         WORD        CB3D            < (A)=VECTEUR ORIGINE --> 'B',
         WORD        CB3D            < (B)=VECTEUR ORIGINE --> 'B',
         BSR         APRSCA          < XB**2+YB**2+ZB**2,
                                     < SOIT DB**2,
         FSB         M34             < DB**2-DA**2,
         FMP         F05             < (DB**2-DA**2)/2,
         #/FST#      M14             < M14=(DB**2-DA**2)/2.
         LRM         A,B
         WORD        CC3D            < (A)=VECTEUR ORIGINE --> 'C',
         WORD        CC3D            < (B)=VECTEUR ORIGINE --> 'C',
         BSR         APRSCA          < XC**2+YC**2+ZC**2,
                                     < SOIT DC**2,
         FSB         M34             < DC**2-DA**2,
         FMP         F05             < (DC**2-DA**2)/2,
         #/FST#      M24             < M24=(DC**2-DA**2)/2.
<
< CALCUL DES COFACTEURS (M31,M32,M33) :
<
<        M31=+(M12*M23-M13*M22),
<        M32=-(M11*M23-M21*M13),
<        M33=+(M11*M22-M21*M12).
<
         #/FLD#      M13             < ZB-ZA,
         FMP         M22             < (ZB-ZA)*(YC-YA),
         BSR         ASFWOR
         #/FLD#      M12             < YB-YA,
         FMP         M23             < (YB-YA)*(ZC-ZA),
         FSB         FWORK           < (YB-YA)*(ZC-ZA)-(ZB-ZA)*(YC-YA),
         #/FST#      M31             < SOIT 'M31' OU 'COX'.
         #/FLD#      M11             < XB-XA,
         FMP         M23             < (XB-XA)*(ZC-ZA),
         BSR         ASFWOR
         #/FLD#      M13             < ZB-ZA,
         FMP         M21             < (ZB-ZA)*(XC-XA),
         FSB         FWORK           < -((XB-XA)*(ZC-ZA)-(ZB-ZA)*(XC-XA)),
         #/FST#      M32             < SOIT 'M32' OU 'COY'.
         #/FLD#      M12             < YB-YA,
         FMP         M21             < (YB-YA)*(XC-XA),
         BSR         ASFWOR
         #/FLD#      M11             < XB-XA,
         FMP         M22             < (XB-XA)*(YC-YA),
         FSB         FWORK           < (XB-XA)*(YC-YA)-(YB-YA)*(XC-XA),
         #/FST#      M33             < SOIT 'M33' OU 'COZ'.
<
< CALCUL DE 'M34' :
<
         LRM         A,B
         WORD        CA3D            < (A)=VECTEUR ORIGINE --> 'A',
         WORD        M31             < (B)=LISTE DES COFACTEURS (M31,M32,M33),
         IF          M32-M31-DFLOT,,XEIF%,
         IF          ATTENTION : LE CALCUL DU PRODUIT SCALAIRE QUI VA
         IF          SUIVRE (ET PEUT-ETRE AILLEURS) VA MERDER !!!
XEIF%:   VAL         ENDIF
         IF          M33-M32-DFLOT,,XEIF%,
         IF          ATTENTION : LE CALCUL DU PRODUIT SCALAIRE QUI VA
         IF          SUIVRE (ET PEUT-ETRE AILLEURS) VA MERDER !!!
XEIF%:   VAL         ENDIF
         BSR         APRSCA          < COX*XA+COY*YA+COZ*ZA,
         #/FST#      M34             < SOIT 'M34'...
<
< RESOLUTION DU SYSTEME
< 3*3 COURANT :
<
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ACRAMR          < ON UTILISE LA METHODE DE CRAMER...
                                     < CE QUI DONNE LE CENTRE (XO,YO,ZO) DE
                                     < LA SPHERE CHERCHEE.
         BSR         ATSFLO
<
< CALCUL DU CARRE DU RAYON :
<
         #/FLD#      FXSA            < XA,
         FSB         FXSO            < (XA-XO),
         #/FST#      FRAYO
         FMP         FRAYO           < (XA-XO)**2,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FYSA            < YA,
         FSB         FYSO            < (YA-YO),
         #/FST#      FRAYO
         FMP         FRAYO           < (YA-YO)**2,
         BSR         APFWOR          < (XA-XO)**2+(YA-YO)**2, ET SAVE...
         #/FLD#      FZSA            < ZA,
         FSB         FZSO            < (ZA-ZO),
         #/FST#      FRAYO
         FMP         FRAYO           < (ZA-ZO)**2,
         BSR         APFWOR          < (XA-XO)**2+(YA-YO)**2+(ZA-ZO)**2,
         #/FST#      FRAYO           < CE QUI DONNE LE CARRE DU RAYON DE LA
                                     < SPHERE CHERCHEE...
<
< ET RETOUR :
<
         PLR         A,B,X
         RSR
XXXPRO:  VAL         YYYCRA          < 'YYYCRA'.
         CALL        #SIP UTILITAIRES#
         PAGE
<
<
<        T R I   D E   T R O I S   N O M B R E S  :
<
<
<        FONCTION :
<                      CE SOUS-PROGRAMME FAIT
<                    LE TRI DE TROIS NOMBRES
<                    ARGUMENTS.
<
<
<        ARGUMENTS :
<                    (AMIN,AMIL,AMAX)=ADRESSES DES TROIS NOMBRES NON TRIES.
<
<
<        RESULTATS :
<                    (AMIN,AMIL,AMAX)=ADRESSES DES TROIS NOMBRES TRIES.
<
<
SPTRI:   EQU         $
<
< DEFINITION DES ADRESSES
< ARGUMENTS/RESULTATS :
<
AMIN:    EQU         DA              < ADRESSE DE MIN(NOMBRE1,NOMBRE2,NOMBRE3),
AMIL:    EQU         DB              < ADRESSE DE MIL(NOMBRE1,NOMBRE2,NOMBRE3),
AMAX:    EQU         DC              < ADRESSE DE MAX(NOMBRE1,NOMBRE2,NOMBRE3),
                                     < AVEC : MIN <= MIL <= MAX...
<
< INITIALISATION :
<
         PSR         A,B
<
< TRI DES TROIS NOMBRES :
<
         FLD         &AMAX           < TEST DE 'MAX' ET 'MIL' COURANTS :
         FCAM        &AMIL
         JGE         SPTRI1          < OK : MAX >= MIL...
         LA          AMAX            < L'ORDRE EST MAUVAIS,
         XM          AMIL            < ON PERMUTE
         STA         AMAX            <            'MAX' ET 'MIL' COURANTS...
SPTRI1:  EQU         $
         FLD         &AMIL           < TEST DE 'MIL' ET 'MIN' COURANTS :
         FCAM        &AMIN
         JGE         SPTRI2          < OK : MIL >= MIN...
         LA          AMIL            < L'ORDRE EST MAUVAIS,
         XM          AMIN            < ON PERMUTE
         STA         AMIL            <            'MIL' ET 'MIN' COURANTS...
SPTRI2:  EQU         $
         FLD         &AMAX           < TEST DE 'MAX' ET 'MIL' COURANTS :
         FCAM        &AMIL
         JGE         SPTRI3          < OK : MAX >= MIL...
         LA          AMAX            < L'ORDRE EST MAUVAIS,
         XM          AMIL            < ON PERMUTE
         STA         AMAX            <            'MAX' ET 'MIL' COURANTS...
SPTRI3:  EQU         $
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
< VALIDATION DU TRI :
<
         FLD         &AMIL           < ACCES A 'MIL' COURANT :
         FCAM        &AMAX           < ET VALIDATION DE 'MAX' COURANT :
         JLE         SPTRI4          < OK : (MIL) <= (MAX)...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
SPTRI4:  EQU         $
         FCAM        &AMIN           < ET VALIDATION DE 'MIN' COURANT :
         JGE         SPTRI5          < OK : (MIL) >= (MIN)...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
SPTRI5:  EQU         $
XOPT1:   VAL         ENDIF
<
< ET RETOUR :
<
         PLR         A,B
         RSR
         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         Y,L,W           < SAUVEGARDE DE 2 BASES ; MAIS 'C' NE DOIT
                                     < PAS ETRE UTILISEE A CAUSE DU BLOC FLOT-
                                     < TANT...
         LR          L,Y             < SAUVEGARDE DE 'L' DANS 'Y' POUR POUVOIR
                                     < ACCEDER EVENTUELLEMENT LE 'LOCAL'...
         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),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      VECT1Y,L        < Y(1),
         FMP         VECT2Y,W        < Y(1)*Y(2),
         BSR         APFWOR          < X(1)*X(2)+Y(1)*Y(2),
                                     < ET SAVE...
         #/FLD#      VECT1Z,L        < Z(1),
         FMP         VECT2Z,W        < Z(1)*Z(2),
         BSR         APFWOR          < (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 MISE DANS 'FWORK', ON NE SAIT
                                     <       JAMAIS...
<
< ET RETOUR :
<
         PLR         Y,L,W
         RSR
         PAGE
<
<
<        C A L C U L   D E   L A   V A L E U R   D E   L ' E Q U A T I O N
<        D ' U N   P L A N   P O U R   L E   P O I N T   C O U R A N T  :
<
<
<        ARGUMENT :
<                    (FXS,FYS,FZS)=POINT 3D COURANT.
<
<
<        RESULTAT :
<                    (A,B)=VALEUR DE L'EQUATION DU PLAN POUR CE POINT.
<
<
SPC:     EQU         $
<
< CALCUL DE L'EQUATION DU PLAN :
<
         LRM         A,B
         WORD        PLAN3D          < (A)=ADRESSE DE (PLANA,PLANB,PLANC),
         WORD        CS3D            < (B)=ADRESSE DE (FXS,FYS,FZS).
         BSR         APRSCA          < A*X+B*Y+C*Z,
         FAD         PLAND           < A*X+B*Y+C*Z+D.
<
< ET RETOUR :
<
         RSR
         PAGE
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
<
<        V E R I F I C A T I O N   D E   L ' E Q U A T I O N   D U
<        P L A N   P O U R   L E S   3   S O M M E T S   ( A , B , C )  :
<
<
SPB:     EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
<
< VERIFICATION POUR 'A' :
<
         LRM         A,B,X
         WORD        CA3D            < (A)=SOMMET 'A',
         WORD        CS3D            < (B)=POINT 3D COURANT,
         WORD        LBUF3D          < (X)=NOMBRE DE MOTS A DEPLACER.
         BSR         ASPD            < VERIFICATION DE 'A' DANS 'P'...
<
< VERIFICATION POUR 'B' :
<
         LRM         A,B,X
         WORD        CB3D            < (A)=SOMMET 'B',
         WORD        CS3D            < (B)=POINT 3D COURANT,
         WORD        LBUF3D          < (X)=NOMBRE DE MOTS A DEPLACER.
         BSR         ASPD            < VERIFICATION DE 'B' DANS 'P'...
<
< VERIFICATION POUR 'C' :
<
         LRM         A,B,X
         WORD        CC3D            < (A)=SOMMET 'C',
         WORD        CS3D            < (B)=POINT 3D COURANT,
         WORD        LBUF3D          < (X)=NOMBRE DE MOTS A DEPLACER.
         BSR         ASPD            < VERIFICATION DE 'C' DANS 'P'...
<
< ET RETOUR :
<
         PLR         A,B,X
         RSR
XOPT1:   VAL         ENDIF
         PAGE
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
<
<        V E R I F I C A T I O N   P O U R   ( A , B , C )
<        D E   L A   P O S I T I O N   D A N S   ' P '  :
<
<
SPD:     EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
<
< MISE EN PLACE DU SOMMET COURANT :
<
         MOVE
         BSR         ASPC            < ET CALCUL DE LA VALEUR DE L'EQUATION DU
                                     < PLAN POUR LE SOMMET COURANT,
         BSR         AFABS
         FCAM        FEPS            < ET VALIDATION :
         JL          SPD1            < OK...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
SPD1:    EQU         $
<
< ET RETOUR :
<
         PLR         A,B,X
         RSR
XOPT1:   VAL         ENDIF
XXXPRO:  VAL         YYYDET          < 'YYYDET'.
         CALL        #SIP UTILITAIRES#
         PAGE
<
<
<        I N T E R S E C T I O N   D ' U N E   D R O I T E
<        E T   D ' U N E   S P H E R E   ( O U   B O U L E )  :
<
<
<        FONCTION :
<                      CHAQUE FACETTE EST ENTOUREE D'UNE
<                    SPHERE (APPELEE ICI "BOULE", CAR
<                    "SPHERE" ET "SURFACE" COMMENCENT TOUS
<                    DEUX PAR LA LETTRE "S") MINIMALE OBTE-
<                    NUE A PARTIR DU CERCLE CIRCONSCRIT AU
<                    TRIANGLE CONSTITUANT LA FACETTE 'ABC' ;
<                    AVANT DE CALCULER L'INTERSECTION EXPLI-
<                    CITE ENTRE LA DROITE 'D' ET LA FACETTE
<                    'ABC', ON REGARDE ICI SI LA DROITE 'D'
<                    COUPE LA BOULE 'B' :
<
<                    EQUATION DE LA BOULE 'B' :
<
<                    (1)             (X-XO)**2+(X-YO)**2+(Z-ZO)**2=R**2,
<
<                    EQUATION DE LA DROITE 'D' :
<
<                    (2)             X=XD+RHO*VX,
<                    (3)             Y=YD+RHO*VY,
<                    (4)             Z=ZD+RHO*VZ.
<
<                    PORTANT (2), (3) ET (4) DANS (1), ON ARRIVE A
<                    UNE EQUATION DU SECOND DEGRE :
<
<                    (VX**2+VY**2+VZ**2)*(RHO**2)+
<                    2*(VX*(XD-XO)+VY*(YD-YO)+VZ*(ZD-ZO))*RHO+
<                    ((XD-XO)**2+(YD-YO)**2+(ZD-ZO)**2-R**2)=0,
<
<                    DONT LE DISCRIMINANT REDUIT 'DELTA' VAUT :
<
<        DELTA=(VX*(XD-XO)+VY*(YD-YO)+VZ*(ZD-ZO))**2-
<              (VX**2+VY**2+VZ**2)*((XD-XO)**2+(YD-YO)**2+(ZD-ZO)**2-R**2),
<
<                    IL SUFFIT DE TESTER LE SIGNE DE 'DELTA'
<                    POUR SAVOIR SI LA DROITE 'D' COUPE LA
<                    BOULE 'B' :
<
<                                    (DELTA)>=0...
<
<
<        ARGUMENT :
<                    DROITE 'D',
<                    BOULE 'B'.
<
<
<        RESULTAT :
<                    BINTER='NEXIST' SI LA DROITE 'D' NE COUPE
<                           PAS LA BOULE 'B', SANS ETRE TANGENTE
<                           NON PLUS,
<                          ='EXIST' SI LA DROITE 'D' COUPE LA
<                           BOULE 'B' EN 1 OU 2 POINTS.
<                    CODES CONDITIONS SUR UN 'CPZ BINTER'...
<
<
INTDB:   EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X,Y
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LES 'STZ' SUIVANTS SONT IDIOTS !!!
XEIF%:   VAL         ENDIF
         STZ         BINTER          < PAS D'INTERSECTION A PRIORI ENTRE 'D'
                                     < ET 'B',
         STZ         PINTER          < NON PLUS QU'ENTRE 'D' ET 'P',
         STZ         SINTER          < ET QU'ENTRE 'D' ET 'S'...
<
< CALCUL DU VECTEUR 'DO' :
<
         #/FLD#      FXSD            < XD,
         FSB         FXSO            < XD-XO,
         #/FST#      M11             < M11=XD-XO,
         #/FLD#      FYSD            < YD,
         FSB         FYSO            < YD-YO,
         #/FST#      M12             < M12=YD-YO.
         #/FLD#      FZSD            < ZD,
         FSB         FZSO            < ZD-ZO,
         #/FST#      M13             < M13=ZD-ZO.
         IF          M12-M11-DFLOT,,XEIF%,
         IF          ATTENTION : LE CALCUL DU PRODUIT SCALAIRE QUI VA
         IF          SUIVRE (ET PEUT-ETRE AILLEURS) VA MERDER !!!
XEIF%:   VAL         ENDIF
         IF          M13-M12-DFLOT,,XEIF%,
         IF          ATTENTION : LE CALCUL DU PRODUIT SCALAIRE QUI VA
         IF          SUIVRE (ET PEUT-ETRE AILLEURS) VA MERDER !!!
XEIF%:   VAL         ENDIF
<
< CALCUL DU CARRE DE LA
< NORME DU VECTEUR DIRECTEUR
< DE LA DROITE 'D' :
<
         LRM         A,B
         WORD        DV3D            < (A)=VECTEUR DIRECTEUR DE 'D',
         WORD        DV3D            < (B)=VECTEUR DIRECTEUR DE 'D',
         BSR         APRSCA          < ET CALCUL DU CARRE DE LA NORME :
         #/FST#      M14             < M14=(VX**2+VY**2+VZ**2).
<
< CALCUL DE LA NORME DU
< VECTEUR 'OD' MOINS LE
< CARRE DU RAYON DE LA
< SPHERE 'B' :
<
         LRM         A,B
         WORD        M11             < (A)=VECTEUR 'OD',
         WORD        M11             < (B)=VECTEUR 'OD',
         BSR         APRSCA          < ET CALCUL DU CARRE DE LA NORME,
         FSB         FRAYO           < AUQUEL ON RETRANCHE R**2,
                                     < SOIT :
                                     < ((XD-XO)**2+(YD-YO)**2+(ZD-ZO)**2-R**2).
         FMP         M14             < PUIS MULTIPLIE PAR LE CARRE DE LA NORME
                                     < DU VECTEUR DIRECTEUR DE 'D',
         #/FST#      M14             < ET QUE L'ON SAUVEGARDE DANS 'M14'...
<
< CALCUL DU PRODUIT SCALAIRE DU
< VECTEUR DIRECTEUR DE LA DROITE
< 'D' ET DU VECTEUR 'OD' :
<
         LRM         A,B
         WORD        DV3D            < (A)=VECTEUR DIRECTEUR DE 'D',
         WORD        M11             < (B)=VECTEUR 'OD',
         BSR         APRSCA          < ET CALCUL DE LEUR PRODUIT SCALAIRE :
         #/FST#      M24             < SAVE TEMPORAIRE,
         FMP         M24             < ET QUE L'ON ELEVE AU CARRE, SOIT :
                                     < (VX*(XD-XO)+VY*(YD-YO)+VZ*(ZD-ZO))**2
<
< CALCUL DU DISCRIMINANT REDUIT
< DE L'EQUATION DU SECOND DEGRE
< D'INTERSECTION DE 'D' ET DE 'B' :
<
         FSB         M14             < FACILE...
<
< TEST DES RACINES DE L'EQUATION :
<
         BSR         AFCAZ           < QUEL EST LE SIGNE DU DISCRIMINANT ???
         JL          INTDB1          < NEGATIF, L'EQUATION N'A DONC PAS DE
                                     < RACINES REELLES...
         IF          EXIST-K,,,XEIF%
         IF          ATTENTION : LE 'IC' QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         IC          BINTER          < POSITIF OU NUL, L'EQUATION A DONC
                                     < UNE OU DEUX RACINES, ET DONC 'D'
                                     < COUPE 'B' EN 1 OU 2 POINTS...
<
< ET RETOUR :
<
INTDB1:  EQU         $
         CPZ         BINTER          < POSITIONNEMENT DES INDICATEURS...
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        I N T E R S E C T I O N   D ' U N E   D R O I T E
<                    E T   D ' U N   P L A N  :
<
<
<        FONCTION :
<                      CE MODULE CALCULE L'INTERSECTION
<                    D'UNE DROITE DEFINIE PAR UN POINT
<                    D(FXSD,FYSD,FZSD) ET UN VECTEUR
<                    DIRECTEUR DV(DVX,DVY,DVZ), ET D'UN
<                    PLAN P(PLANA,PLANB,PLANC,PLAND).
<
<
<        ARGUMENT :
<                    DROITE 'D',
<                    PLAN 'P'.
<
<
<        RESULTAT :
<                    PINTER='NEXIST' SI LE POINT D'INTERSECTION
<                           N'EXISTE PAS ('D' PARALLELE A 'P'),
<                          ='EXIST', ALORS (FXSM,FYSM,FZSM)
<                           EST LE POINT D'INTERSECTION.
<                    LES INDICATEURS SONT POSITIONNES SUR UN 'CPZ PINTER'...
<
<
INTDP:   EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X,Y
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LES 'STZ' SUIVANTS SONT IDIOTS !!!
XEIF%:   VAL         ENDIF
         STZ         PINTER          < PAS D'INTERSECTION A PRIORI ENTRE 'D'
                                     < ET 'P',
         STZ         SINTER          < NON PLUS QU'ENTRE 'D' ET 'S'...
         CPZ         BINTER          < 'D' COUPE-T'ELLE LA BOULE 'B' ???
         JE          INTDP3          < NON, PAS LA PEINE DE CALCULER L'INTER-
                                     < SECTION DE 'D' ET DE 'P'...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE 'CPZ' CI-DESSUS EST IDIOT !!!
XEIF%:   VAL         ENDIF
<
< TEST DE PARALLELISME DE 'D' ET 'P' :
<
         LRM         A,B
         WORD        PLAN3D          < (A)=ADRESSE DE (PLANA,PLANB,PLANC),
         WORD        DV3D            < (B)=ADRESSE DE (DVX,DVY,DVZ).
         BSR         APRSCA          < A*VX+B*VY+C*VZ ; LA NULLITE DE CETTE
                                     < QUANTITE (PRODUIT SCALAIRE DU VECTEUR
                                     < DIRECTEUR DE LA DROITE ET DU VECTEUR
                                     < NORMAL AU PLAN) INDIQUE LE PARALLELISME.
         BSR         AFCAZ           < 'D' EST-ELLE PARALLELE A 'P' ???
         JNE         INTDP4          < NON...
         FCMZ        DVX             < OUI, (VX)=0 ???
         JNE         INTDP3          < NON...
         FCMZ        DVY             < OUI, (VY)=0 ???
         JNE         INTDP3          < NON...
         FCMZ        DVZ             < OUI, (VZ)=0 ???
         JNE         INTDP3          < NON...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
                                     < LA DROITE 'D' EST INDETERMINEE !!!
INTDP3:  EQU         $
         BSR         AGOTO
         WORD        INTDP1          < (PINTER)='NEXIST'...
                                     < NOTONS, QUE LA DROITE 'D' EST PEUT-ETRE
                                     < PARALLELE AU PLAN 'P', MAIS QU'IL PEUT
                                     < S'AGIR AUSSI D'UNE INDETERMINATION SUR
                                     < LA DROITE 'D', TELLE QUE (VX)=(VY)=(VZ)=0
                                     < CE QUI EST PIRE...
INTDP4:  EQU         $
<
< 'P' ET 'D' NE SONT PAS
< PARALLELES, CALCULONS
< LE PARAMETRE DU POINT 'M'
< D'INTERSECTION DE 'P' ET DE 'D' :
<
         #/FST#      FRHOM           < ON SAUVEGARDE TEMPORAIREMENT LE PRODUIT
                                     < SCALAIRE A*VX+B*VY+C*VZ DANS 'FRHOM'...
         LRM         A,B
         WORD        PLAN3D          < (A)=ADRESSE DE (PLANA,PLANB,PLANC),
         WORD        CD3D            < (B)=ADRESSE DE (FXSD,FYSD,FZSD).
         BSR         APRSCA          < A*XD+B*YD+C*ZD,
         FAD         PLAND           < A*XD+B*YD+C*ZD+D,
         FDV         FRHOM           < (A*XD+B*YD+C*ZD+D)/(A*VX+B*VY+C*VZ) ; A
                                     < NOTER QUE SI CETTE QUANTITE EST NULLE,
                                     < ALORS 'M'='D'...
         BSR         ATSFLO
         BSR         AFNEG
         #/FST#      FRHOM           < LE PARAMETRE 'FRHOM' EST LE PARAMETRE
                                     < DE DEFINITION DU POINT D'INTERSECTION DE
                                     < 'P' ET DE 'D' SUR 'D'...
<
< CALCUL DES COORDONNEES
< DU POINT 'M' :
<
         #/FLD#      DVX             < VX,
         FMP         FRHOM           < RHOM*VX,
         FAD         FXSD            < XD+RHOM*VX,
         #/FST#      FXSM            < XM=XD+RHOM*VX.
         #/FLD#      DVY             < VY,
         FMP         FRHOM           < RHOM*VY,
         FAD         FYSD            < YD+RHOM*VY,
         #/FST#      FYSM            < YM=YD+RHOM*VY.
         #/FLD#      DVZ             < VZ,
         FMP         FRHOM           < RHOM*VZ,
         FAD         FZSD            < ZD+RHOM*VZ,
         #/FST#      FZSM            < ZM=ZD+RHOM*VZ.
<
< CALCUL DES COORDONNEES
< BARYCENTRIQUES DE 'M'
< DANS LE TRIANGLE (A,B,C) :
<
<
< ON DOIT RESOUDRE LE SYSTEME
< SUIVANT QUI REND COMPTE DU
< FAIT QUE LE POINT 'M' APPAR-
< TIENT A LA DROITE 'D', ET
< QU'IL EST DANS LE PLAN 'ABC',
< SES COORDONNEES VERIFIENT
< DONC SIMULTANEMENT :
<
<        XM=XD+RHOM*VX,
<        YM=YD+RHOM*VY,
<        ZM=ZD+RHOM*VZ,
<
< ET :
<
<        XM=ALPHA*XA+BETA*XB+GAMMA*XC,
<        YM=ALPHA*YA+BETA*YB+GAMMA*YC,
<        ZM=ALPHA*ZA+BETA*ZB+GAMMA*ZC.
<
< ENFIN, (ALPHA,BETA,GAMMA)
< ETANT DES COORDONNEES BARY-
< CENTRIQUES, ON A :
<
<        ALPHA+BETA+GAMMA=1.
<
< D'OU LE SYSTEME :
<
<        ALPHA*XA+BETA*XB+GAMMA*XC=XD+RHOM*VX,
<        ALPHA*YA+BETA*YB+GAMMA*YC=YD+RHOM*VY,
<        ALPHA*ZA+BETA*ZB+GAMMA*ZC=ZD+RHOM*VZ,
<        ALPHA   +BETA   +GAMMA   =1,
<
INTDP5:  EQU         $
<
< DEFINITION DE LA MATRICE M(I,J) :
<
         LAD         M11
         STA         AM11
         LAD         M12
         STA         AM12
         LAD         M13
         STA         AM13
         LAD         M21
         STA         AM21
         LAD         M22
         STA         AM22
         LAD         M23
         STA         AM23
         LAD         F1
         STA         AM31
         LAD         F1
         STA         AM32
         LAD         F1
         STA         AM33
<
< AIGUILLAGE SUIVANT LA VALEUR
< DES COMPOSANTES (VX,VY,VZ) :
<
         FCMZ        DVX             < (VX) EST-IL DIFFERENT DE 0 ???
         JE          INTDP6          < NON, IL EST NUL, ALLONS TESTER LA
                                     < COORDONNEE SUIVANTE DU VECTEUR 'D'...
<
< CAS (VX)#0 :
<
< ON DOIT RESOUDRE LE SYSTEME :
<
<        ALPHA*(VX*YA-VY*XA)+BETA*(VX*YB-VY*XB)+GAMMA*(VX*YC-VY*XC)=VX*YD-VY*XD,
<        ALPHA*(VX*ZA-VZ*XA)+BETA*(VX*ZB-VZ*XB)+GAMMA*(VX*ZC-VZ*XC)=VX*ZD-VZ*XD,
<        ALPHA              +BETA              +GAMMA              =1.
<
< QUI EST EN FAIT UNE REDUCTION
< PAR ELIMINATION DE 'RHOM' DANS
< LA PREMIERE EQUATION (AVEC (VX)#0)
< DU SYSTEME SUIVANT :
<
<        ALPHA*XA+BETA*XB+GAMMA*XC=XD+RHOM*VX,
<        ALPHA*YA+BETA*YB+GAMMA*YC=YD+RHOM*VY,
<        ALPHA*ZA+BETA*ZB+GAMMA*ZC=ZD+RHOM*VZ,
<        ALPHA   +BETA   +GAMMA   =1,
<
< CALCUL DES M(I,J) :
<
         #/FLD#      DVY             < VY,
         FMP         FXSA            < VY*XA,
         BSR         ASFWOR
         #/FLD#      DVX             < VX,
         FMP         FYSA            < VX*YA,
         FSB         FWORK           < VX*YA-VY*XA,
         #/FST#      M11             < M11=VX*YA-VY*XA.
         #/FLD#      DVY             < VY,
         FMP         FXSB            < VY*XB,
         BSR         ASFWOR
         #/FLD#      DVX             < VX,
         FMP         FYSB            < VX*YB,
         FSB         FWORK           < VX*YB-VY*XB,
         #/FST#      M12             < M12=VX*YB-VY*XB.
         #/FLD#      DVY             < VY,
         FMP         FXSC            < VY*XC,
         BSR         ASFWOR
         #/FLD#      DVX             < VX,
         FMP         FYSC            < VX*YC,
         FSB         FWORK           < VX*YC-VY*XC,
         #/FST#      M13             < M13=VX*YC-VY*XC.
         #/FLD#      DVY             < VY,
         FMP         FXSD            < VY*XD,
         BSR         ASFWOR
         #/FLD#      DVX             < VX,
         FMP         FYSD            < VX*YD,
         FSB         FWORK           < VX*YD-VY*XD,
         #/FST#      M14             < M14=VX*YD-VY*XD.
         #/FLD#      DVZ             < VZ,
         FMP         FXSA            < VZ*XA,
         BSR         ASFWOR
         #/FLD#      DVX             < VX,
         FMP         FZSA            < VX*ZA,
         FSB         FWORK           < VX*ZA-VZ*XA,
         #/FST#      M21             < M21=VX*ZA-VZ*XA.
         #/FLD#      DVZ             < VZ,
         FMP         FXSB            < VZ*XB,
         BSR         ASFWOR
         #/FLD#      DVX             < VX,
         FMP         FZSB            < VX*ZB,
         FSB         FWORK           < VX*ZB-VZ*XB,
         #/FST#      M22             < M22=VX*ZB-VZ*XB.
         #/FLD#      DVZ             < VZ,
         FMP         FXSC            < VZ*XC,
         BSR         ASFWOR
         #/FLD#      DVX             < VX,
         FMP         FZSC            < VX*ZC,
         FSB         FWORK           < VX*ZC-VZ*XC,
         #/FST#      M23             < M23=VX*ZC-VZ*XC.
         #/FLD#      DVZ             < VZ,
         FMP         FXSD            < VZ*XD,
         BSR         ASFWOR
         #/FLD#      DVX             < VX,
         FMP         FZSD            < VX*ZD,
         FSB         FWORK           < VX*ZD-VZ*XD,
         #/FST#      M24             < M24=VX*ZD-VZ*XD.
<
< CALCUL DU DETERMINANT :
<
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ADETER          < (A,B)=DETERMINANT, ET VALIDATION :
         JE          INTDP6          < IL EST NUL, ALLONS ESSAYER DE RESOUDRE
                                     < PAR RAPPORT A 'VY'...
         BSR         AGOTO
         WORD        INTDP9          < OK, NON NUL : VERS LA RESOLUTION DU
                                     < SYSTEME...
<
< CAS (VX)=0 :
<
INTDP6:  EQU         $
         FCMZ        DVY             < (VY) EST-IL DIFFERENT DE 0 ???
         JE          INTDP7          < NON, IL EST NUL, ALLONS TESTER LA
                                     < COORDONNEE SUIVANTE DU VECTEUR 'D'...
<
< CAS (VY)#0 :
<
< ON DOIT RESOUDRE LE SXSTEME :
<
<        ALPHA*(VY*XA-VX*YA)+BETA*(VY*XB-VX*YB)+GAMMA*(VY*XC-VX*YC)=VY*XD-VX*YD,
<        ALPHA*(VY*ZA-VZ*YA)+BETA*(VY*ZB-VZ*YB)+GAMMA*(VY*ZC-VZ*YC)=VY*ZD-VZ*YD,
<        ALPHA              +BETA              +GAMMA              =1.
<
< QUI EST EN FAIT UNE REDUCTION
< PAR ELIMINATION DE 'RHOM' DANS
< LA PREMIERE EQUATION (AVEC (VY)#0)
< DU SXSTEME SUIVANT :
<
<        ALPHA*XA+BETA*XB+GAMMA*XC=XD+RHOM*VX,
<        ALPHA*YA+BETA*YB+GAMMA*YC=YD+RHOM*VY,
<        ALPHA*ZA+BETA*ZB+GAMMA*ZC=ZD+RHOM*VZ,
<        ALPHA   +BETA   +GAMMA   =1,
<
< CALCUL DES M(I,J) :
<
         #/FLD#      DVX             < VX,
         FMP         FYSA            < VX*YA,
         BSR         ASFWOR
         #/FLD#      DVY             < VY,
         FMP         FXSA            < VY*XA,
         FSB         FWORK           < VY*XA-VX*YA,
         #/FST#      M11             < M11=VY*XA-VX*YA.
         #/FLD#      DVX             < VX,
         FMP         FYSB            < VX*YB,
         BSR         ASFWOR
         #/FLD#      DVY             < VY,
         FMP         FXSB            < VY*XB,
         FSB         FWORK           < VY*XB-VX*YB,
         #/FST#      M12             < M12=VY*XB-VX*YB.
         #/FLD#      DVX             < VX,
         FMP         FYSC            < VX*YC,
         BSR         ASFWOR
         #/FLD#      DVY             < VY,
         FMP         FXSC            < VY*XC,
         FSB         FWORK           < VY*XC-VX*YC,
         #/FST#      M13             < M13=VY*XC-VX*YC.
         #/FLD#      DVX             < VX,
         FMP         FYSD            < VX*YD,
         BSR         ASFWOR
         #/FLD#      DVY             < VY,
         FMP         FXSD            < VY*XD,
         FSB         FWORK           < VY*XD-VX*YD,
         #/FST#      M14             < M14=VY*XD-VX*YD.
         #/FLD#      DVZ             < VZ,
         FMP         FYSA            < VZ*YA,
         BSR         ASFWOR
         #/FLD#      DVY             < VY,
         FMP         FZSA            < VY*ZA,
         FSB         FWORK           < VY*ZA-VZ*YA,
         #/FST#      M21             < M21=VY*ZA-VZ*YA.
         #/FLD#      DVZ             < VZ,
         FMP         FYSB            < VZ*YB,
         BSR         ASFWOR
         #/FLD#      DVY             < VY,
         FMP         FZSB            < VY*ZB,
         FSB         FWORK           < VY*ZB-VZ*YB,
         #/FST#      M22             < M22=VY*ZB-VZ*YB.
         #/FLD#      DVZ             < VZ,
         FMP         FYSC            < VZ*YC,
         BSR         ASFWOR
         #/FLD#      DVY             < VY,
         FMP         FZSC            < VY*ZC,
         FSB         FWORK           < VY*ZC-VZ*YC,
         #/FST#      M23             < M23=VY*ZC-VZ*YC.
         #/FLD#      DVZ             < VZ,
         FMP         FYSD            < VZ*YD,
         BSR         ASFWOR
         #/FLD#      DVY             < VY,
         FMP         FZSD            < VY*ZD,
         FSB         FWORK           < VY*ZD-VZ*YD,
         #/FST#      M24             < M24=VY*ZD-VZ*YD.
<
< CALCUL DU DETERMINANT :
<
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ADETER          < (A,B)=DETERMINANT, ET VALIDATION :
         JE          INTDP7          < IL EST NUL, ALLONS ESSAYER DE RESOUDRE
                                     < PAR RAPPORT A 'VZ'...
         BSR         AGOTO
         WORD        INTDP9          < OK, NON NUL : VERS LA RESOLUTION DU
                                     < SYSTEME...
<
< CAS (VX)=(VY)=0 :
<
INTDP7:  EQU         $
         FCMZ        DVZ             < (VZ) EST-IL DIFFERENT DE 0 ???
         JE          INTDP8          < NON, IL EST NUL, ALLONS TESTER LA
                                     < COORDONNEE SUIVANTE DU VECTEUR 'D'...
<
< CAS (VZ)#0 :
<
< ON DOIT RESOUDRE LE SXSTEME :
<
<        ALPHA*(VZ*XA-VX*ZA)+BETA*(VZ*XB-VX*ZB)+GAMMA*(VZ*XC-VX*ZC)=VZ*XD-VX*ZD,
<        ALPHA*(VZ*YA-VY*ZA)+BETA*(VZ*YB-VY*ZB)+GAMMA*(VZ*YC-VY*ZC)=VZ*YD-VY*ZD,
<        ALPHA              +BETA              +GAMMA              =1.
<
< QUI EST EN FAIT UNE REDUCTION
< PAR ELIMINATION DE 'RHOM' DANS
< LA PREMIERE EQUATION (AVEC (VZ)#0)
< DU SXSTEME SUIVANT :
<
<        ALPHA*XA+BETA*XB+GAMMA*XC=XD+RHOM*VX,
<        ALPHA*YA+BETA*YB+GAMMA*YC=YD+RHOM*VY,
<        ALPHA*ZA+BETA*ZB+GAMMA*ZC=ZD+RHOM*VZ,
<        ALPHA   +BETA   +GAMMA   =1,
<
< CALCUL DES M(I,J) :
<
         #/FLD#      DVX             < VX,
         FMP         FZSA            < VX*ZA,
         BSR         ASFWOR
         #/FLD#      DVZ             < VZ,
         FMP         FXSA            < VZ*XA,
         FSB         FWORK           < VZ*XA-VX*ZA,
         #/FST#      M11             < M11=VZ*XA-VX*ZA.
         #/FLD#      DVX             < VX,
         FMP         FZSB            < VX*ZB,
         BSR         ASFWOR
         #/FLD#      DVZ             < VZ,
         FMP         FXSB            < VZ*XB,
         FSB         FWORK           < VZ*XB-VX*ZB,
         #/FST#      M12             < M12=VZ*XB-VX*ZB.
         #/FLD#      DVX             < VX,
         FMP         FZSC            < VX*ZC,
         BSR         ASFWOR
         #/FLD#      DVZ             < VZ,
         FMP         FXSC            < VZ*XC,
         FSB         FWORK           < VZ*XC-VX*ZC,
         #/FST#      M13             < M13=VZ*XC-VX*ZC.
         #/FLD#      DVX             < VX,
         FMP         FZSD            < VX*ZD,
         BSR         ASFWOR
         #/FLD#      DVZ             < VZ,
         FMP         FXSD            < VZ*XD,
         FSB         FWORK           < VZ*XD-VX*ZD,
         #/FST#      M14             < M14=VZ*XD-VX*ZD.
         #/FLD#      DVY             < VY,
         FMP         FZSA            < VY*ZA,
         BSR         ASFWOR
         #/FLD#      DVZ             < VZ,
         FMP         FYSA            < VZ*YA,
         FSB         FWORK           < VZ*YA-VY*ZA,
         #/FST#      M21             < M21=VZ*YA-VY*ZA.
         #/FLD#      DVY             < VY,
         FMP         FZSB            < VY*ZB,
         BSR         ASFWOR
         #/FLD#      DVZ             < VZ,
         FMP         FYSB            < VZ*YB,
         FSB         FWORK           < VZ*YB-VY*ZB,
         #/FST#      M22             < M22=VZ*YB-VY*ZB.
         #/FLD#      DVY             < VY,
         FMP         FZSC            < VY*ZC,
         BSR         ASFWOR
         #/FLD#      DVZ             < VZ,
         FMP         FYSC            < VZ*YC,
         FSB         FWORK           < VZ*YC-VY*ZC,
         #/FST#      M23             < M23=VZ*YC-VY*ZC.
         #/FLD#      DVY             < VY,
         FMP         FZSD            < VY*ZD,
         BSR         ASFWOR
         #/FLD#      DVZ             < VZ,
         FMP         FYSD            < VZ*YD,
         FSB         FWORK           < VZ*YD-VY*ZD,
         #/FST#      M24             < M24=VZ*YD-VY*ZD.
<
< CALCUL DU DETERMINANT :
<
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ADETER          < (A,B)=DETERMINANT, ET VALIDATION :
         JNE         INTDP9          < OK, NON NUL : VERS LA RESOLUTION DU
                                     < SYSTEME...
<
< CAS (VX)=(VY)=(VZ)=0, OU
< BIEN, LES TROIS DETERMINANTS
< SONT NULS :
<
INTDP8:  EQU         $
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E...
                                     < NOTONS, QUE VU LE TEST DE PARALLELISME
                                     < ENTRE 'D' ET 'P', ON NE PEUT JAMAIS
                                     < ARRIVER ICI !!!
<
< CALCUL DE (ALPHA,BETA,GAMMA) :
<
INTDP9:  EQU         $
         #/FST#      FDETER          < MEMORISATION DU DETERMINANT (A,B),
         BSR         AFCAZ           < ET REVALIDATION...
         JNE         INTDP2          < OK, IL N'EST PAS NUL...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
INTDP2:  EQU         $
<
< CALCUL DE 'ALPHA' :
<
         LAD         M14
         STA         AM11
         LAD         M24
         STA         AM21            < NOTA : LA TROISIEME EQUATION
                                     < A SES 4 COEFFICIENTS EGAUX A 1, IL EST
                                     < DONC INUTILE DE CHANGER 'AM31' (PUIS
                                     < 'AM32' ET 'AM33'), TOUS POINTANT SUR
                                     < LA CONSTANTE 'F1' ; C'EST AUSSI POURQUOI
                                     < ON N'INITIALISE PAS 'M34'...
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ADETER          < CALCUL DU DETERMINANT (4,2,3),
         FDV         FDETER
         BSR         ATSFLO
         BSR         AFCAZ           < LE POINT 'M' EST-IL INTERIEUR A (A,B,C) ?
         JL          AINDP1          < NON, (PINTER)='NEXIST'...
         FCAM        F1              < LE POINT 'M' EST-IL INTERIEUR A (A,B,C) ?
         JG          AINDP1          < NON, (PINTER)='NEXIST'...
         #/FST#      ALPHA           < ALPHA=DETER(4,2,3)/DETER(1,2,3).
<
< CALCUL DE 'BETA' :
<
         LAD         M11
         XM          AM11
         STA         AM12
         LAD         M21
         XM          AM21
         STA         AM22
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ADETER          < CALCUL DU DETERMINANT (1,4,3),
         FDV         FDETER
         BSR         ATSFLO
         BSR         AFCAZ           < LE POINT 'M' EST-IL INTERIEUR A (A,B,C) ?
         JL          AINDP1          < NON, (PINTER)='NEXIST'...
         FCAM        F1              < LE POINT 'M' EST-IL INTERIEUR A (A,B,C) ?
         JG          AINDP1          < NON, (PINTER)='NEXIST'...
         #/FST#      BETA            < BETA=DETER(1,4,3)/DETER(1,2,3).
<
< CALCUL DE 'GAMMA' :
<
         LAD         M12
         XM          AM12
         STA         AM13
         LAD         M22
         XM          AM22
         STA         AM23
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ADETER          < CALCUL DU DETERMINANT (1,2,4),
         FDV         FDETER
         BSR         ATSFLO
         BSR         AFCAZ           < LE POINT 'M' EST-IL INTERIEUR A (A,B,C) ?
         JL          AINDP1          < NON, (PINTER)='NEXIST'...
         FCAM        F1              < LE POINT 'M' EST-IL INTERIEUR A (A,B,C) ?
         JLE         INTDPC          < OUI...
AINDP1:  EQU         $               < NON, ET RELAI...
         BSR         AGOTO
         WORD        INTDP1          < NON, (PINTER)='NEXIST'...
INTDPC:  EQU         $
         #/FST#      GAMMA           < GAMMA=DETER(1,2,4)/DETER(1,2,3).
<
< LE POINT 'M' EST INTERIEUR
< AU TRIANGLE (A,B,C) :
<
         IF          EXIST-K,,,XEIF%
         IF          ATTENTION : LE 'IC' QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         IC          PINTER          < OK, ON A TROUVE UN POINT D'INTERSECTION
                                     < 'M' (FXSM,FYSM,FZSM) ENTRE LA DROITE
                                     < 'D' ET LE PLAN 'P' QUI SOIT INTERIEUR AU
                                     < TRIANGLE (A,B,C) ; SES COORDONNEES BARY-
                                     < CENTRIQUES SONT (ALPHA,BETA,GAMMA),
                                     < (PINTER)='EXIST'.
<
< CALCUL DE 'VARU' ET 'VARV'
< AU POINT 'M' D'INTERSECTION
< PAR UTILISATION DES COORDON-
< NEES BARYCENTRIQUES DE 'M' :
<
         BSR         APUVM           < CALCUL DE (VARUM,VARVM).
<
< CALCUL DE (FBARI,FBARS) :
<
ABSCOS:  EQU         DADBDC          < POUR MEMORISER LA FONCTION
                                     < 1-ABS(COS(P,D)).
         LRM         A,B
         WORD        PLAN3D          < (A)=ADRESSE DU VECTEUR NORMAL AU
                                     <     PLAN 'P' DE LA FACETTE (NORMALISE),
         WORD        DV3D            < (B)=ADRESSE DU VECTEUR DIRECTEUR DE
                                     <     LA DROITE 'D' (NORMALISE).
         BSR         APRSCA          < CALCUL DU PRODUIT SCALAIRE DE CES DEUX
                                     < VECTEURS ; ETANT NORMALISES :
                                     < (A,B)=COS(P,D),
         BSR         AFABS           < ABS(COS(P,D)), AFIN DE FAIRE UNE SYMETRIE
                                     < D'AXE VERTICAL, PERMETTANT DE PRENDRE
                                     < EN COMPTE L'ANGLE "SIGNIFICATIF" ENTRE
                                     < 'P' ET 'D'...
         BSR         AFNEG           < -ABS(COS(P,D)), AFIN D'AVOIR UN GRAND
                                     < COEFFICIENT POUR LES PETITS ANGLES ENTRE
                                     < LA DROITE 'D' ET LE PLAN 'P', SOIT LES
                                     < GRANDS ANGLES ENTRE 'D' ET LA LA NORMALE
                                     < A 'P' (DROITE 'D' RAZANT LE PLAN 'P', ET
                                     < COUPANT LA SURFACE 'S' LOIN DE LA FACET-
                                     < TE CORRESPONDANTE) ET INVERSEMENT...
         FAD         F1              < 1-ABS(COS(P,D)),
                                     < CE QUI DONNE UNE VALEUR DANS (0,1)...
         #/FST#      ABSCOS          < ET SAVE...
         FMP         FBARC           < PUIS DANS (0,FBARC),
         BSR         AFNEG
         #/FST#      FBARI           < 'FBARI' EST UNE VALEUR NEGAIVE,
         BSR         AFCAZ           < ET VALIDATION :
         JLE         INTDPA          < OK, 'FBARI' NEGATIF...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
INTDPA:  EQU         $
         BSR         AFNEG
         FAD         F1
         #/FST#      FBARS           < 'FBARS' EST UNE VALEUR SUPERIEURE A 1.
<
< CALCUL DU SEUIL DE COHERENCE :
<
         NTRN
XSEUIL:: VAL         XXN255+Z/XXXMOY/XXXMOY
         TRN
         LAI         XXN255+Z/XXXMOY-XSEUIL
                                     < (A)=PLUS GRAND SEUIL (A 'XSEUIL' PRES)
                                     <     RECONNU POUR LES TESTS DE COHERENCE,
         BSR         AFLT
         FMP         ABSCOS          < QUE L'ON MULTIPLIE PAR 'ABSCOS' QUI EST
                                     < UNE FONCTION VALANT :
                                     < 0 : 'D' EST PERPENDICULAIRE A 'P',
                                     < 1 : 'D' EST PARALLELE A 'P',
                                     < (SOIT 1-ABS(COS(P,D))).
         BSR         AROND           < CONVERSION ENTIERE,
         ADRI        XSEUIL/XXXMOY/XXXMOY/XXXMOY,A
                                     < AFIN DE N'AVOIR JAMAIS DE SEUILS NULS...
         STA         NSEUIL          < ET MEMORISE...
<
< MODIFICATION DE 'ABSCOS' :
<
         #/FLD#      ABSCOS          < 1-ABS(COS(P,D)),
         FAD         F1              < 2-ABS(COS(P,D)),
         FMP         FEPSTO          < FEPSTO*(2-ABS(COS(P,D))),
         #/FST#      ABSCOS          < AFIN QUE 'ABSCOS' NE S'ANNULE PAS, ET
                                     < SOIT SUPERIEURE OU EGALE A 'FEPSTO'...
<
< CALCUL DE EPS(U) :
<
         BSR         ATRIGU          < DONNE DANS 'Y' LA POSITION DU TRIANGLE
                                     < (A,B,C) PAR RAPPORT A LA ZONE DE "REBOU-
                                     < CLAGE" DU TORE...
VARUAB:  EQU         DADB            < ABS(UA-UB),
VARUBC:  EQU         DBDC            < ABS(UB-UC),
VARUCA:  EQU         DCDA            < ABS(UC-UA).
         #/FLD#      VARUB           < UB,
         BSR         APERIU          < POSITIONNEMENT SUR LE TORE,
         BSR         ASFWOR
         #/FLD#      VARUA           < UA,
         BSR         APERIU          < POSITIONNEMENT SUR LE TORE,
         PSR         A,B             < ET SAVE UA...
         FSB         FWORK           < UA-UB,
         BSR         AFABS           < ABS(UA-UB),
         #/FST#      VARUAB          < ET SAVE...
         #/FLD#      VARUC           < UC,
         BSR         APERIU          < POSITIONNEMENT SUR LE TORE,
         BSR         ASFWOR
         #/FLD#      VARUB           < UB,
         BSR         APERIU          < POSITIONNEMENT SUR LE TORE,
         FSB         FWORK           < UB-UC,
         BSR         AFABS           < ABS(UB-UC),
         #/FST#      VARUBC          < ET SAVE...
         PLR         A,B             < UA,
         BSR         ASFWOR
         #/FLD#      VARUC           < UC,
         BSR         APERIU          < POSITIONNEMENT SUR LE TORE,
         FSB         FWORK           < UC-UA,
         BSR         AFABS           < ABS(UC-UA),
         #/FST#      VARUCA          < ET SAVE...
         LAD         VARUAB
         STA         AMIN            < INITIALISATION
         LAD         VARUBC
         STA         AMIL            <                DES TROIS
         LAD         VARUCA
         STA         AMAX            <                          RELAIS,
         BSR         ASPTRI          < ET TRI DE (ABS(UA-UB),ABS(UB-UC),
                                     <            ABS(UC-UA))...
         FLD         &AMIL           < (A,B)=VALEUR MEDIANE,
         FMP         ABSCOS          < QUE L'ON MET "A L'ECHELLE",
         LXI         XEPSU
         FST         &ALTORE         < CE QUI DONNE EPS(U)...
<
< CALCVL DE EPS(V) :
<
         BSR         ATRIGV          < DONNE DANS 'Y' LA POSITION DU TRIANGLE
                                     < (A,B,C) PAR RAPPORT A LA ZONE DE "REBOU-
                                     < CLAGE" DU TORE...
VARVAB:  EQU         DADB            < ABS(VA-VB),
VARVBC:  EQU         DBDC            < ABS(VB-VC),
VARVCA:  EQU         DCDA            < ABS(VC-VA).
         #/FLD#      VARVB           < VB,
         BSR         APERIV          < POSITIONNEMENT SUR LE TORE,
         BSR         ASFWOR
         #/FLD#      VARVA           < VA,
         BSR         APERIV          < POSITIONNEMENT SUR LE TORE,
         PSR         A,B             < ET SAVE VA...
         FSB         FWORK           < VA-VB,
         BSR         AFABS           < ABS(VA-VB),
         #/FST#      VARVAB          < ET SAVE...
         #/FLD#      VARVC           < VC,
         BSR         APERIV          < POSITIONNEMENT SUR LE TORE,
         BSR         ASFWOR
         #/FLD#      VARVB           < VB,
         BSR         APERIV          < POSITIONNEMENT SUR LE TORE,
         FSB         FWORK           < VB-VC,
         BSR         AFABS           < ABS(VB-VC),
         #/FST#      VARVBC          < ET SAVE...
         PLR         A,B             < VA,
         BSR         ASFWOR
         #/FLD#      VARVC           < VC,
         BSR         APERIV          < POSITIONNEMENT SUR LE TORE,
         FSB         FWORK           < VC-VA,
         BSR         AFABS           < ABS(VC-VA),
         #/FST#      VARVCA          < ET SAVE...
         LAD         VARVAB
         STA         AMIN            < INITIALISATION
         LAD         VARVBC
         STA         AMIL            <                DES TROIS
         LAD         VARVCA
         STA         AMAX            <                          RELAIS,
         BSR         ASPTRI          < ET TRI DE (ABS(VA-VB),ABS(VB-VC),
                                     <            ABS(VC-VA))...
         FLD         &AMIL           < (A,B)=VALEUR MEDIANE,
         FMP         ABSCOS          < QUE L'ON MET "A L'ECHELLE",
         LXI         XEPSV
         FST         &ALTORE         < CE QUI DONNE EPS(V)...
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
< VISUALISATION DES FACETTES
< TELLES QU'ELLES INTERSEC-
< TENT LA DROITE 'D' :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         LA          IWCONV          < LA VISUALISATION EST-ELLE DEMANDEE ???
         JAE         INTDPB          < NON...
         XM          IWGFE           < OUI, ON POSITIONNE 'IWGFE' AVEC 'EXIST'
                                     < (A CAUSE DE 'SP1E'), ET ON SAUVEGARDE
                                     < (IWGFE) DANS 'A'...
         LR          A,X             < (X)=SAUVEGARDE DE 'IWGFE'...
XWOR%1:  VAL         SIZXVI/XC512    < X-FACTEUR DE PASSAGE '512' --> 'VISU',
XWOR%2:  VAL         SIZYVI/XL512    < Y-FACTEUR DE PASSAGE '512' --> 'VISU'.
         IF          XWOR%1-XWOR%2,,XEIF%,
         IF          ATTENTION : LE CALCUL DE 'FACT' EST IDIOT !!!
XEIF%:   VAL         ENDIF
         #/FLD#      FACT
         PSR         A,B             < SAUVEGARDE DE 'FACT'...
         LRM         A,B
         FLOAT       <XWOR%1?XWOR%2<K<K
         #/FST#      FACT            < FACTEUR D'ECHELLE POUR LE TRACE GRA-
                                     < PHIQUE SUR VISU...
         LRM         A
         WORD        DEMWD0
         SVC                         < MISE DU TRACE EN MODE NORMAL...
         BSR         ASP1E           < TRACE DE LA FACETTE (A,B,C) COURANTE.
         STX         IWGFE           < RESTAURATION DE 'IWGFE'...
         PLR         A,B
         #/FST#      FACT            < ET DE 'FACT'...
INTDPB:  EQU         $
XOPT1:   VAL         ENDIF
<
< ET SORTIE :
<
INTDP1:  EQU         $
         CPZ         PINTER          < ET POSITIONNEMENT DES INDICATEURS...
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        C A L C U L   D E   ' V A R U M '   E T   ' V A R V M '  :
<
<
PUVM:    EQU         $
<
< INITIALISATION :
<
         PSR         A,B,Y
<
< TEST DE LA POSITION DU TRIANGLE
< (A,B,C) PAR RAPPORT AU MILIEU DU
< SEGMENT (MIN(U),(MAX(U)) :
<
         BSR         ATRIGU          < RENVOIE (Y)...
<
< CALCUL DE 'VARUM' :
<
         #/FLD#      VARUA           < UA,
         BSR         APERIU          < POSITIONNEMENT SUR LE TORE...
         FMP         ALPHA           < ALPHA*UA,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      VARUB           < UB,
         BSR         APERIU          < POSITIONNEMENT SUR LE TORE...
         FMP         BETA            < BETA*UB,
         BSR         APFWOR          < ALPHA*UA+BETA*UB,
         #/FLD#      VARUC           < UC,
         BSR         APERIU          < POSITIONNEMENT SUR LE TORE...
         FMP         GAMMA           < GAMMA*UC,
         BSR         APFWOR          < CALCUL DE 'UM' :
         BSR         APSEGU          < POSITIONNEMENT SUR LE TORE,
         #/FST#      VARUM           < UM=ALPHA*UA+BETA*UB+GAMMA*UC.
<
< TEST DE LA POSITION DU TRIANGLE
< (A,B,C) PAR RAPPORT AU MILIEU DU
< SEGMENT (MIN(V),(MAX(V)) :
<
         BSR         ATRIGV          < RENVOIE (Y)...
<
< CALCUL DE 'VARVM' :
<
         #/FLD#      VARVA           < VA,
         BSR         APERIV          < POSITIONNEMENT SUR LE TORE...
         FMP         ALPHA           < ALPHA*VA,
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      VARVB           < VB,
         BSR         APERIV          < POSITIONNEMENT SUR LE TORE...
         FMP         BETA            < BETA*VB,
         BSR         APFWOR          < ALPHA*VA+BETA*VB,
         #/FLD#      VARVC           < VC,
         BSR         APERIV          < POSITIONNEMENT SUR LE TORE...
         FMP         GAMMA           < GAMMA*VC,
         BSR         APFWOR          < CALCUL DE 'VM' :
         BSR         APSEGV          < POSITIONNEMENT SUR LE TORE,
         #/FST#      VARVM           < VM=ALPHA*VA+BETA*VB+GAMMA*VC.
<
< ET RETOUR :
<
         PLR         A,B,Y
         RSR
         PAGE
<
<
<        D E T E R M I N A T I O N   D E   L A   P O S I T I O N
<        D U   T R I A N G L E   ( A , B , C )   D A N S   L E
<        S E G M E N T   ( M I N ( U ) , M A X ( U ) )   O U
<                    D A N S   ( M I N ( V ) , M A X ( V ) )  :
<
<
<        RESULTAT :
<                    (Y)='EXIST'  SI (A,B,C) EST A CHEVAL SUR
<                                 LE REBOUCLAGE DU TORE POUR
<                                 'U' OU 'V' SUIVANT LE MODULE
<                                 APPELE,
<                       ='NEXIST' DANS LE CAS CONTRAIRE.
<
<
<        E N T R Y   ' U '  :
<
<
TRIGU:   EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
         LXI         XPERU           < (X)=INDEX DE LA PERIOD(U).
         LYI         EXIST           < (Y)=INDICATEUR :
                                     <    ='EXIST'  : (A,B,C) EST SUR LE REBOU-
                                     <                CLAGE DU TORE,
                                     <    ='NEXIST' : (A,B,C) EST "NORMAL"...
<
< POSITION DE (A,B,C)
< DANS (MIN(U),MAX(U)) :
<
         #/FLD#      VARUA           < UA,
         FSB         VARUB           < UA-UB,
         BSR         AFABS           < ABS(UA-UB),
         FDV         F05             < 2*ABS(UA-UB), ET CECI AFIN DE COMPARER
                                     < ABS(UA-UB) A LA PERIOD(U)...
         FCAM        &ALTORE         < ALORS, (UA-UB) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(U),MAX(U)) ???
         JG          TRIGU1          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUCLAGE DU TORE...
         #/FLD#      VARUB           < UB,
         FSB         VARUC           < UB-UC,
         BSR         AFABS           < ABS(UB-UC),
         FDV         F05             < 2*ABS(UB-UC), ET CECI AFIN DE COMPARER
                                     < ABS(UB-UC) A LA PERIOD(U)...
         FCAM        &ALTORE         < ALORS, (UB-UC) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(U),MAX(U)) ???
         JG          TRIGU1          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUBLAGE DU TORE...
         #/FLD#      VARUC           < UC,
         FSB         VARUA           < UC-UA,
         BSR         AFABS           < ABS(UC-UA),
         FDV         F05             < 2*ABS(UC-UA), ET CECI AFIN DE COMPARER
                                     < ABS(UC-UA) A LA PERIOD(U)...
         FCAM        &ALTORE         < ALORS, (UC-UA) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(U),MAX(U)) ???
         JG          TRIGU1          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUCLAGE DU TORE...
<
< ET RETOUR :
<
         LYI         NEXIST          < ET BIEN, LE TRIANGLE (A,B,C) SEMBLE
                                     < "NORMAL" :
                                     < ABS(UU-UU)<PERIOD(U)/2, OU "UU" REPRE-
                                     < SENTE 'UA', 'UB' ET 'UC'...
TRIGU1:  EQU         $
         PLR         A,B,X
         RSR
<
<
<        E N T R Y   ' V '  :
<
<
TRIGV:   EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
         LXI         XPERV           < (X)=INDEX DE LA PERIOD(V).
         LYI         EXIST           < (Y)=INDICATEUR :
                                     <    ='EXIST'  : (A,B,C) EST SUR LE REBOU-
                                     <                CLAGE DU TORE,
                                     <    ='NEXIST' : (A,B,C) EST "NORMAL"...
<
< POSITION DE (A,B,C)
< DANS (MIN(V),MAX(V)) :
<
         #/FLD#      VARVA           < VA,
         FSB         VARVB           < VA-VB,
         BSR         AFABS           < ABS(VA-VB),
         FDV         F05             < 2*ABS(VA-VB), ET CECI AFIN DE COMPARER
                                     < ABS(VA-VB) A LA PERIOD(V)...
         FCAM        &ALTORE         < ALORS, (VA-VB) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(V),MAX(V)) ???
         JG          TRIGV1          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUCLAGE DU TORE...
         #/FLD#      VARVB           < VB,
         FSB         VARVC           < VB-VC,
         BSR         AFABS           < ABS(VB-VC),
         FDV         F05             < 2*ABS(VB-VC), ET CECI AFIN DE COMPARER
                                     < ABS(VB-VC) A LA PERIOD(V)...
         FCAM        &ALTORE         < ALORS, (VB-VC) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(V),MAX(V)) ???
         JG          TRIGV1          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUBLAGE DU TORE...
         #/FLD#      VARVC           < VC,
         FSB         VARVA           < VC-VA,
         BSR         AFABS           < ABS(VC-VA),
         FDV         F05             < 2*ABS(VC-VA), ET CECI AFIN DE COMPARER
                                     < ABS(VC-VA) A LA PERIOD(V)...
         FCAM        &ALTORE         < ALORS, (VC-VA) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(V),MAX(V)) ???
         JG          TRIGV1          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUCLAGE DU TORE...
<
< ET RETOUR :
<
         LYI         NEXIST          < ET BIEN, LE TRIANGLE (A,B,C) SEMBLE
                                     < "NORMAL" :
                                     < ABS(VV-VV)<PERIOD(V)/2, OU "VV" REPRE-
                                     < SENTE 'VA', 'VB' ET 'VC'...
TRIGV1:  EQU         $
         PLR         A,B,X
         RSR
         PAGE
<
<
<        D E T E R M I N A T I O N   D E   L A   P O S I T I O N
<        D ' U N   S E G M E N T   D U   T R I A N G L E
<                    ( A S , B S , C S )   D A N S   L E
<        S E G M E N T   ( M I N ( U ) , M A X ( U ) )   O U
<                    D A N S   ( M I N ( V ) , M A X ( V ) )  :
<
<
<        ARGUMENT :
<                    (A)=XSEGAB/XSEGBC/XSEGCA SUIVANT QUE
<                        L'ON TESTE (A,B), (B,C) OU (C,A).
<
<
<        RESULTAT :
<                    (Y)='EXIST'  SI LE SEGMENT EST A CHEVAL SUR
<                                 LE REBOUCLAGE DU TORE POUR
<                                 'U' OU 'V' SUIVANT LE MODULE
<                                 APPELE,
<                       ='NEXIST' DANS LE CAS CONTRAIRE.
<
<
<        E N T R Y   ' U '  :
<
<
SEGMU:   EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
         LXI         XPERU           < (X)=INDEX DE LA PERIOD(U).
         LYI         EXIST           < (Y)=INDICATEUR :
                                     <    ='EXIST'  : (A,B,C) EST SUR LE REBOU-
                                     <                CLAGE DU TORE,
                                     <    ='NEXIST' : (A,B,C) EST "NORMAL"...
         CPI         XSEGAB          < EST-CE (A,B) ???
         JE          SEGMU5          < OUI...
         CPI         XSEGBC          < EST-CE (B,C) ???
         JE          SEGMU3          < OUI...
         CPI         XSEGCA          < EST-CE (C,A) ???
         JE          SEGMU4          < OUI...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
         JMP         SEGMU2          < ET VERS LA SORTIE...
<
< POSITION DE (A,B,C)
< DANS (MIN(U),MAX(U)) :
<
SEGMU5:  EQU         $
         FLD         &AVRUAS         < UA,
         FSB         &AVRUBS         < UA-UB,
         BSR         AFABS           < ABS(UA-UB),
         FDV         F05             < 2*ABS(UA-UB), ET CECI AFIN DE COMPARER
                                     < ABS(UA-UB) A LA PERIOD(U)...
         FCAM        &ALTORE         < ALORS, (UA-UB) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(U),MAX(U)) ???
         JG          SEGMU1          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUCLAGE DU TORE...
         JMP         SEGMU2          < OUI...
SEGMU3:  EQU         $
         FLD         &AVRUBS         < UB,
         FSB         &AVRUCS         < UB-UC,
         BSR         AFABS           < ABS(UB-UC),
         FDV         F05             < 2*ABS(UB-UC), ET CECI AFIN DE COMPARER
                                     < ABS(UB-UC) A LA PERIOD(U)...
         FCAM        &ALTORE         < ALORS, (UB-UC) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(U),MAX(U)) ???
         JG          SEGMU1          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUBLAGE DU TORE...
         JMP         SEGMU2          < OUI...
SEGMU4:  EQU         $
         FLD         &AVRUCS         < UC,
         FSB         &AVRUAS         < UC-UA,
         BSR         AFABS           < ABS(UC-UA),
         FDV         F05             < 2*ABS(UC-UA), ET CECI AFIN DE COMPARER
                                     < ABS(UC-UA) A LA PERIOD(U)...
         FCAM        &ALTORE         < ALORS, (UC-UA) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(U),MAX(U)) ???
         JG          SEGMU1          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUCLAGE DU TORE...
<
< ET RETOUR :
<
SEGMU2:  EQU         $
         LYI         NEXIST          < ET BIEN, LE TRIANGLE (A,B,C) SEMBLE
                                     < "NORMAL" :
                                     < ABS(UU-UU)<PERIOD(U)/2, OU "UU" REPRE-
                                     < SENTE 'UA', 'UB' ET 'UC'...
SEGMU1:  EQU         $
         PLR         A,B,X
         RSR
<
<
<        E N T R Y   ' V '  :
<
<
SEGMV:   EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
         LXI         XPERV           < (X)=INDEX DE LA PERIOD(V).
         LYI         EXIST           < (Y)=INDICATEUR :
                                     <    ='EXIST'  : (A,B,C) EST SUR LE REBOU-
                                     <                CLAGE DU TORE,
                                     <    ='NEXIST' : (A,B,C) EST "NORMAL"...
         CPI         XSEGAB          < EST-CE (A,B) ???
         JE          SEGMV5          < OUI...
         CPI         XSEGBC          < EST-CE (B,C) ???
         JE          SEGMV3          < OUI...
         CPI         XSEGCA          < EST-CE (C,A) ???
         JE          SEGMV4          < OUI...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
         JMP         SEGMV2          < ET VERS LA SORTIE...
<
< POSITION DE (A,B,C)
< DANS (MIN(V),MAX(V)) :
<
SEGMV5:  EQU         $
         FLD         &AVRVAS         < VA,
         FSB         &AVRVBS         < VA-VB,
         BSR         AFABS           < ABS(VA-VB),
         FDV         F05             < 2*ABS(VA-VB), ET CECI AFIN DE COMPARER
                                     < ABS(VA-VB) A LA PERIOD(V)...
         FCAM        &ALTORE         < ALORS, (VA-VB) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(V),MAX(V)) ???
         JG          SEGMV1          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUCLAGE DU TORE...
         JMP         SEGMV2          < OUI...
SEGMV3:  EQU         $
         FLD         &AVRVBS         < VB,
         FSB         &AVRVCS         < VB-VC,
         BSR         AFABS           < ABS(VB-VC),
         FDV         F05             < 2*ABS(VB-VC), ET CECI AFIN DE COMPARER
                                     < ABS(VB-VC) A LA PERIOD(V)...
         FCAM        &ALTORE         < ALORS, (VB-VC) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(V),MAX(V)) ???
         JG          SEGMV1          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUBLAGE DU TORE...
         JMP         SEGMV2          < OUI...
SEGMV4:  EQU         $
         FLD         &AVRVCS         < VC,
         FSB         &AVRVAS         < VC-VA,
         BSR         AFABS           < ABS(VC-VA),
         FDV         F05             < 2*ABS(VC-VA), ET CECI AFIN DE COMPARER
                                     < ABS(VC-VA) A LA PERIOD(V)...
         FCAM        &ALTORE         < ALORS, (VC-VA) EST-IL A CHEVAL SUR LE
                                     < MILIEU DU SEGMENT (MIN(V),MAX(V)) ???
         JG          SEGMV1          < NON, EN FAIT IL EST A CHEVAL SUR LE
                                     < REBOUCLAGE DU TORE...
<
< ET RETOUR :
<
SEGMV2:  EQU         $
         LYI         NEXIST          < ET BIEN, LE TRIANGLE (A,B,C) SEMBLE
                                     < "NORMAL" :
                                     < ABS(VV-VV)<PERIOD(V)/2, OU "VV" REPRE-
                                     < SENTE 'VA', 'VB' ET 'VC'...
SEGMV1:  EQU         $
         PLR         A,B,X
         RSR
         PAGE
<
<
<        G E S T I O N   D E   L ' E S P A C E   D E S
<        C O O R D O N N E E S   C U R V I L I G N E S  :
<
<
<        FONCTION :
<                      L'ESPACE DES COORDONNEES
<                    CURVILIGNES (U,V) EST EN GENE-
<                    RAL UN TORE ; DANS CES CONDITIONS,
<                    N'ETANT PAS UN PLAN, ON PEUT
<                    RENCONTRER DES DIFFICULTES LORS
<                    DES INTERPOLATIONS DANS UN TRIAN-
<                    GLE (A,B,C).
<                      PAR EXEMPLE, SOIT POUR LA COOR-
<                    DONNEE 'U', UNE PERIODE DE 2*PI,
<                    ET UNE DEFINITION DANS LE SEG-
<                    MENT (-PI,+PI) ; DONNONS NOUS
<                    ALORS :
<
<                                    UA=-(PI-EPS(A)),
<                                    UB=+(PI-EPS(B)),
<                                    OU 'EPS' SIGNIFIE 'EPSILON'.
<
<                    UNE INTERPOLATION LINERAIRE SIM-
<                    PLISTE DONNERA DES RESULTATS
<                    FANTAISISTES ; PAR EXEMPLE LA
<                    MOYENNE ARITHMETIQUE DONNERA :
<
<                                    UM=(UA+UB)/2,
<                                    UM=(-(PI-EPS(A))+(PI-EPS(B)))/2,
<                                    UM=(EPS(A)-(EPS(B))/2,
<
<                    'UM' EST ALORS UN NOMBRE VOISIN
<                    DE ZERO, ET QUI N'EST DONC PAS
<                    COMPRIS ENTRE 'UA' ET 'UB' SUR
<                    LE TORE DES COORDONNEES...
<
<                      LA SOLUTION EST DONC DE TRANS-
<                    LATER LES COORDONNEES CURVILIGNES
<                    INFERIEURES AU MILIEU 'MIL' DU SEGMENT
<                    (MIN,MAX) D'UNE QUANTITE EGALE A
<                    LA PERIODE, PUIS APRES LE CALCUL
<                    DES INTERPOLATIONS, DE RETRANCHER
<                    CETTE MEME PERIODE DES COORDONNEES
<                    RESULTANTES QUI SORTIRAIENT
<                    DE L'INTERVALLE DE DEFINITION
<                    (MIN,MAX) DE LA COORDONNEE EN
<                    CAUSE.
<                      MAIS CECI NE PEUT ETRE FAIT
<                    DANS L'ABSOLU : C'EST POURQUOI
<                    'PERIU' ET 'PERIV' RECOIVENT
<                    L'ARGUMENT (Y), QUI EN GENERAL
<                    PREND EN COMPTE LA POSITION DU
<                    TRIANGLE (A,B,C) PAR RAPPORT
<                    AU SEGMENT (MIN( ),(MAX( ))...
<
<
<        ARGUMENT :
<                    (A,B)=COORDONNEE CURVILIGNE RESULTANT
<                          D'UNE INTERPOLATION OU D'UNE ITERATION,
<                    (Y)=(POUR 'PERIU' ET PERIV' UNIQUEMENT)
<                       ='EXIST'  : FAIRE LE TRAITEMENT DEMANDE,
<                       ='NEXIST' : NE RIEN FAIRE.
<
<
<        RESULTAT :
<                    (A,B)=COORDONNEE CURVILIGNE DANS
<                          LE SEGMENT APPROPRIE :
<                                    (MIL,MAX) : POUR 'PERIU' ET 'PERIV',
<                                    (MIN,MAX) : POUR 'PSEGU' ET 'PSEGV'.
<
<
<        M I S E   D E   ' U '   D A N S   L E   S E G M E N T
<                    ( M I L U , M A X U )  :
<
<
PERIU:   EQU         $
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZR        Y               < FAUT-IL FAIRE QUELQUE CHOSE ???
         JE          PERIU3          < NON, ON SORT IMMEDIATEMENT...
         PSR         X               < OUI :
PERIU2:  EQU         $
         LXI         XMILU
         FCAM        &ALTORE         < LA COORDONNEE CURVILIGNE 'U' EST-ELLE
                                     < DANS LE SEGMENT (MIN,MIL) ???
         JGE         PERIU1          < NON, ON LA LAISSE INTACTE...
         LXI         XPERU           < OUI :
         FAD         &ALTORE         < ON LA TRANSLATE DE LA PERIODE...
         JMP         PERIU2          < ET ON ITERE EVENTUELLEMENT...
PERIU1:  EQU         $
         PLR         X
PERIU3:  EQU         $
         RSR                         < ET RETOUR...
<
<
<        M I S E   D E   ' V '   D A N S   L E   S E G M E N T
<                    ( M I L V , M A X V )  :
<
<
PERIV:   EQU         $
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZR        Y               < FAUT-IL FAIRE QUELQUE CHOSE ???
         JE          PERIV3          < NON, ON SORT IMMEDIATEMENT...
         PSR         X               < OUI :
PERIV2:  EQU         $
         LXI         XMILV
         FCAM        &ALTORE         < LA COORDONNEE CURVILIGNE 'V' EST-ELLE
                                     < DANS LE SEGMENT (MIN,MIL) ???
         JGE         PERIV1          < NON, ON LA LAISEE INTACTE...
         LXI         XPERV           < OUI :
         FAD         &ALTORE         < ON LA TRANSLATE DE LA PERIODE...
         JMP         PERIV2          < ET ON ITERE EVENTUELLEMENT...
PERIV1:  EQU         $
         PLR         X
PERIV3:  EQU         $
         RSR                         < ET RETOUR...
<
<
<        M I S E   D E   ' U '   D A N S   L E   S E G M E N T
<                    ( M I N U , M A X U )  :
<
<
PSEGU:   EQU         $
<
< INITIALISATIONS :
<
         PSR         X
<
< TEST D'AU-DELA DE 'MAXU' :
<
PSEGU3:  EQU         $
         LXI         XMAXU
         FCAM        &ALTORE         < 'U' REBOUCLE-T'ELLE SUR LE TORE ???
         JLE         PSEGU1          < NON...
         LXI         XPERU           < OUI :
         FSB         &ALTORE         < ON LUI RETRANCHE LA PERIOD(U)...
         JMP         PSEGU3          < ET ON ITERE EVENTUELLEMENT...
PSEGU1:  EQU         $
<
< TEST D'EN-DECA DE 'MINU' :
<
PSEGU4:  EQU         $
         LXI         XMINU
         FCAM        &ALTORE         < 'U' REBOUCLE-T'IL SUR LE TORE ???
         JGE         PSEGU2          < NON...
         LXI         XPERU           < OUI :
         FAD         &ALTORE         < ON LUI AJOUTE LA PERIOD(U)...
         JMP         PSEGU4          < ET ON ITERE EVENTUELLEMENT...
PSEGU2:  EQU         $
<
< ET RETOUR :
<
         PLR         X
         RSR
<
<
<        M I S E   D E   ' V '   D A N S   L E   S E G M E N T
<                    ( M I N V , M A X V )  :
<
<
PSEGV:   EQU         $
<
< INITIALISATIONS :
<
         PSR         X
<
< TEST D'AU-DELA DE 'MAXV' :
<
PSEGV3:  EQU         $
         LXI         XMAXV
         FCAM        &ALTORE         < 'V' REBOUCLE-T'ELLE SUR LE TORE ???
         JLE         PSEGV1          < NON...
         LXI         XPERV           < OUI :
         FSB         &ALTORE         < ON LUI RETRANCHE LA PERIOD(V)...
         JMP         PSEGV3          < ET ON ITERE EVENTUELLEMENT...
PSEGV1:  EQU         $
<
< TEST D'EN-DECA DE 'MINV' :
<
PSEGV4:  EQU         $
         LXI         XMINV
         FCAM        &ALTORE         < 'U' REBOUCLE-T'IL SUR LE TORE ???
         JGE         PSEGV2          < NON...
         LXI         XPERV           < OUI :
         FAD         &ALTORE         < ON LUI AJOUTE LA PERIOD(V)...
         JMP         PSEGV4          < ET ON ITERE EVENTUELLEMENT...
PSEGV2:  EQU         $
<
< ET RETOUR :
<
         PLR         X
         RSR
         PAGE
<
<
<        C A L C U L   D U   P O I N T   D ' I N T E R S E C T I O N
<        E N T R E   L A   D R O I T E   ' D '   E T   L A   S U R F A C E
<                    C O U R A N T E   ' S '  :
<
<
<        FONCTION :
<                      CE MODULE EXPLOITE LES
<                    RESULTATS DE 'INTDP' QUI A
<                    DETERMINE L'INTERSECTION
<                    ENTRE LA DROITE 'D' ET L'UNE
<                    DES FACETTES D'APPROXIMATION
<                    DE LA SURFACE 'S'.
<                      ON NOTERA QUE L'ON FAIT
<                    L'HYPOTHESE SUIVANTE : IL
<                    N'Y A QU'UNE SEULE SOLUTION (U,V)
<                    DANS UNE MAILLE TRIANGULAIRE
<                    (A,B,C)...
<
<                    SOIT LA SURFACE 'S' :
<
<                                    X=X(U,V),
<                                    Y=Y(U,V),
<                                    Z=Z(U,V).
<
<                    ET LA DROITE 'D' :
<
<                                    X=XD+RHO*VX,
<                                    Y=YD+RHO*VY,
<                                    Z=ZD+RHO*VZ.
<
<                    POUR CALCULER : 'M'='D'.INTER.'S', IL
<                    FAUT DONC RESOUDRE LE SYSTEME :
<
<                                    X(U,V)=XD+RHO*VX,
<                                    Y(U,V)=YD+RHO*VY,
<                                    Z(U,V)=ZD+RHO*VZ.
<
<                    LES INCONNUES ETANT (U,V,RHO).
<                    DEVELOPPONS LES 3 FONCTIONS 'X',
<                    'Y' ET 'Z' A L'AIDE DES DERIVEES
<                    PARTIELLES :
<
<                    X(U,V)=X(U0,V0)+(U-U0)*DX(U0,V0)/DU+(V-V0)*DX(U0,V0)/DV,
<                    Y(U,V)=Y(U0,V0)+(U-U0)*DY(U0,V0)/DU+(V-V0)*DY(U0,V0)/DV,
<                    Z(U,V)=Z(U0,V0)+(U-U0)*DZ(U0,V0)/DU+(V-V0)*DZ(U0,V0)/DV.
<
<                    POSONS :
<                                    U=U0+$U,
<                                    V=V0+$V,
<                                    RHO=RHO0+$RHO,
<
<                    LE SYSTEME S'ECRIT ALORS :
<
<                    DX(U0,V0)/DU*$U+DX(U0,V0)/DV*$V-VX*$RHO=XD+RHO0*VX-X(U0,V0)
<                    DY(U0,V0)/DV*$U+DY(U0,V0)/DV*$V-VY*$RHO=YD+RHO0*VY-Y(U0,V0)
<                    DZ(U0,V0)/DV*$U+DZ(U0,V0)/DV*$V-VZ*$RHO=ZD+RHO0*VZ-Z(U0,V0)
<
<                    SOIT SOUS FORME MATRICIELLE :
<
<        I DX(U0,V0)/DU DX(U0,V0)/DV -VX I   I $U I   I XD+RHO0*VX-X(U0,V0) I
<        I DY(U0,V0)/DU DY(U0,V0)/DV -VY I * I $V I = I YD+RHO0*VY-Y(U0,V0) I
<        I DZ(U0,V0)/DU DZ(U0,V0)/DV -VZ I   I$RHOI   I ZD+RHO0*VZ-Z(U0,V0) I
<
<                    LA RESOLUTION VA SE FAIRE
<                    A L'AIDE D'UNE METHODE ITERA-
<                    TIVE, DU TYPE :
<
<                                    U0 <-- U0+$U,
<                                    V0 <-- V0+$V,
<                                    RHO0 <-- RHO0+$RHO,
<
<                    TANT QUE :
<                                    I $U I
<                                    I $V I > EPSILON
<                                    I$RHOI
<
<
<        ARGUMENTS :
<                    LA DROITE 'D',
<                    LA SURFACE 'S'.
<
<
<        RESULTATS :
<                    SINTER='NEXIST' SI LE POINT D'INTERSECTION
<                           N'EXISTE PAS,
<                          ='EXIST' S'IL EXISTE (FXS,FYS,FZS).
<                    INDICATEURS POSITIONNES PAR UN 'CPZ SINTER'.
<
<
INTDS:   EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X,Y
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE 'STZ' SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         STZ         SINTER          < PAS D'INTERSECTION A PRIORI ENTRE 'D'
                                     < ET 'S' (INITIALISATION REDONDANTE AVEC
                                     < CELLE FAITE DANS 'INTDP'...).
         CPZ         PINTER          < Y-A-T'IL UNE INTERSECTION ENTRE LA
                                     < FACETTE COURANTE ET LA DROITE 'D' ???
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : CE TEST EST IDIOT !!!
XEIF%:   VAL         ENDIF
         JNE         INTDS2          < OUI, ALLONS TRAITER L'INTERSECTION
                                     < COMPLETE AVEC LA SURFACE 'S' ???
         BSR         AGOTO
         WORD        INTDS7          < NON, RIEN A FAIRE...
INTDS2:  EQU         $
<
<
<        P E R T U R B A T I O N   I N I T I A L E   D E   L A
<                    S O L U T I O N   I N I T I A L E   ' M '  :
<
<
<        FONCTION :
<                      IL EST EVIDENT QUE SI LA DROITE
<                    'D' EST QUASI-ORTHOGONALE AU PLAN
<                    'P' DE LA FACETTE, LA SOLUTION INI-
<                    TIALE (UM,VM) EST TRES PROCHE DE LA
<                    SOLUTION EXACTE, ET QU'A L'OPPOSE,
<                    SI LA DROITE 'D' EST TRES INCLINEE
<                    PAR RAPPORT AU PLAN 'P', LA SOLUTION
<                    INITIALE (UM,VM) EST TRES ELOIGNEE
<                    DE LA SOLUTION EXACTE...
<                      ON VA DONC ICI DEPLACER LA SOLU-
<                    TION INITIALE SUIVANT LA PROJECTION
<                    ORIENTEE DE 'D' SUR 'P' :
<
<                    1 - PROJECTION DE 'D' SUR 'P' : '$' VA
<                    DESIGNER LE PRODUIT VECTORIEL, 'NP' LE
<                    VECTEUR NORMAL (PLANA,PLANB,PLANC) AU
<                    PLAN 'P', ET 'VD' LE VECTEUR DIRECTEUR
<                    DE LA DROITE 'D' ; DANS CES CONDITIONS :
<
<                                    - VD$NP EST ORTHOGONAL AU PLAN (NP,D),
<                                    - NP$(VD$NP) EST DONC UN VECTEUR DU PLAN
<                                    'P' ET DU PLAN (NP,D), IL DEFINIT DONC LA
<                                    PROJECTION DE 'D' SUR 'P'.
<
<                    2 - PERTURBATION DU POINT 'M' : ON VA
<                    DEPLACER 'M' LE LONG DE LA PROJECTION
<                    DE 'D' SUR 'P' D'UN VECTEUR COLINEAIRE
<                    A NP$(VD$NP), CE QUI DONNE LE POINT
<                    'MP' (XMP,YMP,ZMP).
<
<                    3 - PUIS CALCUL DES COORDONNEES BARY-
<                    CENTRIQUES GENERALISEES (ALPHAP,BETAP,
<                    GAMMAP) DU POINT 'MP' TELLES QUE :
<
<                                    ALPHAP*XA+BETAP*XB+GAMMAP*XC=XMP,
<                                    ALPHAP*YA+BETAP*YB+GAMMAP*YC=YMP,
<                                    ALPHAP*ZA+BETAP*ZB+GAMMAP*ZC=ZMP,
<                                    ALPHAP   +BETAP   +GAMMAP   =1,
<                    ET :
<                                    (ALPHA,BETA,GAMMA) ETANT CETTE FOIS
<                                    DES NOMBRES REELS QUELCONQUES, NON
<                                    RESTREINTS A (0,1), PUISQUE LA SOLU-
<                                    TION PERTURBEE 'MP' N'EST PAS NECESSAI-
<                                    REMENT DANS LE TRIANGLE (A,B,C)...
<                      NOTONS QUE LE SYSTEME PRECEDENT
<                    CONTIENT QUATRE EQUATIONS POUR TROIS
<                    INCONNUES ; CELA N'EST PAS GENANT
<                    PUISQUE 'MP' APPARTIENT AU PLAN
<                    (A,B,C), CE QUI FAIT QU'IL EXISTE
<                    UNE RELATION LINEAIRE ENTRE LES
<                    TROIS PREMIERE EQUATIONS...
<
<                    4 - ENFIN, CALCUL D'UNE NOUVELLE
<                    SOLUTION INITIALE (UMP,VMP) TELLE
<                    QUE :
<
<                                    UMP=ALPHAP*UA+BETAP*UB+GAMMAP*UC,
<                                    VMP=ALPHAP*VA+BETAP*VB+GAMMAP*VC.
<
<
<        NOTA :
<                      DANS 'INTDP', ON CONTINUE
<                    MALGRE TOUT A CALCULER (ALPHA,
<                    BETA,GAMMA) AFIN D'UNE PART DE
<                    SAVOIR SI 'M' EST A L'INTERIEUR
<                    DU TRIANGLE (A,B,C), ET D'AUTRE
<                    PART DE PERMETTRE AINSI DE VI-
<                    SUALISER LA SURFACE EN TANT QU'
<                    ENSEMBLE DE FACETTES (VOIR L'OP-
<                    TION 'IVSUR')...
<
<
INTDSA:  EQU         $
<
< CALCUL DU VECTEUR DE
< PROJECTION DE 'D' SUR 'P' :
<
<        NP$(VD$NP)=(NP*NP)*VD-(NP*VD)*NP,
<
< SOIT, PUISQUE 'NP' EST NORMALISE :
<
<        NP$(VD$NP)=VD-(NP*VD)*NP.
<
< ET TRANSLATION 'M' --> 'MP' :
<
         LXI         XEPSU
         FLD         &ALTORE         < EPS(U),
         LXI         XEPSV
         FMP         &ALTORE         < EPS(U)*EPS(V),
         BSR         ARAC            < RAC(EPS(U)*EPS(V)), SOIT LA MOYENNE GEO-
                                     < METRIQUE DE EPS(U) ET EPS(V),
         FMP         FPERSI          < QUE L'ON PONDERE,
         IF          XITYPE-K,XEIF%,,XEIF%
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         FTYPE           < QUEL EST LE TYPE DE LA FACETTE COURANTE ?
         JE          INTDSJ          < "EXTERNE"...
         BSR         AFNEG           < "INTERNE" : N'OUBLIONS PAS QUE L'ERREUR
                                     < COMMISE POUR LES FACETTES "INTERNES" EST
                                     < A L'INVERSE DE CELLE DES FACETTES
                                     < "EXTERNES" COMME LE MONTRE AISEMENT UN
                                     < PETIT DESSIN...
INTDSJ:  EQU         $
         FMP         FK              < AFIN D'ETRE HOMOTHETIQUE...
         #/FST#      FWORK1          < ET QUE L'ON MET TEMPORAIREMENT DANS
                                     < 'FWORK1'...
         LRM         A,B
         WORD        PLAN3D          < (A)=ADRESSE DU VECTEUR NORMAL 'NP' A 'P',
         WORD        DV3D            < (B)=ADRESSE DU VECTEUR DIRECTEUR 'VD'
                                     <     DE LA DROITE 'D',
         BSR         APRSCA          < (A,B)=PRODUIT SCALAIRE (NP*VD),
         BSR         AFNEG           < (A,B)=-(NP*VD),
         BSR         ASFWOR          < ET SAVE :
                                     < FWORK=-(NP*VD).
                                     < NOTONS :
                                     < NP=(XN,YN,ZN),
                                     < VD=(VX,VY,VZ).
         FMP         PLANA           < -(NP*VD)*XN,
         FAD         DVX             < VX-(NP*VD)*XN,
         FMP         FWORK1          < FACTEUR D'ECHELLE HOMOTHETIQUE,
         FAD         FXSM            < ET TRANSLATION
         #/FST#      FXSM            <                DE 'M' --> 'MP'.
         #/FLD#      FWORK           < -(NP*VD),
         FMP         PLANB           < -(NP*VD)*YN,
         FAD         DVY             < VY-(NP*VD)*YN,
         FMP         FWORK1          < FACTEUR D'ECHELLE HOMOTHETIQUE,
         FAD         FYSM            < ET TRANSLATION
         #/FST#      FYSM            <                DE 'M' --> 'MP'.
         #/FLD#      FWORK           < -(NP*VD),
         FMP         PLANC           < -(NP*VD)*ZN,
         FAD         DVZ             < VZ-(NP*VD)*ZN,
         FMP         FWORK1          < FACTEUR D'ECHELLE HOMOTHETIQUE,
         FAD         FZSM            < ET TRANSLATION
         #/FST#      FZSM            <                DE 'M' --> 'MP'.
<
< INITIALISATION GENERALE
< DU CALCUL DES COORDONNEES
< BARYCENTRIQUES GENERALISEES
< (ALPHAP,BETAP,GAMMAP) (MISE
< EN FAIT DANS (ALPHA,BETA,
< GAMMA)) DE LA SOULTION
< PERTURBEE 'MP' :
<
         LAD         F1
         STA         AM31            < M31 --> 1 (TOUJOURS),
         STA         AM32            < M32 --> 1 (TOUJOURS),
         STA         AM33            < M33 --> 1 (TOUJOURS),
         #/FLD#      F1
         #/FST#      M34             < M34 --> 1 (TOUJOURS).
         LAD         ALPHA
         STA         AVARX           < PREMIERE VARIABLE : ALPHAP (NOTEE ALPHA),
         LAD         BETA
         STA         AVARY           < DEUXIEME VARIABLE : BETAP (NOTEE BETA),
         LAD         GAMMA
         STA         AVARZ           < TROISIEME VARIABLE : GAMMAP (NOTEE GAMMA)
<
< PREMIERE TENTATIVE : ON
< VA ESSAYER DE RESOUDRE
< LE SYSTEME 3*3 :
<
<        ALPHAP*XA+BETAP*XB+GAMMAP*XC=XMP,
<        ALPHAP*YA+BETAP*YB+GAMMAP*YC=YMP,
<        ALPHAP   +BETAP   +GAMMAP   =1.
<
         LAD         FXSA
         STA         AM11            < M11 --> XA,
         LAD         FXSB
         STA         AM12            < M12 --> XB,
         LAD         FXSC
         STA         AM13            < M13 --> XC,
         #/FLD#      FXSM
         #/FST#      M14             < M14 --> XMP.
         LAD         FYSA
         STA         AM21            < M21 --> YA,
         LAD         FYSB
         STA         AM22            < M22 --> YB,
         LAD         FYSC
         STA         AM23            < M23 --> YC,
         #/FLD#      FYSM
         #/FST#      M24             < M24 --> YMP.
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ADETER          < ON EST OBLIGE DE CALCULER LE DETERMI-
                                     < NANT AVANT, CAR EN EFFET LE MODULE
                                     < DE RESOLUTION 'ACRAMR' CONSIDERE SA
                                     < NULLITE COMME UNE ERREUR PROGRAMME...
                                     < LE DETERMINANT DU SYSTEME COURANT
                                     < EST-IL NUL ???
         JE          INTDSC          < OUI, CHANGEONS DE SYSTEME...
         BSR         ACRAMR          < NON, CALCULONS (ALPHAP,BETAP,GAMMAP)
                                     < QUE L'ON MET DANS (ALPHA,BETA,GAMMA)...
         BSR         ATSFLO
         JMP         INTDSH          < ET VERS LE CALCUL DE (UMP,VMP)...
<
< DEUXIEME TENTATIVE : ON
< VA ESSAYER DE RESOUDRE
< LE SYSTEME 3*3 :
<
<        ALPHAP*XA+BETAP*XB+GAMMAP*XC=XMP,
<        ALPHAP*ZA+BETAP*ZB+GAMMAP*ZC=ZMP,
<        ALPHAP   +BETAP   +GAMMAP   =1.
<
INTDSC:  EQU         $
         LAD         FZSA
         STA         AM21            < M21 --> ZA,
         LAD         FZSB
         STA         AM22            < M22 --> ZB,
         LAD         FZSC
         STA         AM23            < M23 --> ZC,
         #/FLD#      FZSM
         #/FST#      M24             < M24 --> ZMP.
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ADETER          < ON EST OBLIGE DE CALCULER LE DETERMI-
                                     < NANT AVANT, CAR EN EFFET LE MODULE
                                     < DE RESOLUTION 'ACRAMR' CONSIDERE SA
                                     < NULLITE COMME UNE ERREUR PROGRAMME...
                                     < LE DETERMINANT DU SYSTEME COURANT
                                     < EST-IL NUL ???
         JE          INTDSD          < OUI, CHANGEONS DE SYSTEME...
         BSR         ACRAMR          < NON, CALCULONS (ALPHAP,BETAP,GAMMAP)
                                     < QUE L'ON MET DANS (ALPHA,BETA,GAMMA)...
         BSR         ATSFLO
         JMP         INTDSH          < ET VERS LE CALCUL DE (UMP,VMP)...
<
< TROISIEME TENTATIVE : ON
< VA ESSAYER DE RESOUDRE
< LE SYSTEME 3*3 :
<
<        ALPHAP*YA+BETAP*YB+GAMMAP*YC=YMP,
<        ALPHAP*ZA+BETAP*ZB+GAMMAP*ZC=ZMP,
<        ALPHAP   +BETAP   +GAMMAP   =1.
<
INTDSD:  EQU         $
         LAD         FYSA
         STA         AM11            < M11 --> YA,
         LAD         FYSB
         STA         AM12            < M12 --> YB,
         LAD         FYSC
         STA         AM13            < M13 --> YC,
         #/FLD#      FYSM
         #/FST#      M14             < M14 --> YMP.
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ADETER          < ON EST OBLIGE DE CALCULER LE DETERMI-
                                     < NANT AVANT, CAR EN EFFET LE MODULE
                                     < DE RESOLUTION 'ACRAMR' CONSIDERE SA
                                     < NULLITE COMME UNE ERREUR PROGRAMME...
                                     < LE DETERMINANT DU SYSTEME COURANT
                                     < EST-IL NUL ???
         JE          INTDSG          < OUI, PETIT PROBLEME...
         BSR         ACRAMR          < NON, CALCULONS (ALPHAP,BETAP,GAMMAP)
                                     < QUE L'ON MET DANS (ALPHA,BETA,GAMMA)...
         BSR         ATSFLO
         JMP         INTDSH          < ET VERS LE CALCUL DE (UMP,VMP)...
<
< CAS OU TOUS LES DETER-
< MINANTS SONT NULS :
<
INTDSG:  EQU         $
         QUIT        XXQUIT          < E R R E U R   P R O G R A M E ...
                                     < NOTA : (ALPHA,BETA,GAMMA) SONT
                                     < ALORS INCHANGES...
<
< CALCUL DE LA NOUVELLE
< SOLUTION INITIALE PER-
< TURBEE (UMP,VMP) NOTEE
< (UM,VM) :
<
INTDSH:  EQU         $
         BSR         APUVM           < CALCUL DE (VARUM,VARVM).
         #/FLD#      VARUM
         #/FST#      VARU0           < SAUVEGARDE DE LA SOLUTION INITIALE :
                                     < UM --> U0,
         LX          FOCTA           < (X)=OCTANT DE LA FACETTE,
         ADRI        XEPSU0,X        < CONVERSION EN UN INDEX FLOTTANT,
         FAD         &ALTORE         < ET PERTURBATION HEURISTIQUE...
         BSR         APSEGU
         #/FST#      VARUM           < D'OU LA NOUVELLE SOLUTION INITIALE :
                                     < UM=U0+DU0...
         #/FLD#      VARVM
         #/FST#      VARV0           < SAUVEGARDE DE LA SOLUTION INITIALE :
                                     < VM --> V0,
         ADRI        XEPSV0-XEPSU0,X < PROGRESSION DE L'INDEX FLOTTANT,
         FAD         &ALTORE         < ET PERTURBATION HEURISTIQUE...
         BSR         APSEGV
         #/FST#      VARVM           < D'OU LA NOUVELLE SOLUTION INITIALE :
                                     < VM=V0+DV0...
<
<
<        P R O C E S S U S   I T E R A T I F   " N O R M A L "
<        E T   L O R S   D E S   " M A U V A I S E S
<                    C O N V E R G E N C E S "  :
<
<
INTDSW:  EQU         $
<
< INITIALISATION DU DETEC-
< TEUR DE CONVERGENCE :
<
         LRM         X
         WORD        MAXCO1          < (X)=NOMBRE MAXIMAL D'ITERATIONS DE LA
                                     <     RELANCE LORS DES CONVERGENCES VERS
                                     <     UNE MAUVAISE RACINE...
INTDS1:  EQU         $
         PSR         X               < SAUVEGARDE DE 'MAXCO1'...
<
< INITIALISATION DU MODULE
< DE RESOLUTION DES SYSTEMES
< LINEAIRES 3*3, INITIALI-
< SATION DES COEFFICIENTS :
<
         LAD         M11
         STA         AM11
         LAD         M12
         STA         AM12
         LAD         M13
         STA         AM13
         LAD         M21
         STA         AM21
         LAD         M22
         STA         AM22
         LAD         M23
         STA         AM23
         LAD         M31
         STA         AM31
         LAD         M32
         STA         AM32
         LAD         M33
         STA         AM33
<
< INITIALISATION DU MODULE
< DE RESOLUTION DES SYSTEMES
< LINEAIRES 3*3, INITIALI-
< SATION DES VARIABLES :
<
         LAD         DVARU
         STA         AVARX           < PREMIERE VARIABLE : $U,
         LAD         DVARV
         STA         AVARY           < DEUXIEME VARIABLE : $V,
         LAD         DRHO
         STA         AVARZ           < TROISIEME VARIABLE : $RHO.
<
< MISE EN PLACE DU VECTEUR
< COLONNE (M13,M23,M33) QUI
< NE CHANGE JAMAIS :
<
         #/FLD#      DVX
         BSR         AFNEG
         #/FST#      M13             < M13=-VX,
         #/FLD#      DVY
         BSR         AFNEG
         #/FST#      M23             < M23=-VY,
         #/FLD#      DVZ
         BSR         AFNEG
         #/FST#      M33             < M33=-VZ.
<
< INITIALISATION DES
< VARIABLES COURANTES
< A PARTIR DU POINT 'M' :
<
         #/FLD#      VARUM
         #/FST#      VARU            < U <-- U(M),
         #/FLD#      VARVM
         #/FST#      VARV            < V <-- V(M),
         #/FLD#      FRHOM
         #/FST#      FRHO            < RHO <-- RHO(M).
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
< INITIALISATION EVENTUELLE
< DU SUIVI DE LA CONVERGENCE :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IWCONV          < LA VISUALISATION DE LA CONVERGENCE
                                     < EST-ELLE DEMANDEE ???
         JE          INTDST          < NON...
         BSR         ASPXP
         #/FST#      FXS             < FXS=X(U0,V0),
         BSR         ASPYP
         #/FST#      FYS             < FYS=Y(U0,V0),
         BSR         ASPZP
         #/FST#      FZS             < FZS=Z(U0,V0).
XWOR%1:  VAL         SIZXVI/XC512    < X-FACTEUR DE PASSAGE '512' --> 'VISU',
XWOR%2:  VAL         SIZYVI/XL512    < Y-FACTEUR DE PASSAGE '512' --> 'VISU'.
         IF          XWOR%1-XWOR%2,,XEIF%,
         IF          ATTENTION : LE CALCUL DE 'FACT' EST IDIOT !!!
XEIF%:   VAL         ENDIF
         #/FLD#      FACT
         PSR         A,B             < SAUVEGARDE DE 'FACT'...
         LRM         A,B
         FLOAT       <XWOR%1?XWOR%2<K<K
         #/FST#      FACT            < FACTEUR D'ECHELLE POUR LE TRACE GRA-
                                     < PHIQUE SUR VISU...
         BSR         APROJ           < PROJECTION DU POINT COURANT :
                                     < (FXS,FYS,FZS) --> (XS,YS)...
         PLR         A,B
         #/FST#      FACT            < ET RESTAURATION DE 'FACT'...
         BSR         ASP4            < MISE EN PLACE DU PREMIER POINT DU SUIVI
                                     < DE LA CONVERGENCE.
         QUIT        XXQUIT          < OUI, ON S'ARRETE A CHAQUE NOUVELLE
                                     < SERIE D'ITERATIONS, PUIS AU RETOUR :
         LAD         DEMOG
         SVC                         < DECHAINAGE GRAPHIQUE,
         LRM         A
         WORD        DEMWD2
         SVC                         < ET MISE EN MODE TIRETES...
INTDST:  EQU         $
XOPT1:   VAL         ENDIF
<
< PREPARATION DU TEST DE
< NON CONVERGENCE DE LA
< METHODE DE NEWTON :
<
         LRM         X
         WORD        MAXCO2          < (X)=NOMBRE DE BOUCLES D'ITERATION
                                     <     MAXIMUM AVANT DE DECRETER LA NON-
                                     <     CONVERGENCE DE L'ALGORITHME...
<
<
<        R E S O L U T I O N   I T E R A T I V E  :
<
<
INTDS3:  EQU         $
         PSR         X               < SAVE LE DETECTEUR DE NON CONVERGENCE...
<
< CALCUL DES DERIVEES
< PARTIELLES DE X(U,V) :
<
         LXI         XVARU           < (X)=VARIABLE DE DERIVATION (U),
         LYI         XSPX            < (Y)=FONCTION A DERIVER (X(U,V)),
         LAD         FHU             < (A)=ADRESSE DU PAS DE DERIVATION.
         BSR         ADERIP
         #/FST#      M11             < M11=DX(U0,V0)/DU.
         LXI         XVARV           < (X)=VARIABLE DE DERIVATION (V),
                                     < (Y)=FONCTION A DERIVER (X(U,V)),
         LAD         FHV             < (A)=ADRESSE DU PAS DE DERIVATION.
         BSR         ADERIP
         #/FST#      M12             < M12=DX(U0,V0)/DV.
<
< CALCUL DES DERIVEES
< PARTIELLES DE Y(U,V) :
<
         LXI         XVARU           < (X)=VARIABLE DE DERIVATION (U),
         LYI         XSPY            < (Y)=FONCTION A DERIVER (Y(U,V)),
         LAD         FHU             < (A)=ADRESSE DU PAS DE DERIVATION.
         BSR         ADERIP
         #/FST#      M21             < M21=DY(U0,V0)/DU.
         LXI         XVARV           < (X)=VARIABLE DE DERIVATION (V),
                                     < (Y)=FONCTION A DERIVER (Y(U,V)),
         LAD         FHV             < (A)=ADRESSE DU PAS DE DERIVATION.
         BSR         ADERIP
         #/FST#      M22             < M22=DY(U0,V0)/DV.
<
< CALCUL DES DERIVEES
< PARTIELLES DE Z(U,V) :
<
         LXI         XVARU           < (X)=VARIABLE DE DERIVATION (U),
         LYI         XSPZ            < (Y)=FONCTION A DERIVER (Z(U,V)),
         LAD         FHU             < (A)=ADRESSE DU PAS DE DERIVATION.
         BSR         ADERIP
         #/FST#      M31             < M31=DZ(U0,V0)/DU.
         LXI         XVARV           < (X)=VARIABLE DE DERIVATION (V),
                                     < (Y)=FONCTION A DERIVER (Z(U,V)),
         LAD         FHV             < (A)=ADRESSE DU PAS DE DERIVATION.
         BSR         ADERIP
         #/FST#      M32             < M32=DZ(U0,V0)/DV.
<
< CALCUL DES SECONDS
< MEMBRES (M14,M24,M34) :
<
         BSR         ASPXP           < X(U0,V0),
         #/FST#      FXS             < FXS=X(U0,V0),
         #/FLD#      FRHO            < RHO0,
         FMP         DVX             < RHO0*VX,
         FAD         FXSD            < XD+RHO0*VX,
         FSB         FXS             < XD+RHO0*VX-X(U0,V0),
         #/FST#      M14             < M14=XD+RHO0*VX-X(U0,V0).
         BSR         ASPYP           < Y(U0,V0),
         #/FST#      FYS             < FYS=Y(U0,V0),
         #/FLD#      FRHO            < RHO0,
         FMP         DVY             < RHO0*VY,
         FAD         FYSD            < YD+RHO0*VY,
         FSB         FYS             < YD+RHO0*VY-Y(U0,V0),
         #/FST#      M24             < M24=YD+RHO0*VY-Y(U0,V0).
         BSR         ASPZP           < Z(U0,V0),
         #/FST#      FZS             < FZS=Z(U0,V0),
         #/FLD#      FRHO            < RHO0,
         FMP         DVZ             < RHO0*VZ,
         FAD         FZSD            < ZD+RHO0*VZ,
         FSB         FZS             < ZD+RHO0*VZ-Z(U0,V0),
         #/FST#      M34             < M34=ZD+RHO0*VZ-Z(U0,V0).
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
< TRACE DE LA CONVERGENCE :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IWCONV          < LE TRACE DE CONVERGENCE EST-IL DEMANDE ??
         JE          INTDSR          < NON...
         BSR         APROJ           < OUI :
XWOR%1:  VAL         SIZXVI/XC512    < X-FACTEUR DE PASSAGE '512' --> 'VISU',
XWOR%2:  VAL         SIZYVI/XL512    < Y-FACTEUR DE PASSAGE '512' --> 'VISU'.
         IF          XWOR%1-XWOR%2,,XEIF%,
         IF          ATTENTION : LE CALCUL DE 'FACT' EST IDIOT !!!
XEIF%:   VAL         ENDIF
         #/FLD#      FACT
         PSR         A,B             < SAUVEGARDE DE 'FACT'...
         LRM         A,B
         FLOAT       <XWOR%1?XWOR%2<K<K
         #/FST#      FACT            < FACTEUR D'ECHELLE POUR LE TRACE GRA-
                                     < PHIQUE SUR VISU...
         BSR         APROJ           < PROJECTION 3D --> 2D DU POINT COURANT
                                     < (FXS,FYS,FZS).
         LAI         EXIST
         XM          IWGFI           < ON FORCE 'EXIST' DANS 'IWGFI' AFIN QUE
                                     < 'SP2B' FONCTIONNE, ET ON SAUVEGARDE
                                     < (IWGFI) DANS 'A'...
         BSR         ASP2B           < TRACE DU SUIVI COURANT, ET CHAINAGE...
         STA         IWGFI           < ET RESTAURATION DE 'IWGFI'...
         PLR         A,B
         #/FST#      FACT            < ET RESTAURATION DE 'FACT'...
INTDSR:  EQU         $
XOPT1:   VAL         ENDIF
<
< RESOLUTION DU SYSTEME
< 3*3 COURANT :
<
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ACRAMR          < ON UTILISE LA METHODE DE CRAMER...
                                     < CE QUI DONNE ($U,$V,$RHO), SOIT
                                     < (DVARU,DVARV,DRHO)...
         BSR         ATSFLO
<
< VALIDATION DE LA SOLUTION :
<
         #/FLD#      DVARU           < $U,
         BSR         AFABS           < ABS($U),
         LXI         XEPSU
         FCAM        &ALTORE         < ABS($U) EST SUPPOSE INFERIEUR A LA
                                     < EPS(U) :
         JL          INTDSK          < EFFECTIVEMENT...
QUIT01:  QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
         JMP         INTDSX          < ET ON VA FORCER UNE NON CONVERGENCE...
INTDSK:  EQU         $
         #/FLD#      DVARV           < $V,
         BSR         AFABS           < ABS($V),
         LXI         XEPSV
         FCAM        &ALTORE         < ABS($V) EST SUPPOSE INFERIEUR A LA
                                     < EPS(V) :
         JL          INTDSL          < EFFECTIVEMENT...
QUIT02:  QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
INTDSX:  EQU         $
         PLR         X               < RESTAURATION DU 'MAXCO2',
         JMP         INTDS6          < ET ON FORCE UNE NON-CONVERGENCE...
INTDSL:  EQU         $
<
< CALCUL DE LA NOUVELLE
< SOLUTION COURANTE :
<
         #/FLD#      VARU            < U0,
         FAD         DVARU           < U0+$U,
         BSR         APSEGU          < POSITIONNEMENT SUR LE TORE...
         BSR         AFLEPS          < TEST D'UNDERFLOW PREVISIBLE...
         #/FST#      VARU            < U0 <-- U0+$U.
         #/FLD#      VARV            < V0,
         FAD         DVARV           < V0+$V,
         BSR         APSEGV          < POSITIONNEMENT SUR LE TORE...
         BSR         AFLEPS          < TEST D'UNDERFLOW PREVISIBLE...
         #/FST#      VARV            < V0 <-- V0+$V.
         #/FLD#      FRHO            < RHO0,
         FAD         DRHO            < RHO0+$RHO,
         BSR         AFLEPS          < TEST D'UNDERFLOW PREVISIBLE...
         #/FST#      FRHO            < RHO0 <-- RHO0+$RHO.
<
< TEST DE CONVERGENCE :
<
         PLR         X               < RESTAURATION DU 'MAXCO2' COURANT :
         JDX         INTDS5          < TEST DE NON CONVERGENCE...
<
< CAS DE LA NON CONVERGENCE :
<
INTDSQ:  EQU         $
         PLR         X               < RESTAURATION DE (X)='MAXCO1', C'EST-A-
                                     < DIRE DU 'MAXCO1' COURANT...
         BSR         AGOTO
         WORD        INTDS7          < NON, CONVERGENCE : CELA SIGNIFIE QUE LA
                                     < DROITE 'D' COUPE LA FACETTE COURANTE,
                                     < MAIS PAS LA SURFACE 'S' AU VOISINNAGE
                                     < DE CETTE FACETTE (CAS FREQUENT AVEC LES
                                     < FACETTES "EXTERNES" POUR LES SURFACES
                                     < CONVEXES...), DONC ON SORT AVEC :
                                     < (SINTER)='NEXIST'...
<
< CAS DE LA "PEUT-ETRE"
< CONVERGENCE :
<
INTDS5:  EQU         $
         #/FLD#      DVARU           < TEST DE $U,
         FDV         FK              < HOMOTHETIE...
         BSR         ATSFLO
         BSR         AFABS           < EN VALEUR ABSOLUE :
         FCAM        FEPSUV          < 'U0' CONVERGE-T'IL ???
         JG          INTDS4          < NON, ON ITERE...
         #/FLD#      DVARV           < TEST DE $V,
         FDV         FK              < HOMOTHETIE...
         BSR         ATSFLO
         BSR         AFABS           < EN VALEUR ABSOLUE :
         FCAM        FEPSUV          < 'V0' CONVERGE-T'IL ???
         JG          INTDS4          < NON, ON ITERE...
         #/FLD#      DRHO            < TEST DE $RHO :
         FDV         FK              < HOMOTHETIE...
         BSR         ATSFLO
         BSR         AFABS           < EN VALEUR ABSOLUE :
         FCAM        FEPSUV          < 'RHO0' CONVERGE-T'IL ???
         JLE         INTDS6          < ET OUI, LA RESOLUTION EST TERMINEE...
<
< BOUCLE D'ITERATION:
<
INTDS4:  EQU         $
         BSR         AGOTO
         WORD        INTDS3          < ET ON ITERE...
<
< CAS DE LA CONVERGENCE :
<
INTDS6:  EQU         $
         PLR         X               < RESTAURATION DU 'MAXCO1' COURANT :
         JDX         INTDSI          < OK, ON A ENCORE DE LA MARGE...
QUIT31:  QUIT        XXQUIT          < N O N - C O N V E R G E N C E ...
         BSR         AGOTO
         WORD        INTDS7          < ET ON SORT, SANS AVOIR TROUVE DE
                                     < SOLUTION...
INTDSI:  EQU         $
<
<
<        V E R I F I C A T I O N   D E   L A   C O N V E R G E N C E
<                    V E R S   L A   B O N N E   R A C I N E  :
<
<
<        FONCTION :
<                      EN EFFET, VUE LA METHODE
<                    ITERATIVE UTILISEE, IL EST
<                    TOUJOURS POSSIBLE QUE LA ME-
<                    THODE CONVERGE VERS UNE AUTRE
<                    RACINE QUE CELLE QUE L'ON
<                    CHERCHE.
<                      POUR CE FAIRE, ON TESTE ICI
<                    QUE LA SOLUTION TROUVEE (VARU,VARV)
<                    EST INTERIEURE AU TRIANGLE (A,B,C).
<                    ON CALCULE ALORS LES COORDONNEES
<                    BARYCENTRIQUES DE LA SOLUTION
<                    TROUVEE (U,V) DANS (A,B,C), ON
<                    RESOUD DONC LE SYSTEME :
<
<                                    ALPHA*UA+BETA*UB+GAMMA*UC=U,
<                                    ALPHA*VA+BETA*VB+GAMMA*VC=V,
<                                    ALPHA   +BETA   +GAMMA   =1.
<
<                    PUIS ON VERIFIE QUE LES COOR-
<                    DONNEES TROUVEES SONT BIEN
<                    BARYCENTRIQUES, C'EST-A-DIRE
<                    QU'ELLES VERIFIENT BIEN :
<
<                                    0 <= ALPHA <= 1,
<                                    0 <= BETA  <= 1,
<                                    0 <= GAMMA <= 1.
<
<                      EN FAIT, CETTE FACON DE VOIR
<                    LES CHOSE NE SUFFIT PAS ; EN
<                    EFFET, LA CONVERGENCE, LORSQUE
<                    LA DROITE 'D' EST ASSEZ INCLINEE
<                    RAPPORT A LA FACETTE COURANTE,
<                    PEUT AVOIR LIEU "HORS" DE LA
<                    FACETTE ; ON DEFINIT ALORS LA
<                    NOTION DE "COORDONNEES BARY-
<                    CENTRIQUES GENERALISEES", DEFI-
<                    NIES COMME CI-DESSUS, ET TELLES
<                    QUE :
<
<                                    'FBARI' <= ALPHAP <= 'FBARS',
<                                    'FBARI' <= BETAP  <= 'FBARS',
<                                    'FBARI' <= GAMMAP <= 'FBARS',
<
<                    ET TEL QUE LE SEGMENT (0,1) DE
<                    DEFINITION DES COORDONNEES BARY-
<                    CENTRIQUES "NORMALES" SOIT INCLUS
<                    DANS LE SEGMENT (FBARI,FBARS) DE
<                    DEFINITION DES COORDONNEES BARY-
<                    CENTRIQUES "GENERALISEES"...
<
<
INTDS8:  EQU         $
<
< VERIFIONS AU PREALABLE
< QUE (U,V,RHO) EST UNE
< SOLUTION ACCEPTABLE,
< MEME SI CE N'EST PAS
< CELLE QUE L'ON ATTEN-
< DAIT :
<
         BSR         ASPXP           < X(U,V),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FRHO            < RHO,
         FMP         DVX             < RHO*VX,
         FAD         FXSD            < XD+RHO*VX,
         FSB         FWORK           < (XD+RHO*XV)-X(U,V),
         BSR         AFABS           < ABS((XD+RHO*VX)-X(U,V)),
         FCAM        FEPSUV          < ALORS, (U,V,RHO) EST-IL PRESQUE UNE
                                     < BONNE SOLUTION ???
         JLE         INTDSM          < OUI, OK...
QUIT11:  QUIT        XXQUIT          < E R R E U R   D E   C O N V E R G E N C E
         JMP         AINDS9          < ET ON FORCE UNE CONVERGENCE VERS UNE
                                     < MAUVAISE RACINE...
INTDSM:  EQU         $
         BSR         ASPYP           < Y(U,V),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FRHO            < RHO,
         FMP         DVY             < RHO*VY,
         FAD         FYSD            < YD+RHO*VY,
         FSB         FWORK           < (YD+RHO*XV)-Y(U,V),
         BSR         AFABS           < ABS((YD+RHO*VY)-Y(U,V)),
         FCAM        FEPSUV          < ALORS, (U,V,RHO) EST-IL PRESQUE UNE
                                     < BONNE SOLUTION ???
         JLE         INTDSN          < OUI, OK...
QUIT12:  QUIT        XXQUIT          < E R R E U R   D E   C O N V E R G E N C E
         JMP         AINDS9          < ET ON FORCE UNE CONVERGENCE VERS UNE
                                     < MAUVAISE RACINE...
INTDSN:  EQU         $
         BSR         ASPZP           < Z(U,V),
         BSR         ASFWOR          < ET SAVE...
         #/FLD#      FRHO            < RHO,
         FMP         DVZ             < RHO*VZ,
         FAD         FZSD            < ZD+RHO*VZ,
         FSB         FWORK           < (ZD+RHO*XV)-Z(U,V),
         BSR         AFABS           < ABS((ZD+RHO*VZ)-Z(U,V)),
         FCAM        FEPSUV          < ALORS, (U,V,RHO) EST-IL PRESQUE UNE
                                     < BONNE SOLUTION ???
         JLE         INTDSO          < OUI, OK...
QUIT13:  QUIT        XXQUIT          < E R R E U R   D E   C O N V E R G E N C E
AINDS9:  EQU         $               < RELAI...
         BSR         AGOTO
         WORD        INTDS9          < ET ON FORCE UNE CONVERGENCE VERS UNE
                                     < MAUVAISE RACINE...
INTDSO:  EQU         $
<
< INITIALISATION DU MODULE
< DE RESOLUTION DES SYSTEMES
< LINEAIRES 3*3 ; A NOTER QUE
< LES RELAIS ((AM11,AM12,AM13),
< (AM21,AM22,AM23)) SONT BONS :
<
         PSR         Y
<
< TEST DE LA POSITION DU TRIANGLE
< (A,B,C) PAR RAPPORT AU MILIEU DU
< SEGMENT (MIN(U),(MAX(U)) :
<
         BSR         ATRIGU          < RENVOIE (Y)...
<
< INITIALISATION DU VECTEUR M(1) :
<
         #/FLD#      VARUA           < UA,
         BSR         APERIU          < POSITIONNEMENT SUR LE TORE,
         #/FST#      M11             < M11=UA.
         #/FLD#      VARUB           < UB,
         BSR         APERIU          < POSITIONNEMENT SUR LE TORE,
         #/FST#      M12             < M12=UB.
         #/FLD#      VARUC           < UC,
         BSR         APERIU          < POSITIONNEMENT SUR LE TORE,
         #/FST#      M13             < M13=UC.
<
< TEST DE LA POSITION DU TRIANGLE
< (A,B,C) PAR RAPPORT AU MILIEU DU
< SEGMENT (MIN(V),(MAX(V)) :
<
         BSR         ATRIGV          < RENVOIE (Y)...
<
< INITIALISATION DU VECTEUR M(2) :
<
         #/FLD#      VARVA           < VA,
         BSR         APERIV          < POSITIONNEMENT SUR LE TORE,
         #/FST#      M21             < M21=VA.
         #/FLD#      VARVB           < VB,
         BSR         APERIV          < POSITIONNEMENT SUR LE TORE,
         #/FST#      M22             < M22=VB.
         #/FLD#      VARVC           < VC,
         BSR         APERIV          < POSITIONNEMENT SUR LE TORE,
         #/FST#      M23             < M23=VC.
<
< INITIALISATION DU VECTEUR M(3) :
<
         LAD         F1
         STA         AM31            < M31 --> 1,
         STA         AM32            < M32 --> 1,
         STA         AM33            < M33 --> 1.
<
< INITIALISATION "PHYSIQUE"
< DES SECONDS MEMBRES :
<
         #/FLD#      VARU
         #/FST#      M14             < M14=U,
         #/FLD#      VARV
         #/FST#      M24             < M24=V,
         #/FLD#      F1
         #/FST#      M34             < M34=1,
         PLR         Y
<
< INITIALISATION DU MODULE
< DE RESOLUTION DES SYSTEMES
< LINEAIRES 3*3, INITIALI-
< SATION DES VARIABLES :
<
ALPHAP:  EQU         DA              < DEFINITION DE
BETAP:   EQU         DB              <               (ALPHA,BETA,GAMMA)
GAMMAP:  EQU         DC              <                                  PRIME.
         LAD         ALPHAP
         STA         AVARX           < PREMIERE VARIABLE : 'ALPHAP',
         LAD         BETAP
         STA         AVARY           < DEUXIEME VARIABLE : 'BETAP',
         LAD         GAMMAP
         STA         AVARZ           < TROISIEME VARIABLE : 'GAMMAP'.
<
< RESOLUTION DU SYSTEME 3*3 :
<
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ACRAMR          < CALCUL DE (ALPHA,BETA,GAMMA) PAR LA
                                     < METHODE DE CRAMER...
         BSR         ATSFLO
<
< LA SOLUTION (U,V) EST-ELLE
< DANS LE TRIANGLE GENERALISE
< (AP,BP,CP) DES COORDONNEES
< BARYCENTRIQUES "GENERALISEES" :
<
         #/FLD#      ALPHAP          < TEST DE 'ALPHAP' :
         FCAM        FBARI           < TEST PAR RAPPORT A LA BORNE INFERIEURE ?
         JL          INTDS9          < HORS TRIANGLE...
         FCAM        FBARS           < TEST PAR RAPPORT A LA BORNE SUPERIEURE ?
         JG          INTDS9          < HORS TRIANGLE...
         #/FLD#      BETAP           < TEST DE 'BETAP' :
         FCAM        FBARI           < TEST PAR RAPPORT A LA BORNE INFERIEURE ?
         JL          INTDS9          < HORS TRIANGLE...
         FCAM        FBARS           < TEST PAR RAPPORT A LA BORNE SUPERIEURE ?
         JG          INTDS9          < HORS TRIANGLE...
         #/FLD#      GAMMAP          < TEST DE 'GAMMAP' :
         FCAM        FBARI           < TEST PAR RAPPORT A LA BORNE INFERIEURE ?
         JL          INTDS9          < HORS TRIANGLE...
         FCAM        FBARS           < TEST PAR RAPPORT A LA BORNE SUPERIEURE ?
         JLE         INTDS0          < SUPER... LA SOLUTION (U,V) EST RESTEE
                                     < DANS LE TRIANGLE (AP,BP,CP), ON ESTIME
                                     < A JUSTE TITRE QUE LE PROCESSUS A
                                     < CONVERGE VERS LA RACINE CHERCHEE...
<
<
<        C A S   D E   L A   C O N V E R G E N C E   V E R S
<                    L A   M A U V A I S E   R A C I N E  :
<
<
INTDS9:  EQU         $
<
< CAS DE CONVERGENCE VERS UNE
< AUTRE SOLUTION ; CE COMPOR-
< TEMENT ETANT APPAREMMENT ALEA-
< TOIRE ET IMPREVISIBLE, ON VA
< PROCEDER A UNE PERTURBATION
< DES CONDITIONS INITIALES :
< PERTURBATION DE LA SOLUTION
< INITIALE (VARUM,VARVM) ; POUR
< CELA, ON VA MODIFIE LES COOR-
< DONNEES BARYCENTRIQUES
< (ALPHA,BETA,GAMMA) DE CETTE
< SOLUTION D'UNE MANIERE FINE,
< ET EN RESTANT BIEN ENTENDU A
< L'INTERIEUR DE LA DEFINITION
< DES COORDONNEES BARYCENTRIQUES :
<
INTDSB:  EQU         $
<
< INITIALISATION :
<
         LAD         ALPHA
         STA         AMIN            < A PRIORI : ALPHA=MIN(ALPHA,BETA,GAMMA),
         LAD         BETA
         STA         AMIL            < A PRIORI : BETA=MIL(ALPHA,BETA,GAMMA),
         LAD         GAMMA
         STA         AMAX            < A PRIORI : GAMMA=MAX(ALPHA,BETA,GAMMA).
<
< TRI PAR ORDRE DECROISSANT
< DES COORDONNEES BARYCENTRIQUES
< (ALPHA,BETA,GAMMA) DE LA
< SOLUTION INITIALE :
<
         BSR         ASPTRI          < TRI(ALPHA,BETA,GAMMA)...
<
< PERTURBATION DE (ALPHA,BETA,GAMMA) ;
< ON VA DIMINUER MAX(ALPHA,BETA,GAMMA),
< AUGMENTER MIN(ALPHA,BETA,GAMMA),
< SACHANT QU'ON RESPECTE LA RELATION
< MAX+MIL+MIN=ALPHA+BETA+GAMMA=1 :
<
         FLD         &AMAX           < MAX(ALPHA,BETA,GAMMA),
         FDV         FREDUC          < DONT ON PRELEVE UNE FRACTION,
         BSR         AFLEPS          < ATTENTION AUX UNDERFLOWS...
         JNE         INTDSE          < OK...
QUIT41:  QUIT        XXQUIT          < QUE FAIRE : CAR LA FRACTION A ETE RAMENEE
                                     < A 0 ???
INTDSE:  EQU         $
         BSR         AFNEG
         FAD         &AMAX
         FST         &AMAX           < MAX <-- (MAX)-(MAX)/FREDUC.
         FLD         &AMIN           < MIN(ALPHA,BETA,GAMMA),
         FDV         FREDUC          < DONT ON PRELEVE UNE FRACTION,
         BSR         AFLEPS          < ATTENTION AUX UNDERFLOWS...
         JNE         INTDSF          < OK...
QUIT42:  QUIT        XXQUIT          < QUE FAIRE : CAR LA FRACTION A ETE RAMENEE
                                     < A 0 ???
INTDSF:  EQU         $
         FAD         &AMIN
         FST         &AMIN           < MIN <-- (MIN)+(MIN)/FREDUC.
         FAD         &AMAX           < MIN+MAX,
         FSB         F1              < MIN+MAX-1,
         BSR         AFNEG           < 1-MIN-MAX,
         FST         &AMIL           < MIL <-- 1-(MAX)-(MIN)...
         BSR         ATSFLO
<
< CALCUL D'UNE NOUVELLE
< SOLUTION APPROCHEE DE
< DEPART (VARUM,VARVM) :
<
         BSR         APUVM           < CALCUL DE (VARUM,VARVM)...
<
< CALCUL D'UNE NOUVELLE
< SOLUTION APPROCHEE DE
< DEPART (FRHOM) ; ON A
< TENDANCE A PENSER QUE
< L'ITERATEUR EST ALLE
< DANS LE MAUVAIS SENS,
< ON VA DONC TENTER D'IN-
< VERSER LE MOUVEMENT :
<
         #/FLD#      FRHOM           < 'RHO' DE DEPART PRECEDENT, SOIT 'RHO0',
         FDV         F05             < 2*RHO0,
         FSB         FRHO            < 2*RHO0-RHO,
         #/FST#      FRHOM           < CE QUI DONNE LE NOUVEAU 'RHO0', QUI EST
                                     < EN FAIT LE SYMETRIQUE DU 'RHO' CALCULE
                                     < PAR RAPPORT AU 'RHO0' PRECEDENT...
<
< VERS UNE NOUVELLE ITERATION :
<
         BSR         AGOTO
         WORD        INTDS1          < APRES QUELQUES MODIFICATIONS (??!?!!???),
                                     < ON RE-TENTE...
<
<
<        C A S   D E   L A   C O N V E R G E N C E   V E R S   L A
<        B O N N E   R A C I N E   Q U E   L ' O N   S U P P O S E
<        E T R E   S E U L E   D A N S   L E   T R I A N G L E   ( A , B , C ) :
<
<
INTDS0:  EQU         $
<
< CONVERGENCE HEURISTIQUE :
<
         #/FLD#      VARU            < ACCES A LA SOLUTION 'U',
         FSB         VARU0           < U-U0,
         LXI         XHEURU
         FMP         &ALTORE         < (U-U0)*HEUR(U),
         LX          FOCTA           < (X)=OCTANT DE LA FACETTE,
         ADRI        XEPSU0,X        < CONVERSION EN UN INDEX FLOTTANT,
         FST         &ALTORE         < 'DU0' POUR LE PROCHAIN COUP...
         #/FLD#      VARV            < ACCES A LA SOLUTION 'V',
         FSB         VARV0           < V-V0,
         LXI         XHEURV
         FMP         &ALTORE         < (V-V0)*HEUR(V),
         LX          FOCTA           < (X)=OCTANT DE LA FACETTE,
         ADRI        XEPSV0,X        < CONVERSION EN UN INDEX FLOTTANT,
         FST         &ALTORE         < 'DV0' POUR LE PROCHAIN COUP...
<
< MEMORISATION DE LA CON-
< VERGENCE (POINT D'INTER-
< SECTION TROUVE) :
<
         IF          EXIST-K,,,XEIF%
         IF          ATTENTION : LE 'IC' QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         IC          SINTER          < ON A TROUVE UN POINT D'INTERSECTION ENTRE
                                     < 'D' ET 'S', DONT ON VA METTRE LES COOR-
                                     < DONNEES DANS (FXS,FYS,FZS)...
<
<
<        C A L C U L   D U   P O I N T   D ' I N T E R S E C T I O N
<        E N T R E   L A   D R O I T E   ' D '   E T   L A   S U R F A C E  :
<
<
         BSR         ASPXP
         #/FST#      FXS             < XM=X(U0,V0),
         BSR         ASPYP
         #/FST#      FYS             < YM=Y(U0,V0),
         BSR         ASPZP
         #/FST#      FZS             < ZM=Z(U0,V0).
<
< ET RETOUR :
<
INTDS7:  EQU         $
         CPZ         SINTER          < POSITIONNEMENT DES INDICATEURS...
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        T E S T   D ' U N D E R F L O W   F L O T T A N T
<                    P R E V I S I B L E  :
<
<
<        FONCTION :
<                      LORS DE L'UTILISATION DE METHODES
<                    ITERATIVES EN PARTICULIER, LORSQUE
<                    LES NOMBRE FLOTTANTS CONVERGENT VERS
<                    LE ZERO FLOTTANT, ILS PASSENT PAR LE
<                    PLUS PETIT NOMBRE FLOTTANT REPRESEN-
<                    TABLE (E-37) ; CE SOUS-PROGRAMME
<                    DETECTE DONC L'APPROCHE DE SON VOI-
<                    SINNAGE, ET REMPLACE ALORS LE NOMBRE
<                    ARGUMENT PAR LE VRAI ZERO FLOTTANT...
<
<
<        ARGUMENT :
<                    (A,B)=NOMBRE FLOTTANT A TESTER.
<
<
<        RESULTAT :
<                    (A,B)=NOMBRE FLOTTANT EVENTUELLEMENT NUL,
<                    INDICATEURS POUR FAIRE UN 'JE' SI LE REMPLACEMENT
<                    PAR LE VRAI ZERO FLOTTANT A ETE FAIT, OU BIEN SI
<                    L'ARGUMENT ETAIT DEJA NUL...
<
<
<        A T T E N T I O N  :
<                      CE SOUS-PROGRAMME DETRUIT 'FWORK' !!!
<
<
FLEPS:   EQU         $
         PSR         A,B             < SAUVEGARDE DU NOMBRE FLOTTANT ARGUMENT...
         BSR         AFABS           < AFIN DE FAIRE DES TESTS EN VALEUR ABSOLUE
         BSR         ASFWOR          < ET MISE DE ABS(ARGUMENT) DANS 'FWORK'...
         LRM         A,B
XWOR%1:  VAL         BASE10=K
XWOR%1:  VAL         NBITMO-B-XWOR%1 < RANG DU DERNIER BIT DE BASE10...
XWOR%1:  VAL         CORBT?XWOR%1=FMASK(K?BASE10=FCINST
XWOR%2:  VAL         XWOR%1=K
XWOR%2:  VAL         NBITMO-B-XWOR%2
XWOR%3:  VAL         CORBT?XWOR%2=FMASK(K?XWOR%1=FCINST
         IF          XWOR%3-K,,XEIF%,
         IF          ATTENTION : IL Y A PLUS DE 2 BITS A 1 DANS 'BASE10' !!!
XEIF%:   VAL         ENDIF
XWOR%4:  VAL         COSBT?XWOR%2=FMASK(K=FCINST
XWOR%4:  VAL         XWOR%4=K+E      < 'XWOR%4' EST UNE VALEUR ENTIERE PAR
                                     < EXCES DE LOG(BASE10) EN BASE2...
XWOR%5:  VAL         CORBT?BITPAR=FMASK(K?MOCD=FCINST
         NTRN
XWOR%5:  VAL         XWOR%5/XWOR%4   < 'XWOR%5' EST UN EXPOSANT VOISIN DU
                                     < PLUS PETIT (AVEC LE SIGNE 'MOINS') RE-
                                     < PRESENTABLE EN FLOTTANT...
XWOR%6:  VAL         XWOR%5/XXXMOY   < AFIN DE PREVENIR UNE EVENTUELLE ELEVA-
                                     < TION AU CARRE (COMME C'EST PAR EXEMPLE
                                     < LE CAS DANS 'SIN' ET 'COS' POUR 'VARU'
                                     < ET 'VARV'...).
         TRN
XWOR%6:  VAL         XWOR%6-W        < AFIN D'AVOIR UNE MARGE DE SECURITE
                                     < SUPPLEMENTAIRE...
         FLOAT       <W<K<-XWOR%6    < (A,B)=UN NOMBRE FLOTTANT TOUT PETIT
                                     <       VOISIN DU PLUS PETIT NOMBRE
                                     <       FLOTTANT REPRESENTABLE...
         FCAM        FWORK           < ALORS, LE NOMBRE FLOTTANT ARGUMENT
                                     < EST-IL VOISIN DE CE MINIMUM ???
         PLR         A,B             < (A,B)=NOMBRE ARGUMENT A PRIORI...
         JL          FEPS1           < NON :
                                     < ABS(ARGUMENT)>1.E-30...
         #/FLD#      F0              < OUI, ON REMPLACE DONC LE NOMBRE ARGUMENT
                                     < PAR LE VRAI ZERO FLOTTANT...
FEPS1:   EQU         $
         BSR         AFCAZ           < POSITIONNEMENT DES INDICATEURS POUR UN
                                     < TEST EN RETOUR...
         RSR                         < ET RETOUR...
         PAGE
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
<
<        V I S U A L I S A T I O N   D E   L' I N T E R S E C T I O N
<                    D E   ' D '   E T   ' S '  :
<
<
<        FONCTION :
<                      CE MODULE VISUALISE SOUS
<                    FORME D'UN POINT (FXS,FYS,FZS)
<                    QUI CONTIENT L'INTERSEC-
<                    TION DE 'D' ET DE 'S'...
<
<
SP8S:    EQU         $
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IWGIDS          < FAUT-IL VISUALISER CETTE INTERSECTION ???
         JE          SP8S1           < NON...
         CPZ         BINTER          < OUI, MAIS Y-A-T'IL INTERSECTION ENTRE
                                     < 'D' ET 'B' ???
         JE          SP8S1           < NON...
         CPZ         PINTER          < OUI, MAIS Y-A-T'IL INTERSECTION ENTRE
                                     < 'D' ET 'P' ???
         JE          SP8S1           < NON...
         CPZ         SINTER          < OUI, ENTRE 'D' ET 'P', MAIS ENTRE 'D'
                                     < ET 'S' ???
         JE          SP8S1           < NON...
<
< INITIALISATIONS :
<
         PSR         A,B,X
<
< PROJECTION 2D --> 3D :
<
         BSR         APROJ           < (FXS,FYS,FZS) --> (XS,YS)...
<
< ET MISE DANS LE BUFFER
< GRAPHIQUE D'EDITION :
<
         BSR         ASP4            < TRANSFERT DE L'ORIGINE,
         BSR         ASP7            < ET DE L'EXTREMITE...
<
< ET TRACE D'UN POINT :
<
         LAD         DEMOG
         SVC                         < DECHAINAGE...
         LAD         DEMWG
         SVC                         < ET TRACE DU POINT...
<
< ET RETOUR :
<
         PLR         A,B,X
SP8S1:   EQU         $
         RSR
XOPT1:   VAL         ENDIF
         PAGE
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
<
<        T R A C E   D E   L A   N O R M A L E   A   U N   P L A N  :
<
<
<        FONCTION :
<                      CE MODULE, POUR CHAQUE
<                    FACETTE DETERMINE LE BARYCENTRE
<                    G=(A,B,C)/3, ET EN CE POINT TRACE
<                    LE VECTEUR NORMAL (PLANA,PLANB,PLANC).
<
<
SP6:     EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
<
< CALCUL DU BARYCENTRE :
<
         #/FLD#      FXSA            < XA,
         FAD         FXSB            < XA+XB,
         FAD         FXSC            < XA+XB+XC,
         FDV         F3              < (XA+XB+XC)/3,
         BSR         ATSFLO
         #/FST#      FXS             < CE QUI DONNE XG.
         #/FLD#      FYSA            < YA,
         FAD         FYSB            < YA+YB,
         FAD         FYSC            < YA+YB+YC,
         FDV         F3              < (YA+YB+YC)/3,
         BSR         ATSFLO
         #/FST#      FYS             < CE QUI DONNE YG.
         #/FLD#      FZSA            < ZA,
         FAD         FZSB            < ZA+ZB,
         FAD         FZSC            < ZA+ZB+ZC,
         FDV         F3              < (ZA+ZB+ZC)/3,
         BSR         ATSFLO
         #/FST#      FZS             < CE QUI DONNE ZG.
         BSR         APROJ           < PROJECTION DU BARYCENTRE,
         BSR         ASP4            < ET INSERTION DANS LA LISTE GRAPHIQUE.
<
< DEFINITION D'UN VECTEUR
< COLINEAIRE AU VECTEUR
< NORMAL EN 'G' :
<
         #/FLD#      PLANA           < XN,
         FMP         FACTN           < FN*XN,
         FAD         FXS             < XG+FN*XN,
         #/FST#      FXS             < CE QUI DONNE 'X'.
         #/FLD#      PLANB           < YN,
         FMP         FACTN           < FN*YN,
         FAD         FYS             < YG+FN*YN,
         #/FST#      FYS             < CE QUI DONNE 'Y'.
         #/FLD#      PLANC           < ZN,
         FMP         FACTN           < FN*ZN,
         FAD         FZS             < ZG+FN*ZN,
         #/FST#      FZS             < CE QUI DONNE 'Z'.
         BSR         APROJ           < PROJECTION DE L'EXTREMITE DU VECTEUR
                                     < COLINEAIRE AU VECTEUR NORMAL EN 'G',
         BSR         ASP7            < ET MISE DANS LA LISTE GRAPHIQUE...
<
< TRACE DU VECTEUR NORMAL :
<
         LAD         DEMOG
         SVC                         < DECHAINAGE...
         LRM         A
         WORD        DEMWD1
         SVC                         < MISE EN MODE POINTILLES...
         LAD         DEMWG
         SVC                         < ET TRACE DU VECTEUR NORMAL...
         LRM         A
         WORD        DEMWD0
         SVC                         < AFIN DE REVENIR AU TRACE NORMAL...
<
< ET RETOUR :
<
         PLR         A,B,X
         RSR
XOPT1:   VAL         ENDIF
         PAGE
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
<
<        R E P R E S E N T A T I O N   D E S   C O O R D O N N E E S
<                    B A R Y C E N T R I Q U E S ,
<        E T   V E R I F I C A T I O N S   C R O I S E E S  :
<
<
<        FONCTION :
<                      SOIT 'M' LE POINT D'INTER-
<                    SECTION DE LA DROITE 'D' ET
<                    DU PLAN 'P' ; IL A POUR COORDON-
<                    NEES BARYCENTRIQUES (ALPHA,
<                    BETA,GAMMA). ON TRACE LES 3
<                    VECTEURS AM, BM ET CM...
<
<
SP8:     EQU         $
<
< TEST D'EXISTENCE DE 'M' :
<
         CPZ         PINTER          < LE POINT 'M' EXISTE-T'IL ET EST-IL
                                     < INTERIEUR A LA FACETTE (A,B,C) ???
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : CE TEST EST IDIOT !!!
XEIF%:   VAL         ENDIF
         JE          SP81            < NON, RIEN A FAIRE...
<
< INITIALISATIONS :
<
         PSR         A,B,X
<
< RE-CALCUL DU POINT 'M' PAR SES
< COORDONNEES BARYCENTRIQUES :
<
         #/FLD#      FXSA            < XA,
         FMP         ALPHA           < ALPHA*XA,
         BSR         ASFWOR
         #/FLD#      FXSB            < XB,
         FMP         BETA            < BETA*XB,
         BSR         APFWOR          < ALPHA*XA+BETA*XB,
         #/FLD#      FXSC            < XC,
         FMP         GAMMA           < GAMMA*XC,
         BSR         APFWOR          < ALPHA*XA+BETA*XB+GAMMA*XC,
         #/FST#      FXS             < CE QUI DONNE LA COORDONNEE 'XM'...
         FSB         FXSM            < ET COMPARAISON A 'XM' VERITABLE :
         BSR         AFABS
         FCAM        FEPS
         JL          SP82            < OK, ERREUR INFERIEURE A 'EPSILON'...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
SP82:    EQU         $
         #/FLD#      FYSA            < YA,
         FMP         ALPHA           < ALPHA*YA,
         BSR         ASFWOR
         #/FLD#      FYSB            < YB,
         FMP         BETA            < BETA*YB,
         BSR         APFWOR          < ALPHA*YA+BETA*YB,
         #/FLD#      FYSC            < YC,
         FMP         GAMMA           < GAMMA*YC,
         BSR         APFWOR          < ALPHA*YA+BETA*YB+GAMMA*YC,
         #/FST#      FYS             < CE QUI DONNE LA COORDONNEE 'YM'...
         FSB         FYSM            < ET COMPARAISON A 'YM' VERITABLE :
         BSR         AFABS
         FCAM        FEPS
         JL          SP83            < OK, ERREUR INFERIEURE A 'EPSILON'...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
SP83:    EQU         $
         #/FLD#      FZSA            < ZA,
         FMP         ALPHA           < ALPHA*ZA,
         BSR         ASFWOR
         #/FLD#      FZSB            < ZB,
         FMP         BETA            < BETA*ZB,
         BSR         APFWOR          < ALPHA*ZA+BETA*ZB,
         #/FLD#      FZSC            < ZC,
         FMP         GAMMA           < GAMMA*ZC,
         BSR         APFWOR          < ALPHA*ZA+BETA*ZB+GAMMA*ZC,
         #/FST#      FZS             < CE QUI DONNE LA COORDONNEE 'ZM'...
         FSB         FZSM            < ET COMPARAISON A 'YM' VERITABLE :
         BSR         AFABS
         FCAM        FEPS
         JL          SP84            < OK, ERREUR INFERIEURE A 'EPSILON'...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
SP84:    EQU         $
         BSR         APROJ           < PROJECTION DU POINT 'M',
         BSR         ASP4            < ET INSERTION DANS LA LISTE GRAPHIQUE...
         BSR         ASPA            < TRACE DE L'ETOILE (AM,BM,CM) AVEC LE
                                     < POINT 'M' CALCULE PAR (ALPHA,BETA,GAMMA).
<
< RETOUR AU POINT 'M' CALCULE PAR 'RHOM' :
<
         LRM         A,B
         WORD        CM3D            < (A)=POINT 'M' CALCULE,
         WORD        CS3D            < (B)=POINT 3D COURANT,
         BSR         AMOVE3          < MISE EN PLACE DU POINT 'M',
         BSR         APROJ           < PROJECTION 2D --> 3D,
         BSR         ASP4            < INSERTION DANS LA LISTE GRAPHIQUE,
         BSR         ASPA            < ET TRACE DE L'ETOILE (AM,BM,CM),
                                     < OU 'M' EST CALCULE PAR 'RHOM'...
<
< ET RETOUR :
<
         PLR         A,B,X
SP81:    EQU         $
         RSR
<
<
<        V E R S I O N   F A C E T T E S   " I N T E R N E S "  :
<
<
SP8I:    EQU         $
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IWGIFI          < TRACE-T'ON LES INTERSECTIONS DES FACETTES
                                     < "INTERNES" ET DE LA DROITE 'D' ???
         JE          E220            < NON...
         BSR         ASP8            < OUI, ALLONS-Y...
E220:    EQU         $
         RSR                         < ET RETOUR...
<
<
<        V E R S I O N   F A C E T T E S   " E X T E R N E S "  :
<
<
SP8E:    EQU         $
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IWGIFE          < TRACE-T'ON LES INTERSECTIONS DES FACETTES
                                     < "EXTERNES" ET DE LA DROITE 'D' ???
         JE          E221            < NON...
         BSR         ASP8            < OUI, ALLONS-Y...
E221:    EQU         $
         RSR                         < ET RETOUR...
XOPT1:   VAL         ENDIF
         PAGE
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
<
<        T R A C E   D E   ( A M , B M , C M )  :
<
<
<        FONCTION :
<                      CE MODULE CALCULE
<                    L'ETOILE (AM,BM,CM)
<                    ET L'AFFICHE...
<
<
SPA:     EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
<
< TRACE DE AM :
<
         LRM         A,B,X
         WORD        CA3D            < (A)=SOMMET 'A',
         WORD        CS3D            < (B)=POINT 3D COURANT,
         WORD        LBUF3D          < (X)=NOMBRE DE MOTS A DEPLACER.
         BSR         ASP9            < ET TRACE DU VECTEUR AM...
<
< TRACE DE BM :
<
         LRM         A,B,X
         WORD        CB3D            < (A)=SOMMET 'B',
         WORD        CS3D            < (B)=POINT 3D COURANT,
         WORD        LBUF3D          < (X)=NOMBRE DE MOTS A DEPLACER.
         BSR         ASP9            < ET TRACE DU VECTEUR BM...
<
< TRACE DE CM :
<
         LRM         A,B,X
         WORD        CC3D            < (A)=SOMMET 'C',
         WORD        CS3D            < (B)=POINT 3D COURANT,
         WORD        LBUF3D          < (X)=NOMBRE DE MOTS A DEPLACER.
         BSR         ASP9            < ET TRACE DU VECTEUR CM...
<
< ET RETOUR :
<
         PLR         A,B,X
         RSR
XOPT1:   VAL         ENDIF
         PAGE
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
<
<        T R A C E   D E S   V E C T E U R S   ( A M , B M , C M )  :
<
<
<        ARGUMENTS :
<                    (A)=ADRESSE DU SOMMET COURANT (A,B,C),
<                    (B)=ADRESSE DU POINT 3D COURANT,
<                    (X)=NOMBRE DE MOTS A DEPLACER.
<
<
SP9:     EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
<
< GESTION GRAPHIQUE :
<
         MOVE                        < MISE EN PLACE DE L'UN DES 3 SOMMETS
                                     < (A,B,C)...
         BSR         APROJ           < PROJECTION 2D --> 3D,
         BSR         ASP7            < ET MISE DANS LA LISTE GRAPHIQUE...
<
< REPRESENTATION GRAPHIQUE :
<
         LAD         DEMOG
         SVC                         < DECHAINAGE...
         LRM         A
         WORD        DEMWD2
         SVC                         < MISE EN MODE TIRETES...
         LAD         DEMWG
         SVC                         < ET TRACE DE L'UN DES VECTEURS (AM,BM,CM).
         LRM         A
         WORD        DEMWD0
         SVC                         < ET RETOUR AU MODE NORMAL...
<
< ET RETOUR :
<
         PLR         A,B,X
         RSR
XOPT1:   VAL         ENDIF
         PAGE
<
<
<        A C C E S   C O N S T A N T E   D E   T R A V A I L  :
<
<
<        ARGUMENT :
<                    (X)=NUMERO DE LA CONSTANTE (DE 0 A NCT-1), ET NON PAS
<                        SON INDEX EN DOUBLE-MOTS !!!
<
<
<        RESULTAT :
<                    (A,B)=VALEUR DE LA CONSTANTE.
<
<
SPCT:    EQU         $
<
< INITIALISATION :
<
         PSR         X
<
< VALIDATION DE LA CONSTANTE :
<
         LR          X,A             < VALIDATION DU NUMERO :
         JAL         SPCT1           < ERREUR...
         CPI         NCT
         JL          SPCT2           < OK...
SPCT1:   EQU         $
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
SPCT2:   EQU         $
<
< ACCES A LA CONSTANTE (X) :
<
         ADR         X,X             < (X)=INDEX-MOTS DE LA CONSTANTE,
         FLD         &ACT            < (A,B)=CONSTANTE DE TRAVAIL...
<
< ET RETOUR :
<
         PLR         X
         RSR
         PAGE
<
<
<        C A L C U L   S I N U S   E T   C O S I N U S  :
<
<
<        ARGUMENT :
<                    (A,B)=ANGLE EN RADIANS,
<
<
<        RESULTAT :
<                    (A,B)=LIGNE TRIGONOMETRIQUE DEMANDEE.
<
<
COS:     EQU         $               < ENTRY 'COSINUS' :
         FSB         PISUR2          < (A,B)=TETA-PI/2,
         BSR         AFNEG           < (A,B)=PI/2-TETA.
SIN:     EQU         $               < ENTRY 'SINUS' :
<
< INITIALISATIONS ET
< PREPARATION DE L'ANGLE :
<
         #/FST#      SCWOR1          < SAVE TEMPORAIRE DE L'ANGLE.
         STZ         ISIGSC
         JAGE        PSC072
         BSR         AFNEG
         #/FST#      SCWOR1
         IC          ISIGSC
PSC072:  EQU         $
         FDV         DEUXPI
         BSR         AFIX
         BSR         AFLT
         FMP         DEUXPI
         FSB         SCWOR1
         BSR         AFNEG
         FCAM        PI3141
         JL          PSC073
         FSB         PI3141
         IC          ISIGSC
PSC073:  EQU         $
         FCAM        PISUR2
         JL          PSC074
         FSB         PI3141
         BSR         AFNEG
PSC074:  EQU         $
<
< CALCUL DU POLYNOME :
<
         FDV         PISUR2
         #/FST#      SCWOR1
         FMP         SCWOR1
         #/FST#      SCWOR2
         FMP         POLSC4
         FAD         POLSC3
         FMP         SCWOR2
         FAD         POLSC2
         FMP         SCWOR2
         FAD         POLSC1
         FMP         SCWOR2
         FAD         PISUR2
         FMP         SCWOR1
         DC          ISIGSC
         JNE         PSC075
         BSR         AFNEG
PSC075:  EQU         $
<
< ET RETOUR :
<
         BSR         ATSFLO
         RSR
         PAGE
<
<
<        D E F I N I T I O N   D E S   T A B L E S
<        D ' A C C E L E R A T I O N   P O U R
<        L E   C A L C U L   D E S   F O N C T I O N S  :
<
<
<        FONCTION :
<                      AFIN D'EVITER DES RECALCULS
<                    DES FONCTIONS X(U,V), Y(U,V)
<                    ET Z(U,V) LORSQUE CELA EST
<                    POSSIBLE, ON MEMORISE DANS 3
<                    HASH-TABLES DES TRIPLETS DU
<                    TYPE (U,V,F(U,V)), OU 'F' DESI-
<                    GNE L'UNE DES 3 FONCTIONS 'X',
<                    'Y' OU 'Z'...
<
<
<        D E F I N I T I O N   D U   F O R M A T   D ' U N E   E N T R E E  :
<
<
HASHT::  VAL         O               < DEBUT D'UNE ENTREE DES HASH-TABLES :
HASHFR:: MOT         HASHT           < INDICATEUR DE LIBERTE :
                                     < ='NEXIST' : L'ENTREE EST INOCUPPEE,
                                     < ='EXIST'  : L'ENTREE EST OCCUPEE.
HASHU::  MOT         HASHFR+D        < COORDONNEE CURVILIGNE 'U',
HASHV::  MOT         HASHU+DFLOT     < COORDONNEE CURVILIGNE 'V'.
HASHF::  MOT         HASHV+DFLOT     < VALEUR DE F(U,V).
XWOR%7:  VAL         HASHF+DFLOT     < LONGUEUR UTILE D'UNE ENTREE...
XWOR%2:  VAL         -S              < POUR FAIRE UN DECALAGE A DROITE.
XWOR%1:  VAL         XWOR%7          < LONGUEUR UTILE D'ENE ENTREE...
         DO          NBITMO
XWOR%1:  VAL         XWOR%1>XWOR%2=FCPUSH
XWOR%1:  VAL         I               < INITIALISATION DU COMPTAGE...
         DO          NBITMO
XWOR%1:  VAL         K=FCPULL=FCSIGN+XWOR%1
LEHASH:: VAL         BIT>XWOR%1      < PLUS PETITE LONGUEUR D'UNE ENTREE D'UNE
                                     < HASH-TABLE QUI SOIT UNE PUISSANCE DE 2...
<
<
<        L O N G U E U R   D E S   H A S H - T A B L E S  :
<
<
LNHASH:: VAL         4               < LOGARITHME EN BASE 2 DU NOMBRE D'ENTREE,
                                     < ET CECI AFIN QUE LE NOMBRE D'ENTREE SOIT
                                     < UNE PUISSANCE DE 2...
NEHASH:: VAL         BIT>LNHASH      < NOMBRE D'ENTREE DE CHAQUE HASH-TABLE...
<
<
<        H A S H - T A B L E S  :
<
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : L'INITIALISATION DE 'HASHFR'
         IF          AVEC 'NEXIST' A L'AIDE D'UN 'DZS' EST MAUVAISE !!!
XEIF%:   VAL         ENDIF
XWOR%9:  VAL         NEHASH*LEHASH   < LONGUEUR EN MOTS DE CHACUNE DES HASH-
                                     < TABLES...
HASHTX:  EQU         $               < HASH-TABLE DES X(U,V).
         DZS         XWOR%9
HASHTY:  EQU         $               < HASH-TABLE DES Y(U,V).
         DZS         XWOR%9
HASHTZ:  EQU         $               < HASH-TABLE DES Z(U,V).
         DZS         XWOR%9
         PAGE
<
<
<        C A L C U L   D E   X ( U , V )  :
<
<
<        FONCTION :
<                      CE MODULE CALCULE LA FONCTION
<                    'X' AU POINT (U,V) SUR LA SURFA-
<                    CE ARGUMENT, SUIVANT L'EQUATION :
<
<                    X=MT11*X(U,V)+MT12*Y(U,V)+MT13*Z(U,V)+MT14.
<
<
SPXP:    EQU         $
<
< INITIALISATIONS :
<
         PSR         X,Y,L,W
         LRM         L,W
         WORD        FLOC+DEPBAS     < (L)=BASE DU LOCAL DE X(U,V),
         WORD        HASHTX          < (W)=BASE LA HASH-TABLE 'HASHTX'...
<
< TENTATIVE D'OPTIMISATION :
<
         LA          VARU            < U(0),
         EOR         VARU+DFLOT-Z    < U(0)*U(1),
         EOR         VARV            < U(0)*U(1)*V(0),
         EOR         VARV+DFLOT-Z    < U(0)*U(1)*V(0)*V(1), CE QUI NOUS DONNE
                                     < UNE COMBINAISON DE 'U' ET DE 'V'...
         LR          A,B             < ET SAVE...
         SCRS        LNHASH
         EORR        B,A             < ON COMBINE U(0)*U(1)*V(0)*V(1) A LUI-
                                     < MEME DECALE DU LOGARITHME EN BASE 2 DE
                                     < LA LONGUEUR D'UNE ENTREE DES HASH-
                                     < TABLES...
         LR          A,B             < ET SAVE...
         SCRS        NBITMO/NOCMO
         EORR        B,A             < ET ON RECOMMENCE SUR LA MOITIE D'UN MOT..
                                     < CE QUI DONNE 'LNHASH' PAQUETS IDENTIQUES
                                     < DE 'LNHASH' BITS, QUI CORRESPONDENT EN
                                     < FAIT A UNE GENERALISATION DE LA NOTION
                                     < DE BIT DE PARITE...
         IF          LNHASH*LNHASH-NBITMO,,XEIF%,
         IF          ATTENTION : CE QUI PRECEDE EST IDIOT !!!
XEIF%:   VAL         ENDIF
         IF          NBITMO/NOCMO/LNHASH=K-W,,XEIF%,
         IF          ATTENTION : CE QUI PRECEDE EST INCOMPLET !!!
XEIF%:   VAL         ENDIF
         ANDI        BIT>LNHASH-N    < (A)=INDEX "ALEATOIRE" ASSOCIE AU COUPLE
                                     < (U,V) COURANT,
XWOR%1:  VAL         LEHASH=K
         IF          BIT>XWOR%1-LEHASH,,XEIF%,
         IF          ATTENTION : 'LEHASH' N'EST PAS UNE PUISSANCE DE 2 !!!
XEIF%:   VAL         ENDIF
         SLLS        XWOR%1          < (A)=INDEX-MOT D'ACCES AUX HASH-TABLES
                                     <     ASSOCIE AU COUPLE (U,V) COURANT.
         ADR         A,W             < (W)=ADRESSE DE L'ENTREE DE 'HASHTX'
                                     <     ASSOCIEE AU COUPLE (U,V) COURANT...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         HASHFR,W        < L'ENTREE EST-ELLE INOCCUPEE ???
         JE          SPXP4           < OUI, INUTILE DE TESTER (U,V)...
         #/FLD#      VARU            < NON, ELLE EST OCCUPEE :
         FCAM        HASHU,W         < EST-ON EN PRESENCE DU 'U' COURANT ???
         JNE         SPXP4           < NON, PAS D'OPTIMISATION...
         #/FLD#      VARV            < OUI :
         FCAM        HASHV,W         < EST-ON EN PRESENCE DU 'V' COURANT ???
         JNE         SPXP4           < NON, PAS D'OPTIMISATION...
<
< CAS D'UNE RECHERCHE POSITIVE :
<
         #/FLD#      HASHF,W         < (A,B)=VALEUR DE X(U,V)...
         JMP         SPXP5           < ET VERS LA SORTIE IMMEDIATE...
<
< CAS D'UNE RECHERCHE NEGATIVE :
<
SPXP4:   EQU         $
         PSR         W               < ON MEMORISE L'ADRESSE DE L'ENTREE EN
                                     < HASH-TABLE...
<
< CALCUL DE X(U,V) :
<
         LXI         MT11
         #/FLD#      F0              < 'MT11' NUL A PRIORI...
         FCMZ        &AMTRAN         < QU'EN EST-IL REELLEMENT ???
         JE          SPX1            < OUI, (A,B)=0,
         BSR         ASPX            < NON, (A,B)=X(U,V),
         LXI         MT11
         FMP         &AMTRAN         < (A,B)=MT11*X(U,V),
SPX1:    EQU         $
         PSR         A,B             < ET SAUVEGARDE DE MT11*X(U,V)...
         LXI         MT12
         #/FLD#      F0              < 'MT12' NUL A PRIORI...
         FCMZ        &AMTRAN         < QU'EN EST-IL REELLEMENT ???
         JE          SPX2            < OUI, (A,B)=0,
         BSR         ASPY            < NON, (A,B)=Y(U,V),
         LXI         MT12
         FMP         &AMTRAN         < (A,B)=MT12*Y(U,V),
SPX2:    EQU         $
         PSR         A,B             < ET SAUVEGARDE DE MT12*Y(U,V)...
         LXI         MT13
         #/FLD#      F0              < 'MT13' NUL A PRIORI...
         FCMZ        &AMTRAN         < QU'EN EST-IL REELLEMENT ???
         JE          SPX3            < OUI, (A,B)=0,
         BSR         ASPZ            < NON, (A,B)=Z(U,V),
         LXI         MT13
         FMP         &AMTRAN         < (A,B)=MT13*Z(U,V),
SPX3:    EQU         $
         BSR         ASFWOR          < ET SAUVEGARDE DE MT13*Z(U,V)...
         PLR         A,B
         BSR         APFWOR          < MT12*Y(U,V)+MT13*Z(U,V),
         PLR         A,B
         BSR         APFWOR          < MT11*X(U,V)+MT12*Y(U,V)+MT13*Z(U,V),
         LXI         MT14
         FAD         &AMTRAN         < MT11*X(U,V)+MT12*Y(U,V)*MT13*Z(U,V)+MT14,
         FMP         FK              < ET MISE A L'ECHELLE...
<
< PREPARATION DES OPTIMISATIONS :
<
         PLR         W               < RESTAURATION DE 'W' :
                                     < (W)=ADRESSE DE L'ENTREE DE 'HASHTX'
                                     <     ASSOCIEE AU COUPLE (U,V) COURANT.
         PSR         A,B             < MEMORISATION DE X(U,V)...
         LAI         EXIST
         STA         HASHFR,W        < ON OCCUPE L'ENTREE SYSTEMATIQUEMENT...
         #/FLD#      VARU
         #/FST#      HASHU,W         < MEMORISATION DE 'U',
         #/FLD#      VARV
         #/FST#      HASHV,W         < MEMORISATION DE 'V',
         PLR         A,B
         #/FST#      HASHF,W         < ET MEMORISATION DE X(U,V)...
<
< ET RETOUR :
<
         BSR         ATSFLO
SPXP5:   EQU         $
         PLR         X,Y,L,W
         RSR
<
<
<        C A L C U L   D E   Y ( U , V )  :
<
<
<        FONCTION :
<                      CE MODULE CALCULE LA FONCTION
<                    'Y' AU POINT (U,V) SUR LA SURFA-
<                    CE ARGUMENT, SUIVANT L'EQUATION :
<
<                    Y=MT21*X(U,V)+MT22*Y(U,V)+MT23*Z(U,V)+MT24.
<
<
SPYP:    EQU         $
<
< INITIALISATIONS :
<
         PSR         X,Y,L,W
         LRM         L,W
         WORD        FLOC+DEPBAS     < (L)=BASE DU LOCAL DE Y(U,V),
         WORD        HASHTY          < (W)=BASE LA HASH-TABLE 'HASHTY'...
<
< TENTATIVE D'OPTIMISATION :
<
         LA          VARU            < U(0),
         EOR         VARU+DFLOT-Z    < U(0)*U(1),
         EOR         VARV            < U(0)*U(1)*V(0),
         EOR         VARV+DFLOT-Z    < U(0)*U(1)*V(0)*V(1), CE QUI NOUS DONNE
                                     < UNE COMBINAISON DE 'U' ET DE 'V'...
         LR          A,B             < ET SAVE...
         SCRS        LNHASH
         EORR        B,A             < ON COMBINE U(0)*U(1)*V(0)*V(1) A LUI-
                                     < MEME DECALE DU LOGARITHME EN BASE 2 DE
                                     < LA LONGUEUR D'UNE ENTREE DES HASH-
                                     < TABLES...
         LR          A,B             < ET SAVE...
         SCRS        NBITMO/NOCMO
         EORR        B,A             < ET ON RECOMMENCE SUR LA MOITIE D'UN MOT..
                                     < CE QUI DONNE 'LNHASH' PAQUETS IDENTIQUES
                                     < DE 'LNHASH' BITS, QUI CORRESPONDENT EN
                                     < FAIT A UNE GENERALISATION DE LA NOTION
                                     < DE BIT DE PARITE...
         IF          LNHASH*LNHASH-NBITMO,,XEIF%,
         IF          ATTENTION : CE QUI PRECEDE EST IDIOT !!!
XEIF%:   VAL         ENDIF
         IF          NBITMO/NOCMO/LNHASH=K-W,,XEIF%,
         IF          ATTENTION : CE QUI PRECEDE EST INCOMPLET !!!
XEIF%:   VAL         ENDIF
         ANDI        BIT>LNHASH-N    < (A)=INDEX "ALEATOIRE" ASSOCIE AU COUPLE
                                     < (U,V) COURANT,
XWOR%1:  VAL         LEHASH=K
         IF          BIT>XWOR%1-LEHASH,,XEIF%,
         IF          ATTENTION : 'LEHASH' N'EST PAS UNE PUISSANCE DE 2 !!!
XEIF%:   VAL         ENDIF
         SLLS        XWOR%1          < (A)=INDEX-MOT D'ACCES AUX HASH-TABLES
                                     <     ASSOCIE AU COUPLE (U,V) COURANT.
         ADR         A,W             < (W)=ADRESSE DE L'ENTREE DE 'HASHTY'
                                     <     ASSOCIEE AU COUPLE (U,V) COURANT...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         HASHFR,W        < L'ENTREE EST-ELLE INOCCUPEE ???
         JE          SPYP4           < OUI, INUTILE DE TESTER (U,V)...
         #/FLD#      VARU            < NON, ELLE EST OCCUPEE :
         FCAM        HASHU,W         < EST-ON EN PRESENCE DU 'U' COURANT ???
         JNE         SPYP4           < NON, PAS D'OPTIMISATION...
         #/FLD#      VARV            < OUI :
         FCAM        HASHV,W         < EST-ON EN PRESENCE DU 'V' COURANT ???
         JNE         SPYP4           < NON, PAS D'OPTIMISATION...
<
< CAS D'UNE RECHERCHE POSITIVE :
<
         #/FLD#      HASHF,W         < (A,B)=VALEUR DE Y(U,V)...
         JMP         SPYP5           < ET VERS LA SORTIE IMMEDIATE...
<
< CAS D'UNE RECHERCHE NEGATIVE :
<
SPYP4:   EQU         $
         PSR         W               < ON MEMORISE L'ADRESSE DE L'ENTREE EN
                                     < HASH-TABLE...
<
< CALCUL DE Y(U,V) :
<
         LXI         MT21
         #/FLD#      F0              < 'MT21' NUL A PRIORI...
         FCMZ        &AMTRAN         < QU'EN EST-IL REELLEMENT ???
         JE          SPY1            < OUI, (A,B)=0,
         BSR         ASPX            < NON, (A,B)=X(U,V),
         LXI         MT21
         FMP         &AMTRAN         < (A,B)=MT21*X(U,V),
SPY1:    EQU         $
         PSR         A,B             < ET SAUVEGARDE DE MT21*X(U,V)...
         LXI         MT22
         #/FLD#      F0              < 'MT22' NUL A PRIORI...
         FCMZ        &AMTRAN         < QU'EN EST-IL REELLEMENT ???
         JE          SPY2            < OUI, (A,B)=0,
         BSR         ASPY            < NON, (A,B)=Y(U,V),
         LXI         MT22
         FMP         &AMTRAN         < (A,B)=MT22*Y(U,V),
SPY2:    EQU         $
         PSR         A,B             < ET SAUVEGARDE DE MT22*Y(U,V)...
         LXI         MT23
         #/FLD#      F0              < 'MT23' NUL A PRIORI...
         FCMZ        &AMTRAN         < QU'EN EST-IL REELLEMENT ???
         JE          SPY3            < OUI, (A,B)=0,
         BSR         ASPZ            < NON, (A,B)=Z(U,V),
         LXI         MT23
         FMP         &AMTRAN         < (A,B)=MT23*Z(U,V),
SPY3:    EQU         $
         BSR         ASFWOR          < ET SAUVEGARDE DE MT23*Z(U,V)...
         PLR         A,B
         BSR         APFWOR          < MT22*Y(U,V)+MT23*Z(U,V),
         PLR         A,B
         BSR         APFWOR          < MT21*X(U,V)+MT22*Y(U,V)+MT23*Z(U,V),
         LXI         MT24
         FAD         &AMTRAN         < MT21*X(U,V)+MT22*Y(U,V)*MT23*Z(U,V)+MT24,
         FMP         FK              < ET MISE A L'ECHELLE...
<
< PREPARATION DES OPTIMISATIONS :
<
         PLR         W               < RESTAURATION DE 'W' :
                                     < (W)=ADRESSE DE L'ENTREE DE 'HASHTY'
                                     <     ASSOCIEE AU COUPLE (U,V) COURANT.
         PSR         A,B             < MEMORISATION DE Y(U,V)...
         LAI         EXIST
         STA         HASHFR,W        < ON OCCUPE L'ENTREE SYSTEMATIQUEMENT...
         #/FLD#      VARU
         #/FST#      HASHU,W         < MEMORISATION DE 'U',
         #/FLD#      VARV
         #/FST#      HASHV,W         < MEMORISATION DE 'V',
         PLR         A,B
         #/FST#      HASHF,W         < ET MEMORISATION DE Y(U,V)...
<
< ET RETOUR :
<
         BSR         ATSFLO
SPYP5:   EQU         $
         PLR         X,Y,L,W
         RSR
<
<
<        C A L C U L   D E   Z ( U , V )  :
<
<
<        FONCTION :
<                      CE MODULE CALCULE LA FONCTION
<                    'Z' AU POINT (U,V) SUR LA SURFA-
<                    CE ARGUMENT, SUIVANT L'EQUATION :
<
<                    Z=MT31*X(U,V)+MT32*Y(U,V)+MT33*Z(U,V)+MT34.
<
<
SPZP:    EQU         $
<
< INITIALISATIONS :
<
         PSR         X,Y,L,W
         LRM         L,W
         WORD        FLOC+DEPBAS     < (L)=BASE DU LOCAL DE Z(U,V),
         WORD        HASHTZ          < (W)=BASE LA HASH-TABLE 'HASHTZ'...
<
< TENTATIVE D'OPTIMISATION :
<
         LA          VARU            < U(0),
         EOR         VARU+DFLOT-Z    < U(0)*U(1),
         EOR         VARV            < U(0)*U(1)*V(0),
         EOR         VARV+DFLOT-Z    < U(0)*U(1)*V(0)*V(1), CE QUI NOUS DONNE
                                     < UNE COMBINAISON DE 'U' ET DE 'V'...
         LR          A,B             < ET SAVE...
         SCRS        LNHASH
         EORR        B,A             < ON COMBINE U(0)*U(1)*V(0)*V(1) A LUI-
                                     < MEME DECALE DU LOGARITHME EN BASE 2 DE
                                     < LA LONGUEUR D'UNE ENTREE DES HASH-
                                     < TABLES...
         LR          A,B             < ET SAVE...
         SCRS        NBITMO/NOCMO
         EORR        B,A             < ET ON RECOMMENCE SUR LA MOITIE D'UN MOT..
                                     < CE QUI DONNE 'LNHASH' PAQUETS IDENTIQUES
                                     < DE 'LNHASH' BITS, QUI CORRESPONDENT EN
                                     < FAIT A UNE GENERALISATION DE LA NOTION
                                     < DE BIT DE PARITE...
         IF          LNHASH*LNHASH-NBITMO,,XEIF%,
         IF          ATTENTION : CE QUI PRECEDE EST IDIOT !!!
XEIF%:   VAL         ENDIF
         IF          NBITMO/NOCMO/LNHASH=K-W,,XEIF%,
         IF          ATTENTION : CE QUI PRECEDE EST INCOMPLET !!!
XEIF%:   VAL         ENDIF
         ANDI        BIT>LNHASH-N    < (A)=INDEX "ALEATOIRE" ASSOCIE AU COUPLE
                                     < (U,V) COURANT,
XWOR%1:  VAL         LEHASH=K
         IF          BIT>XWOR%1-LEHASH,,XEIF%,
         IF          ATTENTION : 'LEHASH' N'EST PAS UNE PUISSANCE DE 2 !!!
XEIF%:   VAL         ENDIF
         SLLS        XWOR%1          < (A)=INDEX-MOT D'ACCES AUX HASH-TABLES
                                     <     ASSOCIE AU COUPLE (U,V) COURANT.
         ADR         A,W             < (W)=ADRESSE DE L'ENTREE DE 'HASHTZ'
                                     <     ASSOCIEE AU COUPLE (U,V) COURANT...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         HASHFR,W        < L'ENTREE EST-ELLE INOCCUPEE ???
         JE          SPZP4           < OUI, INUTILE DE TESTER (U,V)...
         #/FLD#      VARU            < NON, ELLE EST OCCUPEE :
         FCAM        HASHU,W         < EST-ON EN PRESENCE DU 'U' COURANT ???
         JNE         SPZP4           < NON, PAS D'OPTIMISATION...
         #/FLD#      VARV            < OUI :
         FCAM        HASHV,W         < EST-ON EN PRESENCE DU 'V' COURANT ???
         JNE         SPZP4           < NON, PAS D'OPTIMISATION...
<
< CAS D'UNE RECHERCHE POSITIVE :
<
         #/FLD#      HASHF,W         < (A,B)=VALEUR DE Z(U,V)...
         JMP         SPZP5           < ET VERS LA SORTIE IMMEDIATE...
<
< CAS D'UNE RECHERCHE NEGATIVE :
<
SPZP4:   EQU         $
         PSR         W               < ON MEMORISE L'ADRESSE DE L'ENTREE EN
                                     < HASH-TABLE...
<
< CALCUL DE Z(U,V) :
<
         LXI         MT31
         #/FLD#      F0              < 'MT31' NUL A PRIORI...
         FCMZ        &AMTRAN         < QU'EN EST-IL REELLEMENT ???
         JE          SPZ1            < OUI, (A,B)=0,
         BSR         ASPX            < NON, (A,B)=X(U,V),
         LXI         MT31
         FMP         &AMTRAN         < (A,B)=MT31*X(U,V),
SPZ1:    EQU         $
         PSR         A,B             < ET SAUVEGARDE DE MT31*X(U,V)...
         LXI         MT32
         #/FLD#      F0              < 'MT32' NUL A PRIORI...
         FCMZ        &AMTRAN         < QU'EN EST-IL REELLEMENT ???
         JE          SPZ2            < OUI, (A,B)=0,
         BSR         ASPY            < NON, (A,B)=Y(U,V),
         LXI         MT32
         FMP         &AMTRAN         < (A,B)=MT32*Y(U,V),
SPZ2:    EQU         $
         PSR         A,B             < ET SAUVEGARDE DE MT32*Y(U,V)...
         LXI         MT33
         #/FLD#      F0              < 'MT33' NUL A PRIORI...
         FCMZ        &AMTRAN         < QU'EN EST-IL REELLEMENT ???
         JE          SPZ3            < OUI, (A,B)=0,
         BSR         ASPZ            < NON, (A,B)=Z(U,V),
         LXI         MT33
         FMP         &AMTRAN         < (A,B)=MT33*Z(U,V),
SPZ3:    EQU         $
         BSR         ASFWOR          < ET SAUVEGARDE DE MT33*Z(U,V)...
         PLR         A,B
         BSR         APFWOR          < MT32*Y(U,V)+MT33*Z(U,V),
         PLR         A,B
         BSR         APFWOR          < MT31*X(U,V)+MT32*Y(U,V)+MT33*Z(U,V),
         LXI         MT34
         FAD         &AMTRAN         < MT31*X(U,V)+MT32*Y(U,V)*MT33*Z(U,V)+MT34,
         FMP         FK              < ET MISE A L'ECHELLE...
<
< PREPARATION DES OPTIMISATIONS :
<
         PLR         W               < RESTAURATION DE 'W' :
                                     < (W)=ADRESSE DE L'ENTREE DE 'HASTHZ'
                                     <     ASSOCIEE AU COUPLE (U,V) COURANT.
         PSR         A,B             < MEMORISATION DE Z(U,V)...
         LAI         EXIST
         STA         HASHFR,W        < ON OCCUPE L'ENTREE SYSTEMATIQUEMENT...
         #/FLD#      VARU
         #/FST#      HASHU,W         < MEMORISATION DE 'U',
         #/FLD#      VARV
         #/FST#      HASHV,W         < MEMORISATION DE 'V',
         PLR         A,B
         #/FST#      HASHF,W         < ET MEMORISATION DE Z(U,V)...
<
< ET RETOUR :
<
         BSR         ATSFLO
SPZP5:   EQU         $
         PLR         X,Y,L,W
         RSR
         PAGE
<
<
<        D E R I V A T I O N   N U M E R I Q U E   D U   P R E M I E R
<        O R D R E   P A R   R A P P O R T   A   ' U '   O U   ' V '  :
<
<
<        FONCTION :
<                      CE MODULE CALCULE LA DERIVEE
<                    PARTIELLE DU PREMIER ORDRE DE
<                    LA FONCTION 'F' PAR RAPPORT A
<                    LA VARIABLE 'X' SUIVANT LA
<                    FORMULE :
<
<                                    DF(X)/DX=(F(X+DX)-(F(X-DX))/(2*DX).
<
<                      PAR LA SUITE LA VARIABLE 'X'
<                    SERA NOTEE 'ALPHA', ET 'DX', 'H'...
<
<
<        ARGUMENTS :
<                    (A)=ADRESSE DU PAS DE DERIVATION 'FHU/V',
<                    (Y)=NUMERO DE LA FONCTION QUE L'ON DESIRE DERIVER
<                        (XSPX, XSPY OU XSPZ),
<                    (X)=NUMERO DE LA VARIABLE PAR RAPPORT A LAQUELLE
<                        ON DERIVE (XVARU OU XVARV).
<
<
<        RESULTAT :
<                    (A,B)=VALEUR DE LA DERIVEE AU POINT CONSIDERE.
<
<
DERIP:   EQU         $
<
< INITIALISATIONS ET CALCUL DU
< PAS DE DERIVATION :
<
FH::     MOT         O               < ACCES A 'FHU/V'...
         PSR         W
         LR          A,W             < (W)=ADRESSE DU PAS DE DERIVATION 'FH',
         #/FLD#      FH,W
         FDV         F05
         #/FST#      F2H             < ET CALCUL DE F2H=2*FH...
<
< VALIDATION DE LA FONCTION :
<
         LR          Y,A             < VALIDATION DE LA FONCTION :
         JAL         DERIP1          < ERREUR...
         CPI         XSPZ
         JLE         DERIP2          < OK...
DERIP1:  EQU         $
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
DERIP2:  EQU         $
         LR          X,A             < VALIDATION DE LA VARIABLE DE DERIVATION :
         TBT         NBITMO-B
         JC          DERIP3
         JAL         DERIP3
         CPI         XLASTX
         JLE         DERIP4
DERIP3:  EQU         $
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
DERIP4:  EQU         $
<
< CALCUL DE LA DERIVEE :
<
         FLD         &AVAR           < VARIABLE ALPHA,
         PSR         A,B             < SAUVEGARDE DE ALPHA...
         FAD         FH,W            < 'FHU/V'...
         FST         &AVAR           < ALPHA+H,
         XR          X,Y
         BSR         &ASPXYZ         < F(ALPHA+H),
         XR          X,Y
         PSR         A,B             < ET SAVE...
         FLD         &AVAR
         FSB         F2H
         FST         &AVAR           < ALPHA-H,
         XR          X,Y
         BSR         &ASPXYZ         < F(ALPHA-H),
         XR          X,Y
         BSR         ASFWOR          < ET SAVE...
         PLR         A,B             < F(ALPHA+H),
         FSB         FWORK           < F(ALPHA+H)-F(ALPHA-H),
         FDV         F2H             < (F(ALPHA+H)-F(ALPHA-H))/(2*H),
         BSR         ASFWOR          < DERIVEE=(F(ALPHA+H)-F(ALPHA-H))/(2*H).
         PLR         A,B             < RESTAURE ALPHA...
         FST         &AVAR
<
< ET RETOUR :
<
         BSR         ATSFLO
         #/FLD#      FWORK           < (A,B)=VALEUR DE LA DERIVEE.
         PLR         W
         RSR
         PAGE
<
<
<        D E R I V A T I O N   N U M E R I Q U E  D U   S E C O N D
<        O R D R E   P A R   R A P P O R T   A   ' U '   O U   ' V '  :
<
<
<        FONCTION :
<                      CE MODULE CALCULE LA DERIVEE
<                    PARTIELLE DU SECOND ODRE DE
<                    LA FONCTION 'F' PAR RAPPORT A
<                    LA VARIABLE 'X' SUIVANT LA
<                    FORMULE :
<
<                                    D2F(X)/DX2=(F(X-DX)+F(X+DX)-2*F(X))/(DX**2)
<
<                    SOIT POUR UNE FONCTION 'F' DE
<                    2 VARIABLES 'U' ET 'V' :
<
<                    D2F(U0,V0)/DU2=(F(U0-DU,V0)+F(U0+DU,V0)-2*F(U0,V0))/(DU**2)
<                    D2F(U0,V0)/DV2=(F(U0,V0-DV)+F(U0,V0+DV)-2*F(U0,V0))/(DV**2)
<
<
<        ARGUMENTS :
<                    (A)=ADRESSE DU PAS DE DERIVATION 'FHU/V',
<                    (Y)=NUMERO DE LA FONCTION QUE L'ON DESIRE DERIVER
<                        (XSPX, XSPY OU XSPZ),
<                    (X)=NUMERO DE LA VARIABLE PAR RAPPORT A LAQUELLE
<                        ON DERIVE (XVARU OU XVARV).
<
<
<        RESULTAT :
<                    (A,B)=VALEUR DE LA DERIVEE AU POINT CONSIDERE.
<
<
DERIS:   EQU         $
<
< INITIALISATIONS :
<
         PSR         W
         LR          A,W             < (W)=ADRESSE DU PAS DE DERIVATION 'FH',
<
< VALIDATION DE LA FONCTION :
<
         LR          Y,A             < VALIDATION DE LA FONCTION :
         JAL         DERIS1          < ERREUR...
         CPI         XSPZ
         JLE         DERIS2          < OK...
DERIS1:  EQU         $
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
DERIS2:  EQU         $
         LR          X,A             < VALIDATION DE LA VARIABLE DE DERIVATION :
         TBT         NBITMO-B
         JC          DERIS3
         JAL         DERIS3
         CPI         XLASTX
         JLE         DERIS4
DERIS3:  EQU         $
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
DERIS4:  EQU         $
<
< CALCUL DE LA DERIVEE :
<
         FLD         &AVAR           < VARIABLE ALPHA,
         PSR         A,B             < SAUVEGARDE DE ALPHA...
         FSB         FH,W
         FST         &AVAR           < ALPHA-H,
         XR          X,Y
         BSR         &ASPXYZ         < F(ALPHA-H),
         XR          X,Y
         PSR         A,B             < ET SAVE...
         FLD         &AVAR
         FAD         FH,W
         FAD         FH,W
         FST         &AVAR           < ALPHA+H,
         XR          X,Y
         BSR         &ASPXYZ         < F(ALPHA+H),
         XR          X,Y
         PSR         A,B             < ET SAVE...
         FLD         &AVAR
         FSB         FH,W
         FST         &AVAR           < ALPHA,
         XR          X,Y
         BSR         &ASPXYZ         < F(ALPHA),
         XR          X,Y
         FDV         F05             < 2*F(ALPHA),
         BSR         AFNEG           < -2*F(ALPHA),
         BSR         ASFWOR          < ET SAVE...
         PLR         A,B             < F(ALPHA+H),
         BSR         APFWOR          < F(ALPHA+H)-2*F(ALPHA),
         PLR         A,B             < F(ALPHA-H),
         BSR         APFWOR          < F(ALPHA-H)+F(ALPHA+H)-2*F(ALPHA),
         FDV         FH,W            < ET DIVISION
         FDV         FH,W            <             PAR H**2,
         BSR         ASFWOR          < CE QUI DONNE LA DERIVEE :
                                     < (F(ALPHA-H)+F(ALPHA+H)-2*F(ALPHA)/(H**2).
         PLR         A,B             < RESTAURE ALPHA (CECI EST EN FAIT PEUT-
         FST         &AVAR           < INUTILE, MAIS AVEC LE CALCUL FLOTTANT
                                     < ON NE SAIT JAMAIS...).
<
< ET RETOUR :
<
         BSR         ATSFLO
         #/FLD#      FWORK           < (A,B)=VALEUR DE LA DERIVEE.
         PLR         W
         RSR
         PAGE
<
<
<        D E R I V A T I O N   N U M E R I Q U E  D U   S E C O N D
<        O R D R E   P A R   R A P P O R T   A   ' U '   E T   ' V '  :
<
<
<        FONCTION :
<                      CE MODULE CALCULE LA DERIVEE
<                    PARTIELLE DU SECOND ODRE DE
<                    LA FONCTION 'F' PAR RAPPORT AUX
<                    VARIABLES 'U' ET 'V' SUIVANT LA
<                    FORMULE :
<
<                    D2F(U0,V0)/DVDV=(F(U0+DU,V0+DV)+F(U0-DU,V0-DV)-
<                                     F(U0-DU,V0+DV)-F(U0+DU,V0-DV))/(4*DU*DV).
<
<
<        ARGUMENT :
<                    (X)=NUMERO DE LA FONCTION QUE L'ON DESIRE DERIVER
<                        (XSPX, XSPY OU XSPZ),
<
<
<        RESULTAT :
<                    (A,B)=VALEUR DE LA DERIVEE AU POINT CONSIDERE.
<
<
DERIX:   EQU         $
<
< VALIDATION DE LA FONCTION :
<
         LR          X,A             < VALIDATION DE LA FONCTION :
         JAL         DERIX1          < ERREUR...
         CPI         XSPZ
         JLE         DERIX2          < OK...
DERIX1:  EQU         $
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
DERIX2:  EQU         $
<
< CALCUL DE LA DERIVEE :
<
         #/FLD#      VARU
         PSR         A,B             < SAUVEGARDE DE 'U',
         #/FLD#      VARV
         PSR         A,B             < ET DE 'V'...
         #/FLD#      VARU            < U0,
         FAD         FHU             < U0+DU,
         #/FST#      VARU            < ET SAVE...
         #/FLD#      VARV            < V0,
         FAD         FHV             < V0+DV,
         #/FST#      VARV            < ET SAVE...
         BSR         &ASPXYZ         < F(U0+DU,V0+DV),
         PSR         A,B             < ET SAVE...
         #/FLD#      VARU            < U0+DU,
         FSB         FHU             < U0,
         FSB         FHU             < U0-DU,
         #/FST#      VARU            < ET SAVE...
         #/FLD#      VARV            < V0+DV,
         FSB         FHV             < V0,
         FSB         FHV             < V0-DV,
         #/FST#      VARV            < ET SAVE...
         BSR         &ASPXYZ         < F(U0-DU,V0-DV),
         PSR         A,B             < ET SAVE...
         #/FLD#      VARV            < V0-DV,
         FAD         FHV             < V0,
         FAD         FHV             < V0+DV,
         #/FST#      VARV            < ET SAVE...
         BSR         &ASPXYZ         < F(U0-DU,V0+DV),
         BSR         AFNEG           < -F(U0-DU,V0+DV),
         PSR         A,B             < ET SAVE...
         #/FLD#      VARU            < U0-DU,
         FAD         FHU             < U0,
         FAD         FHU             < U0+DU,
         #/FST#      VARU            < ET SAVE...
         #/FLD#      VARV            < V0+DV,
         FSB         FHV             < V0,
         FSB         FHV             < V0-DV,
         #/FST#      VARV            < ET SAVE...
         BSR         &ASPXYZ         < F(U0+DU,V0-DV),
         BSR         AFNEG           < -F(U0+DU,V0+DV),
         BSR         ASFWOR          < ET SAVE...
         PLR         A,B             < -F(U0-DU,V0+DV),
         BSR         APFWOR          < -F(U0-DU,V0+DV)-F(U0+DU,V0-DV),
         PLR         A,B             < F(U0-DU,V0-DV),
         BSR         APFWOR          < F(U0-DU,V0-DV)-F(U0-DU,V0+DV)-
                                     < F(U0+DU,V0-DV),
         PLR         A,B             < F(U0+DU,V0+DV),
         BSR         APFWOR          < F(U0+DU,V0+DV)+F(U0-DU,V0-DV)-
                                     < F(U0-DU,V0+DV)-F(U0+DU,V0-DV),
         FDV         FHU             < /DU,
         FDV         FHV             < /(DU*DV),
         FMP         F05             < /(2*DU*DV),
         FMP         F05             < /(4*DU*DV),
         BSR         ASFWOR          < ET SAVE...
         PLR         A,B
         #/FST#      VARV            < RESTAURATION DE 'V',
         PLR         A,B
         #/FST#      VARU            < ET DE 'U'...
<
< ET RETOUR :
<
         BSR         ATSFLO
         #/FLD#      FWORK           < (A,B)=VALEUR DE LA DERIVEE.
         RSR
         PAGE
<
<
<        P A R C O U R S   D U   C A T A L O G U E   C O U R A N T  :
<
<
<        FONCTION :
<                      CE MODULE EXPLORE EXHAUSTI-
<                    VEMENT LE CATALOGUE COURANT,
<                    ET POUR CHAQUE NOM RECUPERE
<                    EFFECTUE LE TRAITEMENT ARGUMENT.
<
<
<        ARGUMENTS :
<                    (A)=ADRESSE OCTET DU NOM A GENERE,
<                    (B)=ADRESSE DU SOUS-PROGRAMME SPECI-
<                        FIQUE A APPELER POUR CHAQUE NOM,
<                    (Y)=NOMBRE D'OCTETS ATTENDUS POUR LA VALEUR.
<
<
CATAL:   EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X
         STA         DEMSGN+AMESC    < MISE EN PLACE DE L'ADRESSE OCTET DU
                                     < NOM COURANT.
         SLRS        NOCMO=K         < CETTE ADRESSE EST CONVERTIE EN UNE
                                     < ADRESSE MOT,
         JNC         CATA20          < OK...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E...
CATA20:  EQU         $
         SBT         BITX            < QUE L'ON INDEXE,
         STA         ANOM            < CE QUI DONNE UN RELAI INDEXE VERS
                                     < LE NOM COURANT...
         STB         APVAR           < ET ON GENERE UN RELAI VERS LE SOUS-
                                     < PROGRAMME SPECIFIQUE A APPELER POUR
                                     < CHAQUE NOM RECUPERE...
<
< INITIALISATION DU PARCOURS
< DU CATALOGUE COURANT :
<
         LXI         LRMAIL          < (X)=LONGUEUR DE LA RACINE,
         STX         XRAC            < (XRAC)=LONGUEUR DE LA RACINE,
         ADRI        -I,X
<
<        B O U C L E   D E   R E C U P E R A T I O N  :
<
CATA00:  EQU         $
         LAI         COSBT?XASSIM=FMASK(K?NVPNXS=FCINST
         BSR         AGOSGN          < DEMANDE DE NEXT-SERIE.
         CPI         ENSX            < TEST DU CODE D'ERREUR.
         JE          CATA03          < IL N'Y A PAS DE NEXT SERIE...
         JAE         CATA01          < OK, LE NEXT-SERIE EXISTE.
         LR          X,A
         CP          XRAC            < EST-ON DE RETOUR SUR LA RACINE ???
         JL          CATA06          < OUI, ON ARRETE LE PARCOURS DU CATALOGUE
         ADRI        -I,X            < DANS LES AUTRES CAS D'ERREURS,
                                     < ON FAIT UN RETOUR ARRIERE, CAR
                                     < EN EFFET ON NE DOIT PLUS SAVOIR
                                     < OU L'ON EN EST SUITE A UN
                                     < DELETE SIMULTANE...
         JMP         CATA00          < N'ETANT PAS DE RETOUR SUR
                                     < LA RACINE, ON CONTINUE.
<
< CAS OU IL Y A UN NEXT-SERIE :
<
CATA01:  EQU         $
         ADRI        I,X
         LBY         &ANOM           < RECUPERATION DE CE NEXT-SERIE.
         CPI         KEOT            < EST-CE UNE FIN DE NOM ???
         JNE         CATA00          < NON, ON CONTINUE A RECUPERER.
<
< ACCES A LA VALEUR COURANTE :
<
         LAI         COSBT?XASSIM=FMASK(K?NVPLON=FCINST
         BSR         AGOSGN          < CHARGEMENT DE LA VALEUR...
         ACTD        XXXSIZ          < ACCES A LA TAILLE DE LA VALEUR CHARGEE :
                                     < (B)=NOMBRE D'OCTETS OCCUPES :
         CPR         B,Y             < EST-CE BIEN CE QUE L'ON ATTEND ???
         JNE         CATA02          < NON, ON L'IGNORE...
<
< TRAITEMENT DU NOM COURANT :
<
         BSR         APVAR           < ET APPEL DU SOUS-PROGRAMME
                                     < SPECIFIQUE...
<
< RECHERCHE DU NEXT-PARALLELE :
<
CATA02:  EQU         $
CATA03:  EQU         CATA02          < ENTRY DE PREMIERE RECHERCHE DE NEXT-
                                     < SERIE (CF. RACINE D'UN CATALOGUE)
         LAI         COSBT?XASSIM=FMASK(K?NVPNXP=FCINST
         BSR         AGOSGN          < RECHERCHE NEXT-PARALLELE.
         CPI         ENSX            < TEST DU CODE D'ERREUR.
         JE          CATA05          < CAS DU NEXT-PARALLELE QUI
                                     < N'EXISTE PAS...
         JANE        CATA00          < AUTRES CAS DU SUREMENT A UN
                                     < DELETE SIMULTANE QUI DESORIENTE!!!
<
< CAS OU IL Y A UN NEXT-PARALLELE :
<
CATA04:  EQU         $
         ADRI        I,X
         LBY         &ANOM           < RECUPERATION DE CELUI-CI.
         ADRI        -I,X
         STBY        &ANOM           < ET ON LE MET A SA BONNE PLACE.
         JMP         CATA00          < ET RETOUR A LA BOUCLE DE
                                     < RECUPERATION.
<
< CAS OU IL N'Y A PAS DE NEXT-PARALLELE :
<
CATA05:  EQU         $
         ADRI        -I,X            < RETOUR ARRIERE DANS LE NOM.
         LR          X,A             < POUR VALIDATION.
         CP          XRAC            < EST-ON DE RETOUR SUR LA RACINE ???
         JGE         CATA02          < NON, ON CONTINUE...
<
< FIN DE PARCOURS,
< ET RETOUR :
<
CATA06:  EQU         $
         PLR         A,B,X
         RSR
         PAGE
<
<
<        T R A I T E M E N T   D ' U N   N O E U D   C O U R A N T
<                    D U   M A I L L A G E  :
<
<
<        FONCTION :
<                      CE MODULE PREND LE NOEUD
<                    COURANT RECUPERE DANS LE CA-
<                    TALOGUE "X*", ET L'INSERE
<                    DANS LA MEMOIRE DE LA LIGNE
<                    COURANTE.
<
<
GMAIL:   EQU         $
<
< INITIALISATIONS :
<
         PSR         A,B,X,Y
<
< RECUPERATION DE L'IDENTITE
< DU NOEUD COURANT :
<
         LAD         NMAIL1
         LXI         K               < (X)=INDEX DE DECODAGE,
         BSR         AHEXIN          < CONVERSION BINAIRE DU NOEUD COURANT,
                                     < TELLE QUE :
                                     < (A)=(YR,XR) DU NOEUD...
<
<        P A S S A G E   D E S   C O O R D O N N E S   G E O M E T R I Q U E S
<        A U X   C O O R D O N N E E S   T O P O L O G I Q U E S  :
<
         SLRD        NBITMO/NOCMO
         STA         YR              < 'YR' DU NOEUD COURANT,
         LAI         K
         SLLD        NBITMO/NOCMO
         STA         XR              < 'XR' DU NOEUD COURANT.
         LA          YR
         CP          YRP             < 'YR' A-T'IL CHANGE PAR RAPPORT A CELUI
                                     < DU NOEUD PRECEDENT ???
         JNE         GMAIL0          < OUI...
<
< CAS D'UN 'YR' INCHANGE :
<
         LA          XR
         CP          XRP             < 'XR' A-T'IL CHANGE PAR RAPPORT A CELUI
                                     < DU NOEUD PRECEDENT ???
         JNE         GMAIL1          < OUI...
         QUIT        XXQUIT          < NON, CELA VIENT SUREMENT DU MODE DE
                                     < GENERATION DU MAILLAGE : DES POINTS
                                     < DOIVENT ETRE DUPLIQUES...
         JMP         GMAIL9          < ET ON SAUTE L'INSERTION...
<
< CAS D'UN 'XR' CHANGE :
<
GMAIL1:  EQU         $
         STA         XRP             < MEMORISATION DU NOUVEAU 'XRP'...
         IC          NUMJ            < CHANGEMENT DE COLONNE...
         JMP         GMAIL2          < VERS L'INSERTION...
<
< CAS D'UN 'YR' CHANGE :
<
GMAIL0:  EQU         $
         STA         YRP             < MEMORISATION DU NOUVEAU 'YRP'...
         LA          AMOCDN
         STA         XRP             < ET DU NOUVEAU 'XRP' (INEXISTANT)...
         LA          NUMJ
         JAE         GMAIL5          < CAS DE L'INITIALISATION...
         CPI         W               < Y-A-T'IL PLUS D'UN POINT DANS LA LIGNE
                                     < PRECEDENTE ???
         JG          GMAIL3          < OUI, OK...
         QUIT        XXQUIT          < NON, ON NE PEUT RIEN FAIRE...
GMAIL3:  EQU         $
         TBT         NBITMO-B        < TEST DE LA PARITE DE 'J' :
         JC          GMAIL5          < 'J' EST IMPAIR, IL Y A DONC UN NOMBRE
                                     < PAIR DE POINTS SUR LA LIGNE, OK...
         QUIT        XXQUIT          < E R R E U R  : LE NOMBRE DE POINTS SUR
                                     < LA LIGNE COURANTE EST IMPAIR ; ON NE
                                     < POURRA DONC PAS ALLER DE 2 EN 2...
                                     < (ET CE EN MODE J-TORE)
GMAIL5:  EQU         $
         STZ         NUMJ            < (NUMJ)=PREMIERE COLONNE...
         IC          NUMI            < CHANGEMENT DE LIGNE...
         LA          NUMI
         CPI         IMAX            < VALIDATION DE 'I' :
         JL          GMAIL4          < OK...
         QUIT        XXQUIT          < D E B O R D E M E N T...
GMAIL4:  EQU         $
         LR          A,X             < (X)=(NUMI)=NUMERO DE LA NOUVELLE LIGNE,
         LA          XBUF            < (A)=INDEX D'INSERTION DE SON PREMIER
                                     <     POINT,
         STA         &APLIGX         < QUE L'ON MEMORISE DANS LA LISTE DES
                                     < LIGNES...
<
< TRANSFORMATION MATRICIELLE
< DES NOEUDS DU MAILLAGE :
<
GMAIL2:  EQU         $
         LXI         MT11
         LAD         &AMTRAN
         LR          A,B             < (B)=ADRESSE DU VECTEUR LIGNE 'MT1',
         LAD         CS3D            < (A)=ADRESSE DU VECTEUR (FXS,FYS,FZS),
         BSR         APRSCA          < ET CALCUL DE LEUR PRODUIT SCALAIRE,
                                     < MT11*XS+MT12*YS+MT13*ZS,
         LXI         MT14
         FAD         &AMTRAN         < ET TRANSLATION :
                                     < MT11*XS+MT12*YS+MT13*ZS+MT14,
         FMP         FK              < PUIS MISE A L'ECHELLE,
         PSR         A,B             < ET SAUVEGARDE DU FUTUR 'FXS'...
         LXI         MT21
         LAD         &AMTRAN
         LR          A,B             < (B)=ADRESSE DU VECTEUR LIGNE 'MT2',
         LAD         CS3D            < (A)=ADRESSE DU VECTEUR (FXS,FYS,FZS),
         BSR         APRSCA          < ET CALCUL DE LEUR PRODUIT SCALAIRE,
                                     < MT21*XS+MT22*YS+MT23*ZS,
         LXI         MT24
         FAD         &AMTRAN         < ET TRANSLATION :
                                     < MT21*XS+MT22*YS+MT23*ZS+MT24,
         FMP         FK              < PUIS MISE A L'ECHELLE,
         PSR         A,B             < ET SAUVEGARDE DU FUTUR 'FYS'...
         LXI         MT31
         LAD         &AMTRAN
         LR          A,B             < (B)=ADRESSE DU VECTEUR LIGNE 'MT3',
         LAD         CS3D            < (A)=ADRESSE DU VECTEUR (FXS,FYS,FZS),
         BSR         APRSCA          < ET CALCUL DE LEUR PRODUIT SCALAIRE,
                                     < MT31*XS+MT32*YS+MT33*ZS,
         LXI         MT34
         FAD         &AMTRAN         < ET TRANSLATION :
                                     < MT31*XS+MT32*YS+MT33*ZS+MT34,
         FMP         FK              < PUIS MISE A L'ECHELLE,
         #/FST#      FZS             < ET VOILA LE NOUVEAU 'FZS' :'...
                                     < ZS=K*(MT31*XS+MT32*YS+MT33*ZS+MT34),
         PLR         A,B
         #/FST#      FYS             < ET VOILA LE NOUVEAU 'FYS' :'...
                                     < YS=K*(MT21*XS+MT22*YS+MT23*ZS+MT24),
         PLR         A,B
         #/FST#      FXS             < ET VOILA LE NOUVEAU 'FXS' :'...
                                     < XS=K*(MT11*XS+MT12*YS+MT13*ZS+MT14),
<
< INSERTION DANS LA LISTE
< DES NOEUDS DU MAILLAGE :
<
         LA          NUMI
         SWBR        A,A
         OR          NUMJ            < (A)=(I,J),
         STA         IDENT           < MEMORISATION DE (I,J)...
         LX          NUMI            < (X)=(NUMI)=NUMERO DE LA LIGNE COURANTE,
         LA          NUMJ            < (A)=NUMERO DU POINT COURANT,
         STA         &APLIGM         < ON MEMORISE AINSI EN PERMANENCE LE
                                     < POINT COURANT, ET DONC FINALEMENT LE
                                     < 'J' MAXIMAL DE CHAQUE LIGNE 'I'...
         LX          XBUF
         LR          X,A             < ET VALIDATION :
         CP          XBUFMX
         JL          GMAIL6          < OK...
         QUIT        XXQUIT          < E R R E U R  : DEBORDEMENT DE 'BUF' !!!
GMAIL6:  EQU         $
         LR          X,B             < (B)=ADRESSE DU RECEPTEUR (LISTE),
         ADRI        LBUF4D,X
         STX         XBUF            < MISE A JOUR DE L'INDEX...
         LAD         CS3D            < (A)=ADRESSE DE L'EMETTEUR (POINT 3D),
         XR          A,B             < (A)=ADRESSE DU RECEPTEUR,
                                     < (B)=ADRESSE DE L'EMETTEUR,
         LXI         LBUF4D          < (X)=NOMBRE DE MOTS A DEPLACER,
         WCDA
                                     < ET DEPLACEMENT DU POINT 3D COURANT.
<
< ET RETOUR :
<
GMAIL9:  EQU         $
         PLR         A,B,X,Y
         RSR
         PAGE
<
<
<        T R A I T E M E N T   D E   L A   F A C E T T E   C O U R A N T E  :
<
<
GFACET:  EQU         $
<
< INITIALISATION :
<
         PSR         A,B,X
<
< MEMORISATION DE LA FACETTE COURANTE :
<
         LX          XBUF            < (X)=INDEX D'INSERTION COURANT,
         LR          X,A
         ADRI        LFAC,A          < AFIN D'AVOIR UNE MARGE DE MANOEUVRE...
         CP          XBUFMX          < A-T'ON ASSEZ DE PLACE ???
         JL          GFACE2          < OUI, ALLONS INSERER LA FACETTE COURANTE..
         QUIT        XXQUIT          < P L U S   D E   P L A C E ...
         JMP         GFACE1          < NON, ON IGNORE CETTE FACETTE, APRES
                                     < L'AVOIR SIGNALE PAR LE 'CCI'...
GFACE2:  EQU         $
         LR          X,A             < (A)=ADRESSE DE RANGEMENT,
         ADRI        LFAC,X
         STX         XBUF            < ET PROGRESSION DE 'XBUF'...
         LRM         B,X
         WORD        FAC             < (B)=ADRESSE DE LA FACETTE COURANTE,
         WORD        LFAC            < (X)=NOMBRE DE MOTS A DEPLACER...
         WCDA
                                     < ET INSERTION DE LA FACETTE COURANTE DANS
                                     < LA LISTE DES FACETTES...
GFACE1:  EQU         $
<
< ET RETOUR :
<
         PLR         A,B,X
         RSR
         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', QUE LE BLOC
         WORD        LOC+DEPBAS      < 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'...
         PAGE
<
<
<        G E N E R A T I O N   D E S   F A C E T T E S   P A R
<        R E C U P E R A T I O N   E T   T R A I T E M E N T
<                    D U   C A T A L O G U E   " X * "  :
<
<
DEBUT1:  EQU         $
<
< INITIALISATION DES DIFFERENTS
< INDICATEURS ET INDEXES :
<
         STZ         XBUF            < INITIALISATION DU BUFFER DE STOCKAGE
                                     < DES ENSEMBLES (FXS,FYS,FZS,IDENT).
         STZ         NUMI            < (NUMI)=NUMERO DE LA PREMIERE LIGNE,
         DC          NUMI            < (A CAUSE D'UN 'IC' INITIAL...)
         STZ         NUMJ            < (NUMJ)=NUMERO DE LA PREMIERE COLONNE.
         LA          AMOCDN
         STA         XRP             < ON INDIQUE AINSI QU'IL N'Y A PAS
         STA         YRP             < ENCORE DE (YR,XR) ANTERIEUR...
         IF          XOPT01-EXIST,XOPT1,,XOPT1
XWOR%1:  VAL         SIZXVI/XC512    < X-FACTEUR DE PASSAGE '512' --> 'VISU',
XWOR%2:  VAL         SIZYVI/XL512    < Y-FACTEUR DE PASSAGE '512' --> 'VISU'.
         IF          XWOR%1-XWOR%2,,XEIF%,
         IF          ATTENTION : LE CALCUL DE 'FACT' EST IDIOT !!!
XEIF%:   VAL         ENDIF
         LRM         A,B
         WORD        XMIN*XWOR%1
         WORD        YMIN*XWOR%2
         STA         TRX             < TRANSLATION DU
         STB         TRY             <                TRACE GRAPHIQUE.
         LRM         A,B
         FLOAT       <XWOR%1?XWOR%2<K<K
         #/FST#      FACT            < FACTEUR D'ECHELLE POUR LE TRACE DES
                                     < FACETTES...
XOPT1:   VAL         ENDIF
<
<
<        R E C U P E R A T I O N   D U   C A T A L O G U E   " X * "  :
<
<
         LRM         A,B,Y
         WORD        NMAIL=FCTA*NOCMO
                                     < (A)=ADRESSE OCTET DU NOM DU CATALOGUE,
         WORD        GMAIL           < (B)=ADRESSE DU SOUS-PROGRAMME DE TRAI-
                                     <     TEMENT DES NOEUDS DU MAILLAGE,
         WORD        LVMAIL          < (Y)=NOMBRE D'OCTETS ATTENDUS POUR UN
                                     <     NOEUD.
         BSR         ACATAL          < RECUPERATION ET TRAITEMENT DU SOUS-
                                     < CATALOGUE "X*" DES NOEUDS DU MAILLAGE.
<
<
<        G E N E R A T I O N   D E S   F A C E T T E S
<                    T R I A N G U L A I R E S  :
<
<
DEBUT2:  EQU         $
<
< INITIALISATION DE LA GENE-
< RATION DES FACETTES :
<
         STZ         FIDENT          < INITIALISATION DE L'IDENTIFICATEUR DE
         DC          FIDENT          < LA FACETTE PRECEDENTE...
         LA          NUMI
         TBT         NBITMO-B        < TEST DE LA PARITE DE 'I' :
         JNC         E120            < 'I' EST PAIR, IL Y A DONC UN NOMBRE
                                     < IMPAIR DE LIGNES, OK...
         QUIT        XXQUIT          < E R R E U R  : IL Y A UN NOMBRE PAIR DE
                                     < LIGNES, ON NE PEUT DONC PAS ALLER DE
                                     < 2 EN 2 EN MODE NON-I-TORE...
E120:    EQU         $
         PSR         W
<
< BOUCLE DE PARCOURS DES LIGNES :
<
         SLRS        PASI=K
         CPZ         ITORE           < EST-ON SUR UN "I-TORE" ???
         JE          E123            < NON, (A) EST OK...
         ADRI        W,A             < OUI : IL FAUT RAJOUTER UNE LIGNE...
         TBT         NBITMO-B        < QUELLE EST LA PARITE DU NOMBRE DE
                                     < LIGNES ???
         JNC         E125            < PAIRE, OK... EN EFFET IL NE FAUT PAS
                                     < OUBLIER QU'ON IMPLANTE LES TRIANGLES
                                     < EN QUINCONCE D'UNE LIGNE A L'AUTRE,
                                     < LE NOMBRE DE LIGNES DOIT ETRE ALORS UN
                                     < MULTIPLE DE 2 !!!
         QUIT        XXQUIT          < E R R E U R (CF. CI-DESSUS)...
E125:    EQU         $
E123:    EQU         $
         LR          A,X             < (X)=NOMBRE DE LIGNES A TRAITER...
         LYI         I0              < (Y)=INDEX 'I' DES LIGNES.
E121:    EQU         $
         STY         SNUMI           < SAUVEGARDE DE LA LIGNE 'I' COURANTE.
         STZ         FIDENT          < CLEAR DU 'J' DES FACETTES SUR LA LIGNE
                                     < COURANTE...
         PSR         X,Y             < SAUVEGARDE DE 'I' ET DU NOMBRE DE LIGNES.
         LR          Y,X             < (X)=NUMERO DE LA LIGNE COURANTE,
<
< BOUCLE DE PARCOURS DES NOEUDS
< DE LA LIGNE 'I' COURANTE :
<
         LY          &APLIGX         < (Y)=XBUF(I,0), SOIT L'INDEX DANS 'BUF'
                                     <     DU PREMIER NOEUD DE LA LIGNE 'I'.
         STY         XBUFI0          < (XBUFI0)=XBUF(I,0)=INDEX 'XBUF' DU
                                     <          PREMIER NOEUD DE CHAQUE LIGNE...
         LA          &APLIGM         < (A)='J' MAX DE LA LIGNE 'I',
         LR          A,B             < (B)='J' MAX DE LA LIGNE 'I',
         ADRI        Z,A             < PARCE QUE L'ON EST SUR UN J-TORE, LE
                                     < NOEUD (I,0)=(I,JMAX+1), ET COMPTE DONC
                                     < 2 FOIS...
         SLRS        PASJ=K
         LR          A,X             < (X)=NOMBRE DE COUPLES DE TRIANGLES A
                                     <     GENERER SUR LA LIGNE 'I'.
         EORR        W,W             < (W)='J' COURANT SUR LA LIGNE 'I'...
         LA          SNUMI           < (A)=NUMERO DE LA LIGNE COURANTE,
         SLRS        XXXMOY=K
         TBT         NBITMO-B        < QUELLE EST SA PARITE ???
         JNC         E130            < PAIRE, ON COMMENCE SUR (I,0)...
         ADRI        I,W             < IMPAIRE, ON COMMENCE SUR (I,1)...
         ADRI        LBUF4D,Y        < (Y)=XBUF(I,1)...
         IF          PASJ-XXXMOY,,XEIF%,
         IF          ATTENTION : CE QUI PRECEDE EST IDIOT !!!
XEIF%:   VAL         ENDIF
E130:    EQU         $
E122:    EQU         $
<
< OUVERTURE GRAPHIQUE :
<
         PSR         X,Y             < SAUVEGARDE DU NOMBRE DE COUPLES DE TRIAN-
                                     < GLES ET DE L'INDEX 'XBUF' DU PREMIER
                                     < NOEUD DE LA LIGNE 'I'.
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         LAD         DEMOG
         SVC                         < MISE EN GRAPHIQUE...
XOPT1:   VAL         ENDIF
<
< GENERATION DU PREMIER TRIANGLE, SOIT :
< (I,J) --> (I,J+2) --> (I+2,J+1) --> (I,J),
< OU 'J' EST GERE MODULO...
<
         LR          Y,X             < (X)=XBUF(I,J),
         STX         SAVEX0          < ET SAUVEGARDE DU PREMIER SOMMET :
                                     < SAVEX0=XBUF(I,J).
         BSR         ASP1            < RECUPERATION, ET PROJECTION DU PREMIER
                                     < SOMMET.
         BSR         ASP1A           < GENERATION DE FACETTE(A).
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         BSR         ASP4            < MISE EN PLACE DU PREMIER SOMMET...
XOPT1:   VAL         ENDIF
         PSR         B,W             < SAUVEGARDE DE 'J' MAX, ET DE 'I' COURANT.
         LXI         PASJ            < INCREMENT DE 'J',
         BSR         ASP3            < CALCUL DE XBUF(I,J+2),
         STX         SAVEX1          < ET SAUVEGARDE DU DEUXIEME SOMMET :
                                     < SAVEX1=XBUF(I,J+2).
         BSR         ASP2            < RECUPERATION, PROJECTION DU DEUXIEME
                                     < SOMMET, ET TRACE DU PREMIER COTE.
         BSR         ASP1B           < GENERATION DE FACETTE(B).
         PLR         B,W             < RESTAURATION DE :
                                     < (B)='J' MAX,
                                     < (W)='J' COURANT...
         LA          XBUFI0          < POUR EMPILER XBUF(I,0)...
         PSR         A,B,W           < ET RESAUVEGARDE IMMEDIATE...
         LX          SNUMI           < (X)='I' COURANT,
         BSR         ASP5            < PASSAGE A I+2,
         LB          &APLIGM         < (B)='J' MAX DE LA LIGNE I+2,
         LX          &APLIGX         < (X)=XBUF(I+2,0), SOIT L'INDEX 'XBUF'
                                     <     DU PREMIER NOEUD DE LA LIGNE I+2.
         STX         XBUFI0          < (XBUFI0)=XBUF(I+2,0)=INDEX 'XBUF' DU PRE-
                                     <          MIER NOEUD DE LA LIGNE I+2...
         PSR         B               < SAUVEGARDE DU 'J' MAX DE LA LIGNE I+2.
         LXI         PASJ/XXXMOY     < INCREMENT DE 'J',
         BSR         ASP3            < PASSAGE AU NOEUD (I+2,J+1),
         STX         SAVEX2          < ET SAUVEGARDE DU TROISIEME SOMMET :
                                     < SAVEX2=XBUF(I+2,J+1).
         PLR         B               < RESTAURE :
                                     < (B)='J' MAX DE LA LIGNE I+2.
         BSR         ASP2            < RECUPERATION, PROJECTION DU TROISIEME
                                     < SOMMET ET TRACE DU DEUXIEME COTE.
         BSR         ASP1C           < GENERATION DE FACETTE(C), ET DE LA
                                     < FACETTE (A,B,C)...
         LXI         PASJ            < INCREMENT DE 'J',
         BSR         ASP3            < CALCUL DE XBUF(I+2,J+1+2) EN PREVISION
                                     < DU DEUXIEME SOMMET DU DEUXIEME TRIANGLE.
         STX         SAVEX3          < SAUVEGARDE DU "QUATRIEME" SOMMET :
                                     < SAVEX3=XBUF(I+2,J+1+2).
         PLR         A,B,W           < RESTAURE :
                                     < (A)=XBUF(I,0),
                                     < (B)='J' MAX DE LA LIGNE 'I',
                                     < (W)='J' COURANT.
         STA         XBUFI0          < RESTAURE XBUF(I,0)...
         LX          SAVEX0
         BSR         ASP2            < RETOUR AU PREMIER SOMMET, AFIN DE FERMER
                                     < LE PREMIER TRIANGLE...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE 'JE' QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IDEGEN          < LA FACETTE (A,B,C) EST-ELLE DEGENEREE ???
         JE          E160            < OUI, ON L'IGNORE...
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IWGNFI          < TRACE-T'ON LES NORMALES AUX FACETTES
                                     < "INTERNES" ???
         JE          E230            < NON...
         BSR         ASP6            < TRACE DE LA NORMALE A LA PREMIERE
                                     < FACETTE...
E230:    EQU         $
         BSR         ASPB            < VERIFICATION DE L'EQUATION DU PLAN...
XOPT1:   VAL         ENDIF
         BSR         AFACE           < CALCUL DES 6 FACETTES "EXTERNES" ASSO-
                                     < CIEES A LA FACETTE "INTERNE" COURANTE...
E160:    EQU         $               < CAS DES FACETTES DEGENEREES...
<
< TRACE DU DEUXIEME TRIANGLE, A SAVOIR :
< (I,J+2) --> (I+2,J+1+2) --> (I+2,J+1) --> (I,J+2),
< OU 'J' EST GERE MODULO...
<
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         LAD         DEMOG
         SVC                         < AFIN DE NE PAS CHAINER LES 2 TRIANGLES
                                     < GRAPHIQUEMENT...
XOPT1:   VAL         ENDIF
         LX          SAVEX1
         BSR         ASP1            < RECUPERATION DE (I,J+2),
         BSR         ASP1A           < GENERATION DE FACETTE(A).
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         BSR         ASP4            < MISE EN PLACE DU PREMIER SOMMET...
XOPT1:   VAL         ENDIF
         LX          SAVEX3
         BSR         ASP2            < RECUPERATION DE (I+2,J+1+2) ET TRACE DU
                                     < PREMIER COTE,
         BSR         ASP1B           < GENERATION DE FACETTE(B).
         LX          SAVEX2
         BSR         ASP2            < RECUPERATION DE (I+2,J+1) ET TRACE DU
                                     < DEUXIEME COTE,
         BSR         ASP1C           < GENERATION DE FACETTE(C), ET DE LA
                                     < FACETTE (A,B,C)...
         LX          SAVEX1
         BSR         ASP2            < RECUPERATION DE (I,J+2) ET TRACE DU
                                     < DERNIER COTE...
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE 'JE' QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IDEGEN          < LA FACETTE (A,B,C) EST-ELLE DEGENEREE ???
         JE          E161            < OUI, ON L'IGNORE...
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IWGNFI          < TRACE-T'ON LES NORMALES AUX FACETTES
                                     < "INTERNES" ???
         JE          E231            < NON...
         BSR         ASP6            < TRACE DE LA NORMALE A LA DEUXIEME
                                     < FACETTE...
E231:    EQU         $
         BSR         ASPB            < VERIFICATION DE L'EQUATION DU PLAN...
XOPT1:   VAL         ENDIF
         BSR         AFACE           < CALCUL DES 6 FACETTES "EXTERNES" ASSO-
                                     < CIEES A LA FACETTE "INTERNE" COURANTE...
E161:    EQU         $               < CAS DES FACETTES DEGENEREES...
<
< PASSAGE AU NOEUD (I,J+2) SUIVANT :
<
         PLR         X,Y             < RESTAURE :
                                     < (X)=NOMBRE DE NOEUDS SUR LA LIGNE 'I',
                                     < (Y)=XBUF(I,J).
         ADRI        PASJ,W          < PASSAGE DE 'J' A 'J+2'...
         ADRI        LBUF4D*PASJ,Y   < (Y)=XBUF(I,J)...
         JDX         E122            < ET PASSAGE AU NOUVEAU COUPLE DE TRIAN-
                                     < GLES...
<
< PASSAGE A LA LIGNE I+2 SUIVANTE :
<
         PLR         X,Y             < RESTAURE :
                                     < (X)=NOMBRE DE LIGNES,
                                     < (Y)='I' COURANT.
         XR          X,Y             < AFIN D'APPELER 'SP5'...
         BSR         ASP5            < I <-- (I)+2,
         XR          X,Y             < RESTAURATION DE 'X' ET 'Y'...
         JDX         E121            < ET PASSAGE A LA LIGNE SUIVANTE...
<
< A LA FIN, RETOUR EN ALPHA-NUMERIQUE :
<
         PLR         W
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         LAD         DEMCG
         SVC
XOPT1:   VAL         ENDIF
         BSR         ATSFLO
         PAGE
<
<
<        V I S U A L I S A T I O N   D E   L A   S U R F A C E   P A R
<        R E C U P E R A T I O N   E T   T R A I T E M E N T
<                    D U   C A T A L O G U E   " X / "  :
<
<
DEBUT3:  EQU         $
<
< INITIALISATIONS DES DIFFERENTS
< INDEXES ET DE CERTAINES VARIABLES :
<
         STZ         XBUF            < RAZ DE L'INDEX D'INSERTION DES FACETTES.
         LRM         A,B
         WORD        XMIN
         WORD        YMIN
         STA         TRX             < TRANSLATION DU
         STB         TRY             <                TRACE RASTER.
         #/FLD#      F1
         #/FST#      FACT            < FACTEUR D'ECHELLE POUR LE TRACE RASTER...
         #/FLD#      F0
         #/FST#      FXSD            < ON PLACE LE POINT DE VUE EN : XD=0,
         #/FST#      FYSD            <                               YD=0,
         #/FLD#      PZ
         #/FST#      FZSD            <                               ZD=PZ.
<
<
<        R E C U P E R A T I O N   D U   C A T A L O G U E   " X / "  :
<
<
         LRM         A,B,Y
         WORD        NFACET=FCTA*NOCMO
                                     < (A)=ADRESSE OCTET DU NOM DU CATALOGUE,
         WORD        GFACET          < (B)=ADRESSE DU SOUS-PROGRAMME DE TRAI-
                                     <     TEMENT DES FACETTES DU MAILLAGE,
         WORD        LFAC*NOCMO      < (Y)=NOMBRE D'OCTETS ATTENDUS POUR UNE
                                     <     FACETTE.
         BSR         ACATAL          < RECUPERATION ET TRAITEMENT DU SOUS-
                                     < CATALOGUE "X/" DES FACETTES.
         LX          XBUF
         STX         SAVEX0          < SAUVEGARDE DE L'INDEX MAXIMAL DE RANGE-
                                     < MENT DES FACETTES...
<
<
<        V I S U A L I S A T I O N  :
<
<
DEBUT4:  EQU         $
         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'...).
<
< (RE-)INITIALISATION DES
< HASH-TABLES D'OPTIMISATION
< DU CALCUL DES 3 FONCTIONS
< X(U,V), Y(U,V) ET Z(U,V) :
<
         PSR         C,L,W           < PRUDENCE...
         LRM         C,L,W
         WORD        HASHTX          < (C)=BASE DE 'HASHTX',
         WORD        HASHTY          < (L)=BASE DE 'HASHTY',
         WORD        HASHTZ          < (W)=BASE DE 'HASHTZ'...
         #/FLD#      F0              < PAR PURE PROPRETE...
         LXI         NEHASH          < (X)=NOMBRE D'ENTREES PAR TABLE...
VISU10:  EQU         $
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : L'INITIALISATION SUIVANTE EST IDIOTE !!!
XEIF%:   VAL         ENDIF
         STZ         HASHFR,C        < LIBERATION ET NETTOYAGE DE 'HASHTX'...
         #/FST#      HASHU,C
         #/FST#      HASHV,C
         #/FST#      HASHF,C
         STZ         HASHFR,L        < LIBERATION ET NETTOYAGE DE 'HASHTY'...
         #/FST#      HASHU,L
         #/FST#      HASHV,L
         #/FST#      HASHF,L
         STZ         HASHFR,W        < LIBERATION ET NETTOYAGE DE 'HASHTZ'...
         #/FST#      HASHU,W
         #/FST#      HASHV,W
         #/FST#      HASHF,W
         ADRI        LEHASH,C        < ET PASSAGE
         ADRI        LEHASH,L        <            AUX ENTREES
         ADRI        LEHASH,W        <                        SUIVANTES,
         JDX         VISU10          < SI ELLES EXISTENT...
         PLR         C,L,W           < ET RESTAURATIONS...
<
< REINITIALISATION DU BUFFER
< DE LIGNE DE COHERENCE :
<
         LAI         XXNOIR          < (A)=NIVEAU DE NOIR,
         LRM         X
         WORD        XC512-Z         < (X)=INDEX DU DERNIER POINT...
VISU93:  EQU         $
         STBY        &ALIGNE         < REMISE DU BUFFER DE LIGNE A NOIR...
         ADRI        -I,X            < PASSAGE AU POINT PRECEDENT,
         CPZR        X               < S'IL EXISTE...
         JGE         VISU93          < ET OUI...
<
< INITIALISATION DU
< SYSTEME DE VISUALISATION :
<
XWOR%1:  VAL         NIV256=K
         IF          BIT>XWOR%1-NIV256,,XEIF%,
         IF          ATTENTION : LE CALCUL DU MASQUE SELECTANT TOUS
         IF          LES PLANS EST ABSURDE !!!
XEIF%:   VAL         ENDIF
         LAI         NIV256-N)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...
         LRM         A
         WORD        TEMPO
         SVC                         < ET ON ATTEND UN PEU...
<
< BOUCLE DE PARCOURS
< DES LIGNES DE L'IMAGE :
<
         LRM         Y
LYMIN:   WORD        YMIN            < (Y)=COORDONNEE 'Y' DE L'IMAGE.
VISU9:   EQU         $
         PSR         Y               < SAUVEGARDES...
         LYI         XEPSU0          < (Y)=INDEX D'ACCES AUX 'DU0',
         LXI         XNOCTA          < (X)=NOMBRE D'OCTANTS DE L'ESPACE,
         #/FLD#      F0              < (A,B)=VALEUR INITIALE DE 'DU0' ET 'DV0',
VISU94:  EQU         $
         XR          X,Y
         FST         &ALTORE         < EN DEBUT DE CHAQUE LIGNE DE BALAYAGE
                                     < RASTER, ON REINITIALISE L'ENSEMBLE DES
                                     < (DU0,DV0), CAR EN EFFET, UN CHANGEMENT
                                     < DE LIGNE CONSTITUE UNE DISCONTINUITE ;
                                     < DE PLUS, ON FAIT UN TRI DES FACETTES
                                     < SUIVANT L'OCTANT AUQUEL APPARTIENT LEUR
                                     < VECTEUR NORMAL...
         ADRI        XEPSV0-XEPSU0,X < PASSAGE A 'DV0',
         FST         &ALTORE         < 'DV0',
         XR          X,Y
         ADRI        XEPSU0-XEPSV0+DFLOT,Y
                                     < PASSAGE AU 'DU0' SUIVANT,
         JDX         VISU94          < S'IL EXISTE...
         PLR         Y               < ET RESTAURATIONS...
<
< BOUCLE DE PARCOURS DE
< LA LIGNE COURANTE (Y) :
<
         LRM         X
LXMIN:   WORD        XMIN            < (X)=COORDONNEE 'X' DE L'IMAGE.
VISU1:   EQU         $
         PSR         X,Y,W           < SAUVEGARDES...
         LR          X,A             < AFIN DE FAIRE DES VERIFICATIONS ENTRE
         AD          TRX             < LE POINT (X,Y) COURANT DE BALAYAGE, ET
         STA         XS              < LA PROJECTION DU POINT D'INTERSECTION
         STA         XR
         LR          Y,A             < COURANT, ET L'EVENTUELLE VISUALISATION
         AD          TRY             < GRAPHIQUE...
         STA         YS
         STA         YR              < (XR,YR) MEMORISE LE POINT RASTER COURANT,
                                     < ET EST UTILISE LORS DU TEST DE LA POSI-
                                     < TION DE CELUI-CI PAR RAPPORT A LA
                                     < PROJECTION DE LA FACETTE COURANTE...
<
< COMPOSANTE EN 'X' DE LA DROITE 'D' :
< LA DROITE 'D' EST ISSUE DU POINT
< (FXSD,FYSD,FZSD), ET PASSE PAR
< LE POINT COURANT (XP,YP) DU PLAN DE
< PROJECTION (ZP=0), SON EQUATION EST DONC :
<
<        X=XD+RHO*VX,
<        Y=YD+RHO*VY,
<        Z=ZD+RHO*VZ,
<
<        OU :
<
<                    VX=(XP-XD)/V,
<                    VY=(YP-YD)/V,
<                    VZ=(ZP-ZD)/V=-ZD/V PUISQUE ZP=0 (PLAN DE PROJECTION).
<
<        OU :
<                    'V' DESIGNE LA NORME DU VECTEUR (VX,VY,VZ).
<
         LR          X,A
         BSR         AFLT            < X,
         FSB         FXSD            < X-XD,
         #/FST#      DVX             < DVX=X-XD, OU 'X' DESIGNE LE 'X' DU POINT
                                     < COURANT.
<
< COMPOSANTE EN 'Y' DE LA DROITE 'D' :
<
         LR          Y,A
         BSR         AFLT            < Y,
         FSB         FYSD            < Y-YD,
         #/FST#      DVY             < DVY=Y-YD, OU 'Y' DESIGNE LE 'Y' DU POINT
                                     < COURANT...
<
< COMPOSANTE EN 'Z' DE LA DROITE 'D' ;
<
         #/FLD#      FZSD
         BSR         AFNEG
         #/FST#      DVZ             < EN EFFET, LE PLAN DE PROJECTION EST
                                     < LE PLAN Z=0...
<
< NORMALISATION DU VECTEUR
< DIRECTEUR DE LA DROITE 'D' :
<
         LRM         A,B
         WORD        DV3D            < (A)=ADRESSE DE (DVX,DVY,DVZ),
         WORD        DV3D            < (B)=ADRESSE DE (DVX,DVY,DVZ),
         BSR         APRSCA          < CALCUL DU CARRE DE LA NORME DU VECTEUR
                                     < DIRECTEUR DE LA DROITE 'D',
         BSR         ARAC            < PUIS DE SA NORME,
         BSR         ASFWOR          < QUE L'ON SAUVEGARDE DANS 'WORK'...
         #/FLD#      DVX
         FDV         FWORK
         #/FST#      DVX             < NORMALISATION DE 'DVX',
         #/FLD#      DVY
         FDV         FWORK
         #/FST#      DVY             < NORMALISATION DE 'DVY',
         #/FLD#      DVZ
         FDV         FWORK
         #/FST#      DVZ             < NORMALISATION DE 'DVZ'.
         BSR         ATSFLO
         IF          XOPT01-EXIST,XOPT1,,XOPT1
<
< SUIVI GRAPHIQUE DU BALAYAGE
< RASTER DE L'IMAGE :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IWPRST          < LE TRACE RASTER EST-IL DEMANDE ???
         JE          VISU60          < NON...
         BSR         ASP4            < OUI, MISE EN PLACE DE L'ORIGINE,
         BSR         ASP7            < ET DE L'EXTREMITE DU VECTEUR COURANT
                                     < QUI SE REDUIT AU POINT (X,Y)...
         LAD         DEMOG
         SVC                         < DECHAINAGE GRAPHIQUE...
         LAD         DEMWG
         SVC                         < ET TRACE DU POINT (X,Y) COURANT...
VISU60:  EQU         $
XOPT1:   VAL         ENDIF
<
< BOUCLE DE TEST DE CHAQUE FACETTE :
<
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST QUI SUIT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IWCONV          < LE TRACE DE SUIVI DE LA CONVERGENCE
                                     < EST-IL DEMANDE ???
         JE          VISU61          < NON...
         QUIT        XXQUIT          < PETITE PAUSE AVANT D'EFFACER L'ECRAN
                                     < AFIN DE LAISSER LE TEMPS D'EXAMINER LE
                                     < SUIVI DE CONVERGENCE PRECEDENT...
         LRM         A               < OUI :
         WORD        DEMERA
         SVC                         < ON EFFACE L'ECRAN DE LA VISU...
VISU61:  EQU         $
XOPT1:   VAL         ENDIF
         STZ         XBUF            < AFIN DE COMMENCER SUR LA PREMIERE
                                     < FACETTE...
         LYI         K               < (Y)=COMPTEUR DES POINTS D'INTERSECTIONS,
         LRM         W
         WORD        LPINT           < (W)=ADRESSE DES POINTS D'INTERSECTION
                                     <     TROUVES DANS 'LPINT'.
VISU2:   EQU         $
<
< ACCES A LA FACETTE COURANTE :
<
         LX          XBUF
         LR          X,A
         CP          SAVEX0          < A-T'ON EXPLORE TOUTE LA LISTE ???
         JL          VISU37          < NON, ON CONTINUE...
         BSR         AGOTO
         WORD        VISU3           < OUI, ON ARRETE ICI...
VISU37:  EQU         $
                                     < NON :
                                     < (A)=ADRESSE DE LA FACETTE COURANTE,
         LRM         B,X
         WORD        FAC             < (B)=ADRESSE DE MANOEUVRE DE LA
                                     <     FACETTE COURANTE,
         WORD        LFAC            < (X)=NOMBRE DE MOTS A DEPLACER,
         RCDA
                                     < ET RECUPERATION DE LA FACETTE COURANTE.
<
< EXAMINONS LA POSITION DU
< POINT RASTER COURANT (XR,YR),
< EN CALCULANT SES COORDONNEES
< BARYCENTRIQUES (ALPHA,BETA,GAMMA)
< PAR RAPPORT A LA FACETTE (A,B,C)
< COURANTE PROJETEE PARALLELEMENT
< A LA DROITE 'D' ; ON DOIT DONC
< RESOUDRE :
<
<        ALPHA*X(A)+BETA*X(B)+GAMMA*X(C)=XR,
<        ALPHA*Y(A)+BETA*Y(B)+GAMMA*Y(C)=YR,
<        ALPHA     +BETA     +GAMMA     =1.
<
<        OU X( ) ET Y( ) DESIGNENT LES COORDONNEES
<        PROJETEES PARALLELEMENT A LA DROITE 'D'
<        SUIVANT LES FORMULES OBTENUES EN CALCU-
<        LANT L'INTERSECTION D'UNE DROITE PARAL-
<        LELE A 'D' ET PASSANT PAR LE POINT 'M'
<        COURANT AVEC LE PLAN DE PROJECTION,
<        SOIT :
<                    X=X(M)+RHO*VX,
<                    Y=Y(M)+RHO*VY,
<                    Z=Z(M)+RHO*VZ=0,
<
<        D'OU :
<
<                    X=X(M)-Z(M)*(VX/VZ),
<                    Y=Y(M)-Z(M)*(VY/VZ).
<
         LA          XR
         BSR         AFLT
         #/FST#      M14             < ABSCISSE DU POINT D'INTERSECTION
                                     < ENTRE LA DROITE 'D' ET LA PROJEC-
                                     < TION DE LA FACETTE (A,B,C),
                                     < M14 --> XR,
         LA          YR
         BSR         AFLT
         #/FST#      M24             < DE MEME, SON ORDONNEE...
                                     < M24 --> YR,
         #/FLD#      F1
         #/FST#      M34             < M34 --> 1.
         #/FLD#      DVX             < VX,
         FDV         DVZ             < VX/VZ,
         BSR         AFNEG           < -(VX/VZ),
         #/FST#      FWORK1          < FWORK1=-(VX/VZ).
         #/FLD#      DVY             < VY,
         FDV         DVZ             < VY/VZ,
         BSR         AFNEG           < -(VY/VZ),
         #/FST#      FWORK2          < FWORK2=-(VY/VZ).
         BSR         ATSFLO
         #/FLD#      FWORK1          < -(VX/VZ),
         FMP         FZSA            < -ZA*(VX/VZ),
         FAD         FXSA            < XA-ZA*(VX/VZ),
         #/FST#      M11             < X(A) PROJETE PARALLELEMENT A 'D'.
         #/FLD#      FWORK2          < -(VY/VZ),
         FMP         FZSA            < -ZA*(VY/VZ),
         FAD         FYSA            < YA-ZA*(VY/VZ),
         #/FST#      M21             < Y(A) PROJETE PARALLELEMENT A 'D'.
         #/FLD#      FWORK1          < -(VX/VZ),
         FMP         FZSB            < -ZB*(VX/VZ),
         FAD         FXSB            < XB-ZB*(VX/VZ),
         #/FST#      M12             < X(B) PROJETE PARALLELEMENT A 'D'.
         #/FLD#      FWORK2          < -(VY/VZ),
         FMP         FZSB            < -ZB*(VY/VZ),
         FAD         FYSB            < YB-ZB*(VY/VZ),
         #/FST#      M22             < Y(B) PROJETE PARALLELEMENT A 'D'.
         #/FLD#      FWORK1          < -(VX/VZ),
         FMP         FZSC            < -ZC*(VX/VZ),
         FAD         FXSC            < XC-ZC*(VX/VZ),
         #/FST#      M13             < X(C) PROJETE PARALLELEMENT A 'D'.
         #/FLD#      FWORK2          < -(VY/VZ),
         FMP         FZSC            < -ZC*(VY/VZ),
         FAD         FYSC            < YC-ZC*(VY/VZ),
         #/FST#      M23             < Y(C) PROJETE PARALLELEMENT A 'D'.
         LAD         M11
         STA         AM11            < M11 --> X(A) PROJETE,
         LAD         M12
         STA         AM12            < M12 --> X(B) PROJETE.
         LAD         M13
         STA         AM13            < M13 --> X(C) PROJETE.
         LAD         M21
         STA         AM21            < M21 --> Y(A) PROJETE,
         LAD         M22
         STA         AM22            < M22 --> Y(B) PROJETE,
         LAD         M23
         STA         AM23            < M23 --> Y(C) PROJETE.
         LAD         F1
         STA         AM31            < M31 --> 1,
         STA         AM32            < M32 --> 1,
         STA         AM33            < M33 --> 1.
         LAD         ALPHA
         STA         AVARX           < PREMIERE VARIABLE : ALPHA,
         LAD         BETA
         STA         AVARY           < DEUXIEME VARIABLE : BETA,
         LAD         GAMMA
         STA         AVARZ           < TROISIEME VARIABLE : GAMMA.
         #/FLD#      F0              < AFIN DE CALCULER LE DETERMINANT...
         BSR         ADETER          < CALCUL DU DETERMINANT DU SYSTEME :
                                     < ALORS : LES SOMMETS (A,B,C) PROJETES
                                     < SONT-ILS ALIGNES ???
         JE          VISU4           < OUI, ON IGNORE CETTE FACETTE...
         BSR         ACRAMR          < CALCUL DE (ALPHA,BETA,GAMMA)...
         BSR         ATSFLO
         #/FLD#      ALPHA           < ALORS, (XR,YR) EST-IL DANS (A,B,C) ???
         BSR         AFCAZ
         JL          VISU4           < NON...
         FCAM        F1
         JG          VISU4           < NON...
         #/FLD#      BETA            < PEUT-ETRE ???
         BSR         AFCAZ
         JL          VISU4           < NON...
         FCAM        F1
         JG          VISU4           < NON...
         #/FLD#      GAMMA           < PEUT-ETRE ???
         BSR         AFCAZ
         JL          VISU4           < NON...
         FCAM        F1
         JG          VISU4           < NON...
<
< CALCUL DU POINT D'INTERSECTION
< ENTRE LA DROITE 'D' COURANTE (ALLANT
< DE L'OBSERVATEUR (FXSD,FYSD,FZSD) AU
< POINT RASTER (X,Y) COURANT) ET DE
< LA FACETTE COURANTE ET/OU DE
< DE LA SURFACE 'S' :
<
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LES 'JE' QUI SUIVENT SONT IDIOTS !!!
XEIF%:   VAL         ENDIF
         BSR         AINTDB          < TEST DE L'INTERSECTION ENTRE 'D' ET LA
                                     < BOULE 'B' COURANTE :
         JE          VISU4           < INEXISTANTE, ON SAUTE...
         BSR         AINTDP          < TEST DE L'INTERSECTION ENTRE 'D' ET LA
                                     < FACETTE ELLE-MEME :
         JE          VISU4           < INEXISTANTE, ON SAUTE...
         IF          EXIST-K,XEIF%,,XEIF%
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!!
XEIF%:   VAL         ENDIF
         CPZ         IVSUR           < QUE VISUALISE-T'ON ???
         JNE         VISU70          < LA SURFACE 'S'...
<
< VISUALISATION DES
< FACETTES PLANES :
<
         LRM         A,B
         WORD        CM3D            < (A)=ADRESSE DU POINT D'INTERSECTION
                                     <     ENTRE LA DROITE 'D' ET LA FACETTE,
         WORD        CS3D            < (B)=ADRESSE DU POINT 3D COURANT,
         BSR         AMOVE3          < (FXS,FYS,FZS) <-- (FXSM,FYSM,FZSM).
         #/FLD#      VARUM           < LE DEPLACEMENT DES
         #/FST#      VARU            < COORDONNEES CURVILIGNES
         #/FLD#      VARVM           < EST FAIT PAR PURE QUESTION
         #/FST#      VARV            < D'HYGIENE...
         JMP         VISU71          < VERS LA MEMORISATION DU POINT D'INTER-
                                     < SECTION...
<
< VISUALISATION DE LA SURFACE 'S' :
<
VISU70:  EQU         $
         BSR         AINTDS          < TEST DE L'INTERSECTION ENTRE 'D' ET LA
                                     < SURFACE 'S' PROPREMENT DITE :
         JE          VISU4           < INEXISTANTE, ON SAUTE...
                                     < LORSQU'ON LA TROUVE, ON NOTERA QUE
                                     < 'VARU' ET 'VARV' DONNE LES COORDONNEES
                                     < CURVULIGNES DU POINT D'INTERSECTION SUR
                                     < LA SURFACE 'S'.
<
< CAS OU L'ON A TROUVE UN
< POINT D'INTERSECTION (FXS,FYS,FZS)
< ENTRE LA DROITE 'D' COURANTE ET
< LA SURFACE 'S' :
<
VISU71:  EQU         $
NPINT::  VAL         8               < NOMBRE MAXIMAL DE POINTS D'INTERSECTION
                                     < RECONNUS ENTRE UNE DROITE 'D' ET UNE
                                     < SURFACE 'S'...
PINT3D:: MOT         O               < COORDONNEES (X,Y,Z) DU POINT D'INTERSEC-
                                     < TION SUR LA FACETTE OU LA SURFACE SUI-
                                     < VANT 'IVSUR',
LPIN3D:: VAL         LBUF3D          < LONGUEUR DE 'PINT3D'.
PINTUV:: MOT         PINT3D+LPIN3D   < COORDONNEES CURVILIGNES (U,V) DU POINT
                                     < D'INTERSECTION SUR 'S',
LPINUV:: VAL         LVARUV          < LONGUEUR DE 'PINTUV'.
PINTAD:: MOT         PINTUV+LPINUV   < INDEX DE LA FACETTE AYANT FOURNI L'INTER-
                                     < SECTION DANS 'BUF',
LPINAD:: VAL         D               < LONGUEUR DE 'PINTAD'.
LOPINT:: VAL         LPIN3D+LPINUV+LPINAD
                                     < LONGUEUR DE LA ZONE DE SAUVEGARDE D'UN
                                     < POINT D'INTERSECTION TROUVE.
         IF          PINTAD+LPINAD-PINT3D-LOPINT,,XEIF%,
         IF          ATTENTION : LES DEFINITIONS PRECEDENTES
         IF          SONT INCOHERENTES !!!
XEIF%:   VAL         ENDIF
         LR          Y,A             < (A)=(Y)=NOMBRE D'INTERSECTIONS COURANT,
         CPI         NPINT           < ET VALIDATION...
         JL          VISU5           < OK...
         QUIT        XXQUIT          < D E B O R D E M E N T ...
         JMP         VISU3           < ET ON PERD CE POINT D'INTERSECTION, TOUT
                                     < ARRETANT LA LE PARCOURS DE LA LISTE DES
                                     < FACETTES...
VISU5:   EQU         $
         LRM         A,X
         WORD        CS3D            < (A)=POINT D'INTERSECTION COURANT,
         WORD        LPIN3D          < (X)=NOMBRE DE MOTS A DEPLACER...
         LR          W,B             < (B)=ZONE DE SAUVEGARDE DU POINT D'INTER-
                                     <     SECTION COURANT DANS 'LPINT'.
         ADR         X,W             < ET PROGRESSION DE L'ADRESSE DE SAUVE-
                                     < GARDE DES POINTS D'INTERSECTION...
         MOVE                        < ET SAUVEGARDE DU POINT D'INTERSECTION
                                     < COURANT...
         LRM         A,X
         WORD        VARUVW          < (A)=COORDONNEE CURVILIGNES DU POINT
                                     <     D'INTERSECTION COURANT,
         WORD        LPINUV          < (X)=NOMBRE DE MOTS A DEPLACER,
         LR          W,B             < (B)=ZONE DE SAUVEGARDE,
         ADR         X,W             < ET PROGRESSION DE L'ADRESSE DE SAUVE-
                                     < GARDE...
         MOVE                        < ET SAUVEGARDE DE (VARU,VARV) DU POINT
                                     < D'INTERSECTION COURANT...
         LX          XBUF            < (X)=INDEX DE LA FACETTE EN CAUSE,
         STX         O,W             < QUE L'ON SAUVEGARDE (UTILISE LORSQUE L'ON

                                     < NE VISUALISE QUE LES FACETTES...
         ADRI        LPINAD,W        < ET PROGRESSION DE L'ADRESSE DE SAUVE-
                                     < GARDE...
         ADRI        I,Y             < ET COMPTAGE DANS 'Y' DES POINTS
                                     < D'INTERSECTION...
<
< PASSAGE A LA FACETTE SUIVANTE :
<
VISU4:   EQU         $
         LX          XBUF
         ADRI        LFAC,X
         STX         XBUF            < ET PROGRESSION DANS LA LISTE DES
                                     < DES FACETTES,
         BSR         AGOTO
         WORD        VISU2           < SI ELLE EXISTE...
<
< FIN DE LA LISTE DES FACETTES :
<
VISU3:   EQU         $
         LR          Y,X             < (X)=NOMBRE DE POINTS D'INTERSECTION
                                     <     RENCONTRES,
         CPZR        X               < Y-EN-A-T'IL AU MOINS UN ???
         JG          VISU40          < OUI, ON VA TRACER...
         BSR         AGOTO           < NON,
         WORD        VISU6           < RIEN A FAIRE...
VISU40:  EQU         $
<
< ELIMINATION DES PARTIES CACHEES,
< PAR RECHERCHE DU POINT D'INTER-
< SECTION DE 'Z' EXTREMAL :
<
         LRM         A,Y,W
AZMAX:   WORD        Q8000           < (A)=MAXIMUM COURANT DE LA COORDONNEE 'Z',
         WORD        LPINT           < (Y)=ADRESSE DU MAXIMUM COURANT,
         WORD        LPINT           < (W)=ADRESSE DU POINT COURANT DANS 'LPINT'
         BSR         AFLT            < "FLOTTAGE" DE 'ZMAX',
         BSR         AFCAZ           < QUEL EXTREMUM RECHERCHE-T'ON ???
         JL          VISU80          < LE MAXIMUM (VISUALISATION DES FACES
                                     < AVANT)...
<
< LE MINIMUM (VISUALISATION
< DES FACES ARRIERE) :
<
VISU87:  EQU         $
         FCAM        FZS-CS3D+PINT3D,W
                                     < RECHERCHE DU MINIMUM :
         JLE         VISU88          < NON...
         #/FLD#      FZS-CS3D+PINT3D,W
                                     < OUI,
                                     < (A,B)=NOUVEAU MINIMUM COURANT,
         LR          W,Y             < DONT ON MEMORISE L'ADRESSE DANS 'Y'...
VISU88:  EQU         $
         ADRI        LOPINT,W        < PASSAGE AU POINT D'INTERSECTION SUIVANT..
         JDX         VISU87          < S'IL EXISTE...
         JMP         VISU81          < VERS LA REPRESENTATION GRAPHIQUE...
<
< LE MAXIMUM (VISUALISATION
< DES FACES AVANT) :
<
VISU80:  EQU         $
VISU7:   EQU         $
         FCAM        FZS-CS3D+PINT3D,W
                                     < RECHERCHE DU MAXIMUM :
         JGE         VISU8           < NON...
         #/FLD#      FZS-CS3D+PINT3D,W
                                     < OUI,
                                     < (A,B)=NOUVEAU MAXIMUM COURANT,
         LR          W,Y             < DONT ON MEMORISE L'ADRESSE DANS 'Y'...
VISU8:   EQU         $
         ADRI        LOPINT,W        < PASSAGE AU POINT D'INTERSECTION SUIVANT..
         JDX         VISU7           < S'IL EXISTE...
<
< RECUPERATION DU POINT D'INTERSECTION
< LE PLUS PROCHE OU LE PLUS ELOIGNE
< DE L'OBSERVATEUR :
<
VISU81:  EQU         $
         LR          Y,W             < (W)=ADRESSE DE CELUI-CI,
         LAD         PINT3D,W        < (A)=ADRESSE DU POINT D'INTERSECTION,
         LRM         B,X
         WORD        CS3D            < (B)=ADRESSE DU POINT COURANT,
         WORD        LBUF3D          < (X)=NOMBRE DE MOTS A DEPLACER.
         MOVE                        < (FXS,FYS,FZS)=POINT D'INTERSECTION
                                     < ENTRE 'D' ET 'S' LE PLUS PROCHE
                                     < DE L'OBSERVATEUR...
         LAD         PINTUV,W        < (A)=ADRESSE DE (VARU,VARV),
         LRM         B,X
         WORD        VARUVW          < (B)=ADRESSE DE (VARU,VARV),
         WORD        LVARUV          < (X)=NOMBRE DE MOTS A DEPLACER,
         MOVE                        < ET RECUPERATION DES COORDONNEES CURVI-
                                     < LIGNES (VARU,VARV) DU POINT D'INTER-
                                     < SECTION COURANT...
         BSR         APROJ           < (XS,YS)=PROJECTION 3D --> 2D DU
                                     < POINT (FXS,FYS,FZS).
         IF          NEXIST-K,,XEIF%,
         IF          ATTENTION : LE TEST SUIVANT EST IDIOT !!
XEIF%:   VAL         ENDIF
         CPZ         IVSUR           < QUE REPRESENTE-T'ON ???
         JE          VISU72          < LES FACETTES UNIQUEMENT...
<
<
<        R E P R E S E N T A T I O N   D E   L A   S U R F A C E  :
<
<
VISU90:  EQU         $
<
< CALCUL DES 6 DERIVEES PARTIELLES
< AU POINT D'INTERSECTION LE PLUS
< PROCHE DE L'OBSERVATEUR :
<
DXDU:    EQU         DA              < DX/DU,
DXDV:    EQU         DB              < DX/DV,
DYDU:    EQU         DC              < DY/DU,
DYDV:    EQU         DBDC            < DY/DV,
DZDU:    EQU         DCDA            < DZ/DU,
DZDV:    EQU         DADB            < DZ/DV.
         LYI         XSPX
         LXI         XVARU
         LAD         FHU
         BSR         ADERIP
         #/FST#      DXDU            < CALCUL DE DX/DU.
         LXI         XVARV
         LAD         FHV
         BSR         ADERIP
         #/FST#      DXDV            < CALCUL DE DX/DV.
         LYI         XSPY
         LXI         XVARU
         LAD         FHU
         BSR         ADERIP
         #/FST#      DYDU            < CALCUL DE DY/DU.
         LXI         XVARV
         LAD         FHV
         BSR         ADERIP
         #/FST#      DYDV            < CALCUL DE DY/DV.
         LYI         XSPZ
         LXI         XVARU
         LAD         FHU
         BSR         ADERIP
         #/FST#      DZDU            < CALCUL DE DZ/DU.
         LXI         XVARV
         LAD         FHV
         BSR         ADERIP
         #/FST#      DZDV            < CALCUL DE DZ/DV.
<
< CALCUL DU VECTEUR NORMAL
< AU POINT D'INTERSECTION
< LE PLUS PROCHE DE L'OBSERVATEUR,
< TEL QUE CELUI-CI SOIT DIRIGE,
< POUR DES SURFACES "NORMALES"
< (ASTUCE...), VERS L'EXTERIEUR :
<
N3D:     EQU         M11             < DEBUT DU VECTEUR NORMAL :
NX:      EQU         M11             < COMPOSANTE 'X' DU VECTEUR NORMAL,
NY:      EQU         M12             < COMPOSANTE 'Y' DU VECTEUR NORMAL,
NZ:      EQU         M13             < COMPOSANTE 'Z' DU VECTEUR NORMAL.
NORMN:   EQU         M14             < NORME DU VECTEUR NORMAL.
         IF          NY-NX-DFLOT,,XEIF%,
         IF          ATTENTION : 'NX' ET 'NY' DOIVENT ETRE CONTIGUS !!!
XEIF%:   VAL         ENDIF
         IF          NZ-NY-DFLOT,,XEIF%,
         IF          ATTENTION : 'NY' ET 'NZ' DOIVENT ETRE CONTIGUS !!!
XEIF%:   VAL         ENDIF
         #/FLD#      DZDV
         FMP         DYDU
         BSR         ASFWOR
         #/FLD#      DYDV
         FMP         DZDU
         FSB         FWORK
         #/FST#      NX              < NX=(DY/DV)*(DZ/DU)-(DZ/DV)*(DY/DU).
         #/FLD#      DXDV
         FMP         DZDU
         BSR         ASFWOR
         #/FLD#      DZDV
         FMP         DXDU
         FSB         FWORK
         #/FST#      NY              < NY=(DZ/DV)*(DX/DU)-(DX/DV)*(DZ/DU).
         #/FLD#      DYDV
         FMP         DXDU
         BSR         ASFWOR
         #/FLD#      DXDV
         FMP         DYDU
         FSB         FWORK
         #/FST#      NZ              < NZ=(DX/DV)*(DY/DU)-(DY/DV)*(DX/DU).
         JMP         VISU73          < VERS LE VECTEUR OBSERVATION...
<
<
<        R E P R E S E N T A T I O N   D E S   F A C E T T E S  :
<
<
VISU72:  EQU         $
         LA          PINTAD,W        < (A)=INDEX DE LA FACETTE COURANTE,
                                     <    =ADRESSE DE LA FACETTE COURANTE,
         LRM         B,X
         WORD        FAC             < (B)=ADRESSE DE LA FACETTE DE TRAVAIL,
         WORD        LFAC            < (X)=LONGUEUR D'UNE FACETTE,
         RCDA
                                     < RAPPEL DE LA FACETTE QUI COUPE LA DROITE
                                     < 'D' COURANTE...
         LRM         A,B
         WORD        PLAN3D          < (A)=ADRESSE DES COEFFICIENTS (A,B,C)
                                     <     DU PLAN DE LA FACETTE,
         WORD        N3D             < (B)=ADRESSE DE LA NORMALE A LA FACETTE
                                     <     AU POINT D'INTERSECTION,
         BSR         AMOVE3          < LA NORMALE AU POINT D'INTERSECTION DE
                                     < LA FACETTE EST LE VECTEUR (A,B,C) DU PLAN
                                     < DE LA FACETTE...
<
<
<        V I S U A L I S A T I O N  :
<
<
VISU73:  EQU         $
<
< NORMALISATION DU VECTEUR NORMAL :
<
         LRM         A,B
         WORD        NX              < (A)=VECTEUR NORMAL,
         WORD        NX              < (B)=VECTEUR NORMAL,
         BSR         APRSCA          < ET CALCUL DU CARRE DE SA NORME,
         BSR         ARAC            < PUIS DE SA NORME...
         #/FST#      NORMN           < QUE L'ON SAUVEGARDE...
<
< VECTEUR OBSERVATION :
< (ALLANT DU POINT COURANT
< (FXS,FYS,FZS) AU POINT
< D'OBSERVATION (FXSD,FYSD,FZSD))
<
CS3DOB:  EQU         M21             < DEBUT DU VECTEUR OBSERVATION :
FXSOB:   EQU         M21             < 'X' DU VECTEUR OBSERVATION,
FYSOB:   EQU         M22             < 'Y' DU VECTEUR OBSERVATION,
FZSOB:   EQU         M23             < 'Z' DU VECTEUR OBSERVATION.
NORMS:   EQU         M24             < NORME DU VECTEUR OBSERVATION.
         IF          FYSOB-FXSOB-DFLOT,,XEIF%,
         IF          ATTENTION : 'FXSOB' ET 'FYSOB' DOIVENT ETRE CONTIGUS !!!
XEIF%:   VAL         ENDIF
         IF          FZSOB-FYSOB-DFLOT,,XEIF%,
         IF          ATTENTION : 'FYSOB' ET 'FZSOB' DOIVENT ETRE CONTIGUS !!!
XEIF%:   VAL         ENDIF
         #/FLD#      FXSD            < XD,
         FSB         FXS             < XD-X,
         #/FST#      FXSOB           < ET SAVE...
         #/FLD#      FYSD            < YD,
         FSB         FYS             < YD-Y,
         #/FST#      FYSOB           < ET SAVE...
         #/FLD#      FZSD            < ZD,
         FSB         FZS             < ZD-Z,
         #/FST#      FZSOB           < ET SAVE...
<
< NORMALISATION DU VECTEUR OBSERVATION :
<
         LRM         A,B
         WORD        CS3DOB          < (A)=VECTEUR OBSERVATION,
         WORD        CS3DOB          < (B)=VECTEUR OBSERVATION,
         BSR         APRSCA          < CALCUL DU CARRE DE SA NORME,
         BSR         ARAC            < ET PUIS DE SA NORME...
         #/FST#      NORMS           < QUE L'ON SAUVEGARDE...
<
< CALCUL DU COSINUS ENTRE
< LE VECTEUR NORMAL ET LE
< VECTEUR D'OBSERVATION ;
< CE COSINUS, QUI EST LE
< RAPPORT DU PRODUIT SCALAIRE
< DES 2 VECTEURS AU PRODUIT
< DE LEURS NORMES, DONNE LA
< MODULATION LUMINEUSE COR-
< RESPONDANT A UNE SOURCE
< SITUEE AU POINT D'OBSERVA-
< TION :
<
         LRM         A,B
         WORD        NX              < (A)=VECTEUR NORMAL,
         WORD        CS3DOB          < (B)=VECTEUR OBSERVATION,
         BSR         APRSCA          < ET CALCUL DE LEUR PRODUIT SCALAIRE,
         FDV         NORMN           < QUE L'ON
         FDV         NORMS           <          NORMALISE...
         BSR         ATSFLO
<
< CALCUL DE LA MODULATION LUMINEUSE :
<
         FMP         F05             < PLACONS LE COSINUS DANS (-0.5,+0.5),
         FAD         F05             < PUIS DANS (0,+1)...
         BSR         ASFWOR          < SAUVEGARDE DE L'INTENSITE DE LA MODULA-
                                     < TION LUMINEUSE...
LABLAN:  LAI         XXN255-Z        < (A)=NIVEAU DE GRIS MAXIMAL-1,
         BSR         AFLT
         FMP         FWORK           < ET QUE L'ON MODULE SUIVANT LA NORMALE
                                     < AU POINT COURANT,
         BSR         AROND           < ET QU'ENFIN ON FIXE...
ADNOIR:  ADRI        Z,A             < AFIN DE NE PAS TROUVER DE POINTS NOIRS...
<
< TESTS DE COHERENCE PAR ETUDE
< DU VOISINNAGE DEJA EXISTANT :
<
         LX          XS              < (X)=COORDONNEE 'X',
         LY          YS              < (Y)=COORDONNEE 'Y'.
         STA         FWORK1          < SAUVEGARDE DU NIVEAU CALCULE POUR LE
                                     < POINT (XS,YS) DANS 'FWORK1',
         IF          XXNOIR-K,,XEIF%,
         IF          ATTENTION : L'INITIALISATION DE 'FWORK2' EST IDIOTE !!!
XEIF%:   VAL         ENDIF
         STZ         FWORK2          < INITIALISATION DE :
                                     < FWORK2=SOMME DES NIVEAUX DE QUATRE VOI-
                                     <        SINS (AU PLUS) NON NOIRS.
         LBI         K               < (B)=CUMUL DU NOMBRE DE VOISINS NON NOIRS
                                     <     DEJA TRACES.
<
< EXPLORATION DU VOISINNAGE :
<
         LRM         A
WYMIN:   WORD        YMIN            < (Y)=ORDONNEE MINIMALE,
         CPR         A,Y             < EST-ON SUR LA PREMIERE LIGNE ???
         JE          VISU30          < OUI, ON NE FAIT QU'INITIALISER 'LIGNE'...
         LRM         A               < NON :
WXMIN:   WORD        XMIN            < (A)=ABSCISSE MINIMALE,
         CPR         A,X             < EST-ON EN PREMIERE COLONNE ???
         JE          VISU31          < OUI, ON NE FAIT QU'INITIALISER 'LIGNE'...
         PSR         X,Y             < NON, SAUVEGARDE DES COORDONNEES (X,Y),
                                     < EN FAIT, SEULE 'X' SERA MODIFIEE...
         IF          XXNOIR-K,,XEIF%,
         IF          ATTENTION : LES TESTS DE POINTS NOIRS
         IF          QUI VONT SUIVRE SONT IDIOTS !!!
XEIF%:   VAL         ENDIF
         ADRI        -I,X
         LBY         &ALIGNE         < NIVEAU(X-1,Y),
         JAE         VISU32          < NOIR, ON L'IGNORE...
         AD          FWORK2          < NON NOIR,
         STA         FWORK2          <           ON LE CUMULE,
         ADRI        I,B             < ET ON LE COMPTE...
VISU32:  EQU         $
<
<        NOTA :
<
<                      PAR LA SUITE, ON VA
<                    NOTER 'Y' SOUS LA FORME
<                    'Y-1', EN EFFET, LES POINTS
<                    NON ENCORE MODIFIES DU BUF-
<                    FER 'LIGNE' CONTIENNENT LA
<                    LIGNE PRECEDENTE 'Y-1'...
<
         ADRI        I,X
         LBY         &ALIGNE         < NIVEAU(X,Y-1),
         JAE         VISU34          < NOIR, ON L'IGNORE...
         AD          FWORK2          < NON NOIR,
         STA         FWORK2          <           ON LE CUMULE,
         ADRI        I,B             < ET ON LE COMPTE...
VISU34:  EQU         $
         ADRI        I,X
         LRM         A
WXMAX2:  WORD        XMAX            < (A)=ABSCISSE MAXIMALE,
         SBR         X,A             < EST-ON EN BOUT DE LIGNE ???
         JAL         VISU35          < OUI, ON ARRETE LA...
         LBY         &ALIGNE         < NIVEAU(X+1,Y-1),
         JAE         VISU36          < NOIR, ON L'IGNORE...
         AD          FWORK2          < NON NOIR,
         STA         FWORK2          <           ON LE CUMULE,
         ADRI        I,B             < ET ON LE COMPTE...
VISU36:  EQU         $
VISU35:  EQU         $
         PLR         X,Y             < RESTAURATION DES COORDONNEES (X,Y) DU
                                     < POINT COURANT.
<
< DETERMINATION DU NIVEAU
< MOYEN AU VOISINNAGE DE (X,Y) :
<
         LR          B,A             < (A)=NOMBRE DE VOISINS NON NOIRS REN-
                                     <     CONTRES AUTOUR DU POINT COURANT :
         JAE         VISU50          < IL N'Y EN A PAS, ON VA INITIALISER
                                     < 'LIGNE'...
         BSR         AFLT
         BSR         ASFWOR          < IL Y EN A AU MOINS UN, ET :
                                     < (FWORK)=NOMBRE DE CEUX-CI...
         LA          FWORK2
         BSR         AFLT            < (A,B)=SOMME DES NIVEAUX DE L'ENSEMBLE
                                     <       DES VOISINS RENCONTRES,
         FDV         FWORK           < (A,B)=NIVEAU MOYEN,
         BSR         AROND           < (A)=NIVEAU MOYEN ENTIER...
         LR          A,B             < ET SAUVEGARDE DANS 'B'...
         SB          FWORK1          < NIVEAU MOYEN-NIVEAU(X,Y),
         JAGE        VISU51
         NGR         A,A             < DONT ON PREND LA VALEUR ABSOLUE...
VISU51:  EQU         $
         CP          NSEUIL          < LE NIVEAU CALCULE NIVEAU(X,Y) A-T'IL UNE
                                     < VALEUR PROCHE DE CELLE DE LA MOYENNE DE
                                     < SES VOISINS (EN FONCTION DE 'NSEUIL') ???
         JLE         VISU52          < OUI, NIVEAU(X,Y)='FWORK1' EST ACCEPTE...
         STB         FWORK1          < NON, LE NIVEAU MOYEN REMPLACE NIVEAU(X,Y)
                                     < DANS 'FWORK1'...
QUIT21:  QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
<
< GESTION DE 'LIGNE' :
<
VISU52:  EQU         $
VISU50:  EQU         $
VISU31:  EQU         $
VISU30:  EQU         $
         LA          FWORK1          < (A)=NIVEAU A UTILISER POUR LE TRACE DU
                                     <     POINT (X,Y) ; CE NIVEAU EST DONC
                                     <     SOIT CELUI QUI A ETE CALCULE, SOIT
                                     <     CELUI QUI RESULTE DE L'INTERPOLA-
                                     <     TION ENTRE LES VOISINS,
                                     < (X)=XS,
                                     < (Y)=YS.
         STBY        &ALIGNE         < ET ON MET A JOUR (AVEC LE NIVEAU INTER-
                                     < POLE...), OU BIEN ON INITIALISE (POUR LA
                                     < PREMIERE LIGNE OU LES POINTS SANS VOI-
                                     < SINS)...
<
< TRACE DU POINT :
<
         BSR         ASTORP          < ET TRACE DU POINT (X,Y) AVEC LE
                                     < NIVEAU (A)...
<
< CHANGEMENT DE POINT RASTER COURANT :
<
VISU6:   EQU         $
         PLR         X,Y,W           < RESTAURATIONS...
<
< VALIDATION DU CALCUL FAIT :
<
         LR          X,A             < (X)='X' DE BALAYAGE COURANT,
         AD          TRX             < QUE L'ON TRANSLATE,
         CP          XS              < ET ON VALIDE 'XS' :
         JE          VISU20          < OK...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
VISU20:  EQU         $
         LR          Y,A             < (Y)='Y' DE BALAYAGE COURANT,
         AD          TRY             < QUE L'ON TRANSLATE,
         CP          YS              < ET ON VALIDE 'YS' :
         JE          VISU21          < OK...
         QUIT        XXQUIT          < E R R E U R   P R O G R A M M E ...
VISU21:  EQU         $
<
< BALAYAGE EN HORIZONTAL :
<
         ADRI        I,X             < PROGRESSION DE 'X'.
         LRM         A
WXMAX1:  WORD        XMAX            < (A)=COORDONNEE 'X' MAXIMALE :
         SBR         X,A             < (X,Y) EXISTE-T'IL ???
         JAGE        AVISU1          < OUI...
<
< BALAYAGE VERTICAL :
<
         ADRI        I,Y             < PROGRESSION DE 'Y'.
         LRM         A
WYMAX:   WORD        YMAX            < (A)=COORDONNEE 'Y' MAXIMALE :
         SBR         Y,A             < (X,Y) EXISTE-T'IL ???
         JAGE        AVISU9          < OUI...
<
< FIN DE TRACE :
<
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         LAD         DEMCG
         SVC                         < RETOUR EN ALPHA-NUMERIQUE...
XOPT1:   VAL         ENDIF
<
<
<        E T   B O U C L A G E   E V E N T U E L  :
<
<
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 DU TRACE PAR
                                     <     BALAYAGE...
<
< RELAIS :
<
AVISU1:  EQU         $
         BSR         AGOTO
         WORD        VISU1           < BALAYAGE HORIZONTAL.
AVISU9:  EQU         $
         BSR         AGOTO
         WORD        VISU9           < BALAYAGE VERTICAL.
         PAGE
         CALL        #SIP FONCTION#
         PAGE
<
<
<        A U   C A S   O U ...
<
<
FLOC:   @
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 'FLOC'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
         LOCAL
FLOC:    EQU         $
XEIF%:   VAL         ENDIF
SPU:    @
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 'SPU'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
         PROG
SPU:     EQU         $
         #/FLD#      VARU            < ELEMENT NEUTRE...
         RSR
XEIF%:   VAL         ENDIF
SPV:    @
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 'SPV'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
         PROG
SPV:     EQU         $
         #/FLD#      VARV            < ELEMENT NEUTRE...
         RSR
XEIF%:   VAL         ENDIF
SPW:    @
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 'SPW'...
XWOR%6:  VAL         XWOR%5=FCSIGN
XWOR%7:  VAL         XWOR%5(MSYMBN)MSYMBN=FCSIGN
         IF          XWOR%6*XWOR%7,XEIF%,,XEIF%
         PROG
SPW:     EQU         $
         #/FLD#      F0              < ELEMENT NEUTRE...
         RSR
XEIF%:   VAL         ENDIF
<
<
<        P O U R   L A   C O M P A T I B I L I T E   "   + "  :
<
<
SPX:     EQU         SPU
SPY:     EQU         SPV
SPZ:     EQU         SPW
         PAGE
<
<
<        L I S T E   D E S   P O I N T S   D ' I N T E R S E C T I O N
<        E N T R E   L A   D R O I T E   ' D '   C O U R A N T E
<                    E T   L A   S U R F A C E   ' S '  :
<
<
LPINT:   EQU         $               < CHAQUE ENTREE DONNE :
                                     < LBUF3D : COORDONNEES (FXS,FYS,FZS)
                                     <          DU POINT D'INTERSECTION,
                                     < LVARUV : COORDONNEES CURVILIGNES
                                     <          (VARU,VARV) DE CE POINT SUR LA
                                     <          SURFACE 'S'.
         DZS         LOPINT*NPINT
<
<
<        D O N N E E S   D E   C O H E R E N C E  :
<
<
LIGNE:   EQU         $               < BUFFER DE LIGNE :
         DO          XC512/NOCMO
         BYTE        XXNOIR;XXNOIR
<
<
<        L I S T E   D E S   N O E U D S   P U I S
<        L I S T E   D E S   F A C E T T E S   E T   T A B L E S
<                    D ' I N D E X A T I O N  :
<
<
         IF          XX*YY*LBUF4D,,,XEIF%
         IF          ATTENTION : LA ZONE 'BUF' IMPLANTEE EN TETE DE
         IF          LA 'CDA' EST TROP LONGUE !!!
XEIF%:   VAL         ENDIF
         TABLE
PLIGX:   EQU         $               < LISTE DES XBUF(I,0).
         DZS         IMAX
         TABLE
PLIGM:   EQU         $               < LISTE DES 'J' MAX(I).
         DZS         IMAX
         PAGE
<
<
<        Q U E L Q U E S   P A T C H E S   P R O V I S O I R E S  :
<
<
PATCH:   EQU         $
         $EQU        ISGNFE
         WORD        NEXIST          < NE PAS GENERER LES FACETTES "EXTERNES".
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         $EQU        IWGNFI
         WORD        NEXIST          < NE PAS TRACER LES NORMALES "INTERNES".
         $EQU        IWGFE
         WORD        NEXIST          < NE PAS TRACER LES FACETTES "EXTERNES".
         $EQU        IWPRST
         WORD        NEXIST          < PAS DE TRACER DES POINTS RASTERS.
         $EQU        IWCONV
         WORD        NEXIST          < PAS DE SUIVI DE LA CONVERGENCE.
XOPT1:   VAL         ENDIF
         $EQU        PZ
         FLOAT       1000            < POINT DE VUE SUR L'AXE 'OZ'.
         IF          XOPT01-EXIST,XOPT1,,XOPT1
         $EQU        FACTN
         FLOAT       100             < FACTEUR D'ECHELLE DE LA NORMALE.
XOPT1:   VAL         ENDIF
         $EQU        LTORE+XMINU
         FLOAT       -3.141593       < MIN(U),
         $EQU        LTORE+XMILU
         FLOAT       0               < MIL(U),
         $EQU        LTORE+XMAXU
         FLOAT       3.141593        < MAX(U),
         $EQU        LTORE+XPERU
         FLOAT       6.283185        < PERIOD(U).
         $EQU        LTORE+XMINV
         FLOAT       -1.570796       < MIN(V),
         $EQU        LTORE+XMILV
         FLOAT       0               < MIL(V),
         $EQU        LTORE+XMAXV
         FLOAT       1.570796        < MAX(V),
         $EQU        LTORE+XPERV
         FLOAT       3.141593        < PERIOD(V).
         $EQU        CT+K
XRAYON:: VAL         '50             < RAYON DE LA SPHERE...
         FLOAT       <XRAYON<K<K     < DEFINITION DE LA PREMIERE CONSTANTE.
         $EQU        MTRAN+MT14
         FLOAT       <XC512/XXXMOY<K<K
                                     < POSITIONNEMENT AU MILIEU DE L'ECRAN,
         $EQU        MTRAN+MT24
         FLOAT       <XL512/XXXMOY<K<K
                                     < POSITIONNEMENT AU MILIEU DE L'ECRAN.
         $EQU        QUIT01
         NOP                         < NON-CONVERGENCE : ABS($U) TROP GRAND...
         $EQU        QUIT02
         NOP                         < NON-CONVERGENCE : ABS($V) TROP GRAND...
         $EQU        QUIT31
         NOP                         < NON-CONVERGENCE AU-DELA DE 'MAXCO1'...
         $EQU        QUIT11
         NOP                         < X(U,V) MAUVAISE SOLUTION...
         $EQU        QUIT12
         NOP                         < Y(U,V) MAUVAISE SOLUTION...
         $EQU        QUIT13
         NOP                         < Z(U,V) MAUVAISE SOLUTION...
         $EQU        QUIT41
         NOP                         < UNDERFLOW MAX(ALPHA,BETA,GAMMA)/FREDUC...
         $EQU        QUIT42
         NOP                         < UNDERFLOW MIN(ALPHA,BETA,GAMMA)/FREDUC...
         $EQU        LYMIN
         WORD        XL512/XXXMOY-XRAYON
                                     < 'Y' DE DEPART,
         $EQU        LXMIN
         WORD        XC512/XXXMOY-XRAYON
                                     < 'X' DE DEPART,
         $EQU        WXMAX1
         WORD        XC512/XXXMOY+XRAYON
                                     < 'X' D'ARRIVEE,
         $EQU        WYMAX
         WORD        XL512/XXXMOY+XRAYON
                                     < 'Y' D'ARRIVEE.
         $EQU        WXMIN
         WORD        XC512/XXXMOY-XRAYON
                                     < 'X' MINIMAL DE LA COHERENCE HORIZONTALE,
         $EQU        WYMIN
         WORD        XL512/XXXMOY-XRAYON
                                     < 'Y' MINIMAL DE LA COHERENCE VERTICALE.
         $EQU        QUIT21
         NOP                         < INCOHERENCE DE VOISINNAGE...
         $EQU        WXMAX2
         WORD        XC512/XXXMOY+XRAYON
                                     < 'X' D'ARRIVEE.
         $EQU        LABLAN
DECNIV:: VAL         BIT>2           < PARCE QU'IL MANQUE 2 PLANS MEMOIRE...
         LAI         XXN255-Z-DECNIV < NIVEAU DE GRIS MAXIMAL RECONNU.
         $EQU        ADNOIR
         ADRI        Z+DECNIV,A      < AFIN DE NE PAS AVOIR DE POINTS NOIRS.
<
< FIN DES PATCHES :
<
         $EQU        PATCH
         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-2022.
Copyright © CMAP (Centre de Mathématiques APpliquées) UMR CNRS 7641 / École polytechnique, Institut Polytechnique de Paris, 2022-2022.