$$$$ @COUPLAN * @COUPLAN PROCEDUR PASCAL 12/10/18 21:15:01 7532 *---------------------------------------------------------------------* * NOM : @COUPLAN * * * * DESCRIPTION : Procedure de maillage d'un agregat cubique de poly- * * * * SYNTAXE : TAB2 TAB3 = @COUPLAN TAB1 P1 P2 P3 (ITRAC1) (IMESS1) ;* * * * - TAB1 = Objet TABLE, resultat de la procedure @P_VORO, conte- * * -nant les points sommets de la partition de Voronoi * * s'appuyant sur les points du maillage donne a l'indi- * * -ce 'MPT' de TAB1. * * * * - P1/P2/P3 = Points du plan de coupe ; * * * * - ITRAC1 = LOGIQUE activant le trace des resultats ; * * * * - IMESS1 = LOGIQUE activant messages (No cellule, Face, etc.) ; * * * * - TAB2/TAB3 = TABLEs resultats contenant les points sommets de la * * partition de Voronoi decrite par TAB1 coupee par le * * Plan defini par P1 P2 P3. * * * * LANGAGE : GIBIANE-CAST3M * * AUTEUR : S. PASCAL (CEA/DEN/DM2S/SEMT/LM2S) * * COURRIEL : serge.pascal@cea.fr * *---------------------------------------------------------------------* * VERSION : v1, 14/09/2009, version initiale * *---------------------------------------------------------------------* 'DEBP' @COUPLAN ; * * *----------------------- Lecture des arguments -----------------------* * * * Lecture de la table : * 'ARGU' TGN6T*'TABLE' ; * * * Coupe de l'agregat selon le Plan P1 P2 P3 : * 'ARGU' P1*'POINT' P2*'POINT' P3*'POINT' ; * * * Lecture facultative d'un indicateur de trace du resultat : * 'ARGU' ITRAC1/'LOGIQUE' ; 'SI' ('NON' ('EXIS' ITRAC1)) ; ITRAC1 = FAUX ; 'FINS' ; * * 'ARGU' IMESS1/'LOGIQUE' ; 'SI' ('NON' ('EXIS' IMESS1)) ; IMESS1 = FAUX ; 'FINS' ; * * * Representation du Plan de coupe pour les traces : * 'SI' ITRAC1 ; P4 = P2 'PLUS' (P3 'MOIN' P1) ; S1 = 'MANU' 'QUA4' P1 P2 P4 P3 ; S1 = S1 'HOMO' ('BARY' S1) 5. ; S1 = S1 'COUL' 'TURQ' ; OEIL1 = 100. * (P2 'MOIN' P1) ; 'FINS' ; * * * Normale au Plan : * PN1 = 'PVEC' (P2 'MOIN' P1) (P3 'MOIN' P1) ; PN1 = PN1 / ('NORM' PN1) ; XN1 YN1 ZN1 = PN1 'COOR' ; XP1 YP1 ZP1 = P1 'COOR' ; * * *----------------------------- Decoupage -----------------------------* * * * Boucle sur les cellules de Voronoi : * MPT1 = TGN6T . 'MPT' ; NBI1 = 'NBNO' MPT1 ; TPCNEG1 = 'TABL' ; TPCPOS1 = 'TABL' ; PCJ0 = PN1 'PLUS' (0. 0. 0.) ; VELE1 = 'VALE' 'ELEM' ; VERR1 = 'VALE' 'ERRE' ; 'REPE' BI1 NBI1 ; 'SI' IMESS1 ; 'SAUT' 1 'LIGN' ; 'MESS' ' ################### Cell ' &BI1 ; 'FINS' ; PCI1 = MPT1 'POIN' &BI1 ; MAVI1 = TGN6T . PCI1 . 'MAV' ; X1 Y1 Z1 = MAVI1 'COOR' ; CHCI1 = (XN1 * (X1 - XP1)) + (YN1 * (Y1 - YP1)) + (ZN1 * (Z1 - ZP1)) ; * Test Si MAVI1 a gauche du Plan : * 'SI' (('MAXI' CHCI1) ' Cellule a gauche ' ; 'FINS' ; MPTI1 = TGN6T . PCI1 . 'MPT' ; NBJ1 = 'NBNO' MPTI1 ; IPREMJ1 = VRAI ; 'REPE' BJ1 NBJ1 ; 'SI' IMESS1 ; 'MESS' ' *** Face : ' &BJ1 ; 'FINS' ; PCJ1 = MPTI1 'POIN' &BJ1 ; 'SI' ('EXIS' TPCNEG1 PCJ1) ; 'SI' IMESS1 ; 'MESS' ' => Cell PCJ' ; 'FINS' ; MAVIJN1 = TPCNEG1 . PCJ1 . PCI1 . 'MAV' ; TPCNEG1 . PCI1 . PCJ1 = TPCNEG1 . PCJ1 . PCI1 ; 'SINO' ; MAVIJ1 = TGN6T . PCI1 . PCJ1 . 'MAV' ; PVK1 = MAVIJ1 'POIN' 1 ; MAVIJN1 = MAVIJ1 'ELEM' 'COMP' PVK1 PVK1 ; TPCNEG1 . PCI1 . PCJ1 = TGN6T . PCI1 . PCJ1 ; 'FINS' ; 'SI' IPREMJ1 ; IPREMJ1 = FAUX ; TPCNEG1 . PCI1 . 'MPT' = 'MANU' 'POI1' PCJ1 ; TPCNEG1 . PCI1 . 'MAV' = MAVIJN1 ; 'SINO' ; TPCNEG1 . PCI1 . 'MPT' = TPCNEG1 . PCI1 . 'MPT' 'ET' PCJ1 ; TPCNEG1 . PCI1 . 'MAV' = TPCNEG1 . PCI1 . 'MAV' 'ET' MAVIJN1 ; 'FINS' ; 'FIN' BJ1 ; 'SI' ('EXIS' TPCNEG1 'MPT') ; TPCNEG1 . 'MPT' = TPCNEG1 . 'MPT' 'ET' PCI1 ; TPCNEG1 . 'MAV' = TPCNEG1 . 'MAV' 'ET' TPCNEG1 . PCI1 . 'MAV' ; 'SINO' ; TPCNEG1 . 'MPT' = 'MANU' 'POI1' PCI1 ; TPCNEG1 . 'MAV' = TPCNEG1 . PCI1 . 'MAV' ; 'FINS' ; 'ITER' BI1 ; 'FINS' ; * * * Test Si MAVI1 a droite du Plan : * 'SI' (('MINI' CHCI1) '>EG' 0.) ; TPCPOS1 . PCI1 = 'TABL' ; 'SI' IMESS1 ; 'MESS' ' ==> Cellule a droite ' ; 'FINS' ; MPTI1 = TGN6T . PCI1 . 'MPT' ; NBJ1 = 'NBNO' MPTI1 ; IPREMJ1 = VRAI ; 'REPE' BJ1 NBJ1 ; 'SI' IMESS1 ; 'MESS' ' *** Face : ' &BJ1 ; 'FINS' ; PCJ1 = MPTI1 'POIN' &BJ1 ; 'SI' ('EXIS' TPCPOS1 PCJ1) ; 'SI' IMESS1 ; 'MESS' ' => Cell PCJ' ; 'FINS' ; MAVIJP1 = TPCPOS1 . PCJ1 . PCI1 . 'MAV' ; TPCPOS1 . PCI1 . PCJ1 = TPCPOS1 . PCJ1 . PCI1 ; 'SINO' ; MAVIJ1 = TGN6T . PCI1 . PCJ1 . 'MAV' ; PVK1 = MAVIJ1 'POIN' 1 ; MAVIJP1 = MAVIJ1 'ELEM' 'COMP' PVK1 PVK1 ; TPCPOS1 . PCI1 . PCJ1 = TGN6T . PCI1 . PCJ1 ; 'FINS' ; 'SI' IPREMJ1 ; IPREMJ1 = FAUX ; TPCPOS1 . PCI1 . 'MPT' = 'MANU' 'POI1' PCJ1 ; TPCPOS1 . PCI1 . 'MAV' = MAVIJP1 ; 'SINO' ; TPCPOS1 . PCI1 . 'MPT' = TPCPOS1 . PCI1 . 'MPT' 'ET' PCJ1 ; TPCPOS1 . PCI1 . 'MAV' = TPCPOS1 . PCI1 . 'MAV' 'ET' MAVIJP1 ; 'FINS' ; 'FIN' BJ1 ; 'SI' ('EXIS' TPCPOS1 'MPT') ; TPCPOS1 . 'MPT' = TPCPOS1 . 'MPT' 'ET' PCI1 ; TPCPOS1 . 'MAV' = TPCPOS1 . 'MAV' 'ET' TPCPOS1 . PCI1 . 'MAV' ; 'SINO' ; TPCPOS1 . 'MPT' = 'MANU' 'POI1' PCI1 ; TPCPOS1 . 'MAV' = TPCPOS1 . PCI1 . 'MAV' ; 'FINS' ; 'ITER' BI1 ; 'FINS' ; * * On est Dans le cas Ou la cellule coupe le Plan : * TPCNEG1 . PCI1 = 'TABL' ; TPCPOS1 . PCI1 = 'TABL' ; TPCNEG1 . PCI1 . PCJ0 = 'TABL' ; TPCPOS1 . PCI1 . PCJ0 = 'TABL' ; * Boucle sur les Faces * MPTI1 = TGN6T . PCI1 . 'MPT' ; NBJ1 = 'NBNO' MPTI1 ; IPREMJ1 = VRAI ; 'REPE' BJ1 NBJ1 ; 'SI' IMESS1 ; 'MESS' ' *** Face : ' &BJ1 ; 'FINS' ; PCJ1 = MPTI1 'POIN' &BJ1 ; MAVIJ1 = TGN6T . PCI1 . PCJ1 . 'MAV' ; X1 Y1 Z1 = MAVIJ1 'COOR' ; CHCIJ1 = (XN1 * (X1 - XP1)) + (YN1 * (Y1 - YP1)) + (ZN1 * (Z1 - ZP1)) ; * Test Si MAVIJ1 est Dans le Plan : * 'SI' ((('MAXI' CHCIJ1) 'EGA' 0.) 'ET' (('MINI' CHCIJ1) 'EGA' 0.)) ; 'MESS' ' ****** Face Dans le Plan de coupe !!! ' ; 'QUIT' @COUPLAN ; 'FINS' ; * Test Si MAVIJ1 est a gauche du Plan : * 'SI' (('MAXI' CHCIJ1) '<' 0.) ; 'SI' IMESS1 ; 'MESS' ' => Face a gauche' ; 'FINS' ; 'SI' ('EXIS' TPCNEG1 PCJ1) ; 'SI' IMESS1 ; 'MESS' ' => Cell PCJ' ; 'FINS' ; MAVIJN1 = TPCNEG1 . PCJ1 . PCI1 . 'MAV' ; TPCNEG1 . PCI1 . PCJ1 = TPCNEG1 . PCJ1 . PCI1 ; 'SINO' ; PVK1 = MAVIJ1 'POIN' 1 ; MAVIJN1 = MAVIJ1 'ELEM' 'COMP' PVK1 PVK1 ; TPCNEG1 . PCI1 . PCJ1 = TGN6T . PCI1 . PCJ1 ; 'FINS' ; 'SI' ('EXIS' TPCNEG1 . PCI1 'MPT') ; TPCNEG1 . PCI1 . 'MPT' = TPCNEG1 . PCI1 . 'MPT' 'ET' PCJ1 ; TPCNEG1 . PCI1 . 'MAV' = TPCNEG1 . PCI1 . 'MAV' 'ET' MAVIJN1 ; 'SINO' ; TPCNEG1 . PCI1 . 'MPT' = 'MANU' 'POI1' PCJ1 ; TPCNEG1 . PCI1 . 'MAV' = MAVIJN1 ; 'FINS' ; 'ITER' BJ1 ; 'FINS' ; * Test Si MAVIJ1 est a droite du Plan : * 'SI' (('MINI' CHCIJ1) '>' 0.) ; 'SI' IMESS1 ; 'MESS' ' => Face a droite' ; 'FINS' ; 'SI' ('EXIS' TPCPOS1 PCJ1) ; 'SI' IMESS1 ; 'MESS' ' => Cell PCJ' ; 'FINS' ; MAVIJP1 = TPCPOS1 . PCJ1 . PCI1 . 'MAV' ; TPCPOS1 . PCI1 . PCJ1 = TPCPOS1 . PCJ1 . PCI1 ; 'SINO' ; MAVIJ1 = TGN6T . PCI1 . PCJ1 . 'MAV' ; PVK1 = MAVIJ1 'POIN' 1 ; MAVIJP1 = MAVIJ1 'ELEM' 'COMP' PVK1 PVK1 ; TPCPOS1 . PCI1 . PCJ1 = TGN6T . PCI1 . PCJ1 ; 'FINS' ; 'SI' ('EXIS' TPCPOS1 . PCI1 'MPT') ; TPCPOS1 . PCI1 . 'MPT' = TPCPOS1 . PCI1 . 'MPT' 'ET' PCJ1 ; TPCPOS1 . PCI1 . 'MAV' = TPCPOS1 . PCI1 . 'MAV' 'ET' MAVIJP1 ; 'SINO' ; TPCPOS1 . PCI1 . 'MPT' = 'MANU' 'POI1' PCJ1 ; TPCPOS1 . PCI1 . 'MAV' = MAVIJP1 ; 'FINS' ; 'ITER' BJ1 ; 'FINS' ; * * * On est Dans le cas Ou la Face coupe le Plan : * * Test Si cellule PCJ1 deja coupee : * 'SI' ('EXIS' TPCNEG1 PCJ1) ; 'SI' ('NON' ('EXIS' TPCPOS1 PCJ1)) ; 'MESS' ' ****** Cell PCJ Existe Dans TPCNEG1 Et pas Dans TPCPOS1 ?' ; 'QUIT' BI1 ; 'FINS' ; 'SI' IMESS1 ; 'MESS' ' => Face coupe le plan' ; 'MESS' ' => Cell PCJ' ; 'FINS' ; * Arete Intersection : MAVIJK0 : * MAVIJN1 = TPCNEG1 . PCJ1 . PCI1 . 'MAV' ; MAVIJP1 = TPCPOS1 . PCJ1 . PCI1 . 'MAV' ; MAVIJK0 = MAVIJN1 'INTE' MAVIJP1 ; * Face relative a PCJ0 : * TPCNEG1 . PCI1 . PCJ0 . PCJ1 = 'TABL' ; TPCPOS1 . PCI1 . PCJ0 . PCJ1 = 'TABL' ; TPCNEG1 . PCI1 . PCJ0 . PCJ1 . 'MAV' = MAVIJK0 ; TPCPOS1 . PCI1 . PCJ0 . PCJ1 . 'MAV' = MAVIJK0 ; 'SI' IPREMJ1 ; IPREMJ1 = FAUX ; MAVIJ0 = MAVIJK0 ; TPCNEG1 . PCI1 . PCJ0 . 'MPT' = 'MANU' 'POI1' PCJ1 ; TPCPOS1 . PCI1 . PCJ0 . 'MPT' = 'MANU' 'POI1' PCJ1 ; 'SINO' ; MAVIJ0 = MAVIJ0 'ET' MAVIJK0 ; TPCNEG1 . PCI1 . PCJ0 . 'MPT' = TPCNEG1 . PCI1 . PCJ0 . 'MPT' 'ET' PCJ1 ; TPCPOS1 . PCI1 . PCJ0 . 'MPT' = TPCPOS1 . PCI1 . PCJ0 . 'MPT' 'ET' PCJ1 ; 'FINS' ; * Face relative a PCJ1 : * TPCNEG1 . PCI1 . PCJ1 = TPCNEG1 . PCJ1 . PCI1 ; TPCPOS1 . PCI1 . PCJ1 = TPCPOS1 . PCJ1 . PCI1 ; * Cellule PCI1 : * 'SI' ('EXIS' TPCNEG1 . PCI1 'MPT') ; TPCNEG1 . PCI1 . 'MPT' = TPCNEG1 . PCI1 . 'MPT' 'ET' PCJ1 ; TPCNEG1 . PCI1 . 'MAV' = TPCNEG1 . PCI1 . 'MAV' 'ET' MAVIJN1 ; 'SINO' ; TPCNEG1 . PCI1 . 'MPT' = 'MANU' 'POI1' PCJ1 ; TPCNEG1 . PCI1 . 'MAV' = MAVIJN1 ; 'FINS' ; 'SI' ('EXIS' TPCPOS1 . PCI1 'MPT') ; TPCPOS1 . PCI1 . 'MPT' = TPCPOS1 . PCI1 . 'MPT' 'ET' PCJ1 ; TPCPOS1 . PCI1 . 'MAV' = TPCPOS1 . PCI1 . 'MAV' 'ET' MAVIJP1 ; 'SINO' ; TPCPOS1 . PCI1 . 'MPT' = 'MANU' 'POI1' PCJ1 ; TPCPOS1 . PCI1 . 'MAV' = MAVIJP1 ; 'FINS' ; 'ITER' BJ1 ; 'SINO' ; 'SI' ('EXIS' TPCPOS1 PCJ1) ; 'MESS' ' ****** Cell PCJ Existe Dans TPCPOS1 Et pas Dans TPCNEG1 ?' ; 'QUIT' BI1 ; 'FINS' ; 'FINS' ; * * * Boucle sur les aretes : * * * *------------------------------ VERRUE -------------------------------* * TGN6T . PCI1 . PCJ1 ne contient pas l'indice 'MPT' : on le cree * * en attente evolution @P_VORO... * 'SI' ('NON' ('EXIS' TGN6T . PCI1 . PCJ1 'MPT')) ; TINDIJ1 = 'INDE' (TGN6T . PCI1 . PCJ1) ; IPREMX1 = VRAI ; 'REPE' BX0 ('DIME' TINDIJ1) ; INDX0 = TINDIJ1 . &BX0 ; 'SI' ('EGA' ('TYPE' INDX0) 'POINT') ; 'SI' IPREMX1 ; IPREMX1 = FAUX ; TGN6T . PCI1 . PCJ1 . 'MPT' = INDX0 ; 'SINO' ; TGN6T . PCI1 . PCJ1 . 'MPT' = TGN6T . PCI1 . PCJ1 . 'MPT' 'ET' INDX0 ; 'FINS' ; 'FINS' ; 'FIN' BX0 ; 'FINS' ; *---------------------------------------------------------------------* * * 'SI' IMESS1 ; 'MESS' ' => Face coupe le plan' ; 'FINS' ; MPTIJ1 = TGN6T . PCI1 . PCJ1 . 'MPT' ; NBK1 = 'NBNO' MPTIJ1 ; TPCNEG1 . PCI1 . PCJ1 = 'TABL' ; TPCPOS1 . PCI1 . PCJ1 = 'TABL' ; IPREMK1 = VRAI ; 'REPE' BK1 NBK1 ; PCK1 = MPTIJ1 'POIN' &BK1 ; MAVIJK1 = TGN6T . PCI1 . PCJ1 . PCK1 . 'MAV' ; 'SI' ((MAVIJK1 'POIN' 1) 'EGA' (MAVIJK1 'POIN' 2)) ; 'ITER' BK1 ; 'FINS' ; X1 Y1 Z1 = MAVIJK1 'COOR' ; CHCIJK1 = (XN1 * (X1 - XP1)) + (YN1 * (Y1 - YP1)) + (ZN1 * (Z1 - ZP1)) ; * Test Si MAVIJK1 est a gauche du Plan : * 'SI' (('MAXI' CHCIJK1) '<' 0.) ; 'SI' IMESS1 ; 'MESS' ' => Arete a gauche ' ; 'FINS' ; TPCNEG1 . PCI1 . PCJ1 . PCK1 = TGN6T . PCI1 . PCJ1 . PCK1 ; 'SI' ('EXIS' TPCNEG1 . PCI1 . PCJ1 'MAV') ; TPCNEG1 . PCI1 . PCJ1 . 'MAV' = TPCNEG1 . PCI1 . PCJ1 . 'MAV' 'ET' MAVIJK1 ; TPCNEG1 . PCI1 . PCJ1 . 'MPT' = TPCNEG1 . PCI1 . PCJ1 . 'MPT' 'ET' PCK1 ; 'SINO' ; TPCNEG1 . PCI1 . PCJ1 . 'MAV' = MAVIJK1 ; TPCNEG1 . PCI1 . PCJ1 . 'MPT' = 'MANU' 'POI1' PCK1 ; 'FINS' ; 'ITER' BK1 ; 'FINS' ; * Test Si MAVIJK1 est a droite du Plan : * 'SI' (('MINI' CHCIJK1) '>' 0.) ; 'SI' IMESS1 ; 'MESS' ' => Arete a droite ' ; 'FINS' ; TPCPOS1 . PCI1 . PCJ1 . PCK1 = TGN6T . PCI1 . PCJ1 . PCK1 ; 'SI' ('EXIS' TPCPOS1 . PCI1 . PCJ1 'MAV') ; TPCPOS1 . PCI1 . PCJ1 . 'MAV' = TPCPOS1 . PCI1 . PCJ1 . 'MAV' 'ET' MAVIJK1 ; TPCPOS1 . PCI1 . PCJ1 . 'MPT' = TPCPOS1 . PCI1 . PCJ1 . 'MPT' 'ET' PCK1 ; 'SINO' ; TPCPOS1 . PCI1 . PCJ1 . 'MAV' = MAVIJK1 ; TPCPOS1 . PCI1 . PCJ1 . 'MPT' = 'MANU' 'POI1' PCK1 ; 'FINS' ; 'ITER' BK1 ; 'FINS' ; * * * On est Dans le cas Ou l'Arete coupe le Plan : * * * * Test Si cellule PCK1 deja coupee : * 'SI' ('EXIS' TPCNEG1 PCK1) ; 'SI' ('NON' ('EXIS' TPCPOS1 PCK1)) ; 'MESS' ' ****** Cell PCK Existe Dans TPCNEG1 Et pas Dans TPCPOS1 ?' ; 'QUIT' BI1 ; 'FINS' ; 'SI' IMESS1 ; 'MESS' ' => Cell PCK ' ; 'FINS' ; * Arete PCI1-PCJ1-PCK1 : * MAVKIJN1 = TPCNEG1 . PCK1 . PCI1 . PCJ1 . 'MAV' ; MAVKIJP1 = TPCPOS1 . PCK1 . PCI1 . PCJ1 . 'MAV' ; TPCNEG1 . PCI1 . PCJ1 . PCK1 = TPCNEG1 . PCK1 . PCI1 . PCJ1 ; TPCPOS1 . PCI1 . PCJ1 . PCK1 = TPCPOS1 . PCK1 . PCI1 . PCJ1 ; * Point intersection PVK0 : * PVK0 = 'INTE' ('CHAN' 'POI1' MAVKIJN1) ('CHAN' 'POI1' MAVKIJP1) ; PVK0 = PVK0 'POIN' 1 ; 'SI' IPREMK1 ; IPREMK1 = FAUX ; PVKI1 = PVK0 ; 'SI' IMESS1 ; 'MESS' ' Et de 1' ; 'FINS' ; 'SINO' ; PVKI2 = PVK0 ; 'SI' IMESS1 ; 'MESS' ' Et de 2' ; 'FINS' ; 'FINS' ; * Face relative a PCJ1 : * 'SI' ('EXIS' TPCNEG1 . PCI1 . PCJ1 'MAV') ; TPCNEG1 . PCI1 . PCJ1 . 'MAV' = TPCNEG1 . PCI1 . PCJ1 . 'MAV' 'ET' MAVKIJN1 ; TPCNEG1 . PCI1 . PCJ1 . 'MPT' = TPCNEG1 . PCI1 . PCJ1 . 'MPT' 'ET' PCK1 ; 'SINO' ; TPCNEG1 . PCI1 . PCJ1 . 'MAV' = MAVKIJN1 ; TPCNEG1 . PCI1 . PCJ1 . 'MPT' = 'MANU' 'POI1' PCK1 ; 'FINS' ; 'SI' ('EXIS' TPCPOS1 . PCI1 . PCJ1 'MAV') ; TPCPOS1 . PCI1 . PCJ1 . 'MAV' = TPCPOS1 . PCI1 . PCJ1 . 'MAV' 'ET' MAVKIJP1 ; TPCPOS1 . PCI1 . PCJ1 . 'MPT' = TPCPOS1 . PCI1 . PCJ1 . 'MPT' 'ET' PCK1 ; 'SINO' ; TPCPOS1 . PCI1 . PCJ1 . 'MAV' = MAVKIJP1 ; TPCPOS1 . PCI1 . PCJ1 . 'MPT' = 'MANU' 'POI1' PCK1 ; 'FINS' ; * Arete suivante : * 'ITER' BK1 ; 'SINO' ; 'SI' ('EXIS' TPCPOS1 PCK1) ; 'MESS' ' ****** Cell PCK Existe Dans TPCPOS1 Et pas Dans TPCNEG1 ?' ; 'QUIT' BI1 ; 'FINS' ; 'FINS' ; * * * Test Si Face PCI1-PCK1 deja coupee : * 'SI' ('EXIS' TPCNEG1 . PCI1 PCK1) ; 'SI' ( 'NON' ('EXIS' TPCPOS1 . PCI1 PCK1)) ; 'MESS' ' ****** Face PCI-PCK Dans TPCNEG1 mais pas Dans TPCPOS1 ?' ; 'QUIT' BI1 ; 'FINS' ; 'SI' IMESS1 ; 'MESS' ' => Face PCI-PCK ' ; 'FINS' ; * Arete PCI1-PCJ1-PCK1 : * MAVIKJN1 = TPCNEG1 . PCI1 . PCK1 . PCJ1 . 'MAV' ; MAVIKJP1 = TPCPOS1 . PCI1 . PCK1 . PCJ1 . 'MAV' ; TPCNEG1 . PCI1 . PCJ1 . PCK1 = TPCNEG1 . PCI1 . PCK1 . PCJ1 ; TPCPOS1 . PCI1 . PCJ1 . PCK1 = TPCPOS1 . PCI1 . PCK1 . PCJ1 ; * Point intersection PVK0 : * PVK0 = 'INTE' ('CHAN' 'POI1' MAVIKJN1) ('CHAN' 'POI1' MAVIKJP1) ; PVK0 = PVK0 'POIN' 1 ; 'SI' IPREMK1 ; IPREMK1 = FAUX ; PVKI1 = PVK0 ; 'SI' IMESS1 ; 'MESS' ' Et de 1' ; 'FINS' ; 'SINO' ; PVKI2 = PVK0 ; 'SI' IMESS1 ; 'MESS' ' Et de 2' ; 'FINS' ; 'FINS' ; * Face relative a PCJ1 : * 'SI' ('EXIS' TPCNEG1 . PCI1 . PCJ1 'MAV') ; TPCNEG1 . PCI1 . PCJ1 . 'MAV' = TPCNEG1 . PCI1 . PCJ1 . 'MAV' 'ET' MAVIKJN1 ; TPCNEG1 . PCI1 . PCJ1 . 'MPT' = TPCNEG1 . PCI1 . PCJ1 . 'MPT' 'ET' PCK1 ; 'SINO' ; TPCNEG1 . PCI1 . PCJ1 . 'MAV' = MAVIKJN1 ; TPCNEG1 . PCI1 . PCJ1 . 'MPT' = 'MANU' 'POI1' PCK1 ; 'FINS' ; 'SI' ('EXIS' TPCPOS1 . PCI1 . PCJ1 'MAV') ; TPCPOS1 . PCI1 . PCJ1 . 'MAV' = TPCPOS1 . PCI1 . PCJ1 . 'MAV' 'ET' MAVIKJP1 ; TPCPOS1 . PCI1 . PCJ1 . 'MPT' = TPCPOS1 . PCI1 . PCJ1 . 'MPT' 'ET' PCK1 ; 'SINO' ; TPCPOS1 . PCI1 . PCJ1 . 'MAV' = MAVIKJP1 ; TPCPOS1 . PCI1 . PCJ1 . 'MPT' = 'MANU' 'POI1' PCK1 ; 'FINS' ; * Arete suivante : * 'ITER' BK1 ; 'SINO' ; 'SI' ('EXIS' TPCPOS1 . PCI1 PCK1) ; 'MESS' ' ****** Face PCI-PCK Dans TPCPOS1 mais pas Dans TPCNEG1 ?' ; 'QUIT' BI1 ; 'FINS' ; 'FINS' ; * Sinon : calcul intersection : * 'SI' IMESS1 ; 'MESS' ' => Calcul intersection' ; 'FINS' ; TPCNEG1 . PCI1 . PCJ1 . PCK1 = 'TABL' ; TPCPOS1 . PCI1 . PCJ1 . PCK1 = 'TABL' ; PVK1 = MAVIJK1 'POIN' 1 ; PVK2 = MAVIJK1 'POIN' 2 ; XCK1 = 'PSCA' PN1 (PVK1 'MOIN' P1) ; XCK2 = 'PSCA' PN1 (PVK2 'MOIN' P1) ; 'SI' ((XCK1 * XCK2) '>EG' 0.) ; 'MESS' ' ****** Pb. : PAS d intersection ?' ; 'QUIT' BI1 ; 'FINS' ; XBARY1 = XCK2 / (XCK2 - XCK1) ; PVK0 = (XBARY1 * PVK1) 'PLUS' ((1. - XBARY1) * PVK2) ; 'SI' (XCK1 '>'0.) ; MAVIJKN1 = PVK0 'DROI' 1 PVK2 ; MAVIJKP1 = PVK1 'DROI' 1 PVK0 ; 'SINO' ; MAVIJKP1 = PVK0 'DROI' 1 PVK2 ; MAVIJKN1 = PVK1 'DROI' 1 PVK0 ; 'FINS' ; TPCNEG1 . PCI1 . PCJ1 . PCK1 . 'MAV' = MAVIJKN1 ; TPCPOS1 . PCI1 . PCJ1 . PCK1 . 'MAV' = MAVIJKP1 ; * Face relative a PCJ1 : * 'SI' ('EXIS' TPCNEG1 . PCI1 . PCJ1 'MAV') ; TPCNEG1 . PCI1 . PCJ1 . 'MAV' = TPCNEG1 . PCI1 . PCJ1 . 'MAV' 'ET' MAVIJKN1 ; TPCNEG1 . PCI1 . PCJ1 . 'MPT' = TPCNEG1 . PCI1 . PCJ1 . 'MPT' 'ET' PCK1 ; 'SINO' ; TPCNEG1 . PCI1 . PCJ1 . 'MAV' = MAVIJKN1 ; TPCNEG1 . PCI1 . PCJ1 . 'MPT' = 'MANU' 'POI1' PCK1 ; 'FINS' ; 'SI' ('EXIS' TPCPOS1 . PCI1 . PCJ1 'MAV') ; TPCPOS1 . PCI1 . PCJ1 . 'MAV' = TPCPOS1 . PCI1 . PCJ1 . 'MAV' 'ET' MAVIJKP1 ; TPCPOS1 . PCI1 . PCJ1 . 'MPT' = TPCPOS1 . PCI1 . PCJ1 . 'MPT' 'ET' PCK1 ; 'SINO' ; TPCPOS1 . PCI1 . PCJ1 . 'MAV' = MAVIJKP1 ; TPCPOS1 . PCI1 . PCJ1 . 'MPT' = 'MANU' 'POI1' PCK1 ; 'FINS' ; 'SI' IPREMK1 ; IPREMK1 = FAUX ; PVKI1 = PVK0 ; 'SI' IMESS1 ; 'MESS' ' Et de 1' ; 'FINS' ; 'SINO' ; PVKI2 = PVK0 ; 'SI' IMESS1 ; 'MESS' ' Et de 2' ; 'FINS' ; 'FINS' ; 'FIN' BK1 ; * * * Construction segment intersection Face avec le Plan : * MAVIJK0 = PVKI1 'DROI' 1 PVKI2 ; * Face relative a PCJ0 : * TPCNEG1 . PCI1 . PCJ0 . PCJ1 = 'TABL' ; TPCPOS1 . PCI1 . PCJ0 . PCJ1 = 'TABL' ; TPCNEG1 . PCI1 . PCJ0 . PCJ1 . 'MAV' = MAVIJK0 ; TPCPOS1 . PCI1 . PCJ0 . PCJ1 . 'MAV' = MAVIJK0 ; 'SI' IPREMJ1 ; IPREMJ1 = FAUX ; MAVIJ0 = MAVIJK0 ; TPCNEG1 . PCI1 . PCJ0 . 'MPT' = 'MANU' 'POI1' PCJ1 ; TPCPOS1 . PCI1 . PCJ0 . 'MPT' = 'MANU' 'POI1' PCJ1 ; 'SINO' ; MAVIJ0 = MAVIJ0 'ET' MAVIJK0 ; TPCNEG1 . PCI1 . PCJ0 . 'MPT' = TPCNEG1 . PCI1 . PCJ0 . 'MPT' 'ET' PCJ1 ; TPCPOS1 . PCI1 . PCJ0 . 'MPT' = TPCPOS1 . PCI1 . PCJ0 . 'MPT' 'ET' PCJ1 ; 'FINS' ; * Face relative a PCJ1 : * * Partie NEG : * TPCNEG1 . PCI1 . PCJ1 . PCJ0 = 'TABL' ; TPCNEG1 . PCI1 . PCJ1 . PCJ0 . 'MAV' = MAVIJK0 ; MAVIJN1 = TPCNEG1 . PCI1 . PCJ1 . 'MAV' 'ET' ('INVE' MAVIJK0) ; PVK1 = MAVIJN1 'POIN' 1 ; MAVIJN1 = MAVIJN1 'ELEM' 'COMP' PVK1 PVK1 ; TPCNEG1 . PCI1 . PCJ1 . 'MAV' = MAVIJN1 ; TPCNEG1 . PCI1 . PCJ1 . 'MPT' = TPCNEG1 . PCI1 . PCJ1 . 'MPT' 'ET' PCJ0 ; * Partie POS : * TPCPOS1 . PCI1 . PCJ1 . PCJ0 = 'TABL' ; TPCPOS1 . PCI1 . PCJ1 . PCJ0 . 'MAV' = MAVIJK0 ; MAVIJP1 = TPCPOS1 . PCI1 . PCJ1 . 'MAV' 'ET' MAVIJK0 ; PVK1 = MAVIJP1 'POIN' 1 ; MAVIJP1 = MAVIJP1 'ELEM' 'COMP' PVK1 PVK1 ; TPCPOS1 . PCI1 . PCJ1 . 'MAV' = MAVIJP1 ; TPCPOS1 . PCI1 . PCJ1 . 'MPT' = TPCPOS1 . PCI1 . PCJ1 . 'MPT' 'ET' PCJ0 ; * Cellule PCI1 : * 'SI' ('EXIS' TPCNEG1 . PCI1 'MPT') ; TPCNEG1 . PCI1 . 'MPT' = TPCNEG1 . PCI1 . 'MPT' 'ET' PCJ1 ; TPCNEG1 . PCI1 . 'MAV' = TPCNEG1 . PCI1 . 'MAV' 'ET' MAVIJN1 ; 'SINO' ; TPCNEG1 . PCI1 . 'MPT' = 'MANU' 'POI1' PCJ1 ; TPCNEG1 . PCI1 . 'MAV' = MAVIJN1 ; 'FINS' ; 'SI' ('EXIS' TPCPOS1 . PCI1 'MPT') ; TPCPOS1 . PCI1 . 'MPT' = TPCPOS1 . PCI1 . 'MPT' 'ET' PCJ1 ; TPCPOS1 . PCI1 . 'MAV' = TPCPOS1 . PCI1 . 'MAV' 'ET' MAVIJP1 ; 'SINO' ; TPCPOS1 . PCI1 . 'MPT' = 'MANU' 'POI1' PCJ1 ; TPCPOS1 . PCI1 . 'MAV' = MAVIJP1 ; 'FINS' ; 'FIN' BJ1 ; * * 'SI' IMESS1 ; 'MESS' ' *** Fin Face' ; 'FINS' ; * * * Face relative a PCJ0 : * PVK1 = MAVIJ0 'POIN' 1 ; MAVIJ0 = MAVIJ0 'ELEM' 'COMP' PVK1 PVK1 ; TPCNEG1 . PCI1 . PCJ0 . 'MAV' = MAVIJ0 ; TPCPOS1 . PCI1 . PCJ0 . 'MAV' = MAVIJ0 ; * * * Cellule PCI1 : * * Partie NEG : * TPCNEG1 . PCI1 . 'MAV' = TPCNEG1 . PCI1 . 'MAV' 'ET' MAVIJ0 ; TPCNEG1 . PCI1 . 'MPT' = TPCNEG1 . PCI1 . 'MPT' 'ET' PCJ0 ; * Partie POS : * TPCPOS1 . PCI1 . 'MAV' = TPCPOS1 . PCI1 . 'MAV' 'ET' MAVIJ0 ; TPCPOS1 . PCI1 . 'MPT' = TPCPOS1 . PCI1 . 'MPT' 'ET' PCJ0 ; * * * Pts. Ref. de toutes les cellules : * 'SI' ('EXIS' TPCNEG1 'MPT') ; TPCNEG1 . 'MPT' = TPCNEG1 . 'MPT' 'ET' PCI1 ; TPCNEG1 . 'MAV' = TPCNEG1 . 'MAV' 'ET' TPCNEG1 . PCI1 . 'MAV' ; 'SINO' ; TPCNEG1 . 'MPT' = 'MANU' 'POI1' PCI1 ; TPCNEG1 . 'MAV' = TPCNEG1 . PCI1 . 'MAV' ; 'FINS' ; 'SI' ('EXIS' TPCPOS1 'MPT') ; TPCPOS1 . 'MPT' = TPCPOS1 . 'MPT' 'ET' PCI1 ; TPCPOS1 . 'MAV' = TPCPOS1 . 'MAV' 'ET' TPCPOS1 . PCI1 . 'MAV' ; 'SINO' ; TPCPOS1 . 'MPT' = 'MANU' 'POI1' PCI1 ; TPCPOS1 . 'MAV' = TPCPOS1 . PCI1 . 'MAV' ; 'FINS' ; 'FIN' BI1 ; * * 'SI' ITRAC1 ; 'TITR' ' Partie Gauche' ; 'TRAC' OEIL1 (S1 'ET' TPCNEG1 . 'MAV') ; 'TITR' ' Partie droite' ; 'TRAC' OEIL1 (S1 'ET' TPCPOS1 . 'MAV') ; 'FINS' ; * * 'RESP' TPCNEG1 TPCPOS1 ; * * 'FINP' ; *---------------------------------------------------------------------* * FIN PROCEDURE @COUPLAN * $$$$