$$$$ ZIGZAG * ZIGZAG PROCEDUR JEANV 96/12/03 21:16:42 2411 'DEBP' ZIGZAG; IN1 = FAUX; IDEINI = FAUX; IDEFIN = FAUX; IDIM3 = (VALE DIME) 'EGA' 3; ARGU N1/'ENTIER' POIN0*'POINT' V1*'POINT' V2*'POINT'; V1 = V1 / (NORM V1); V2 = V2 / (NORM V2); SI IDIM3; NOR = V1 PVEC V2; V2 = V1 TOUR 90. (0. 0. 0.) NOR; SINON; NOR = SIGN (((COOR 1 V1)*(COOR 2 V2))-((COOR 1 V2)*(COOR 2 V1))); V2 = V1 TOUR 90. (0. 0.); FINSI; TACT = TABLE; PI180 = PI / 180.; SI (EXISTE N1); IN1 = VRAI; FINSI; * ---------------------------------------------- Lecture des arguments I=0; LGTOT = 0.; LG = PROG; TACT.I = TABLE; TACT.I.'SC' = 0.; REPETER B1; ARGU M1/'MOT' M2/'FLOTTANT'; SI ((EXISTE M1) ET (EXISTE M2)); SI (('EGA' (TYPE M1) 'MOT ') ET ('EGA' (TYPE M2) 'FLOTTANT')); SI (('NEG' M1 'DINI') ET ('NEG' M1 'DFIN') ET ('NEG' M1 'D') ET ('NEG' M1 'S') ET ('NEG' M1 'R') ET ('NEG' M1 'A')); MESS 'ERREUR : On ne comprend pas le mot ' M1; QUITTER ZIGZAG; FINSI; SI ('EGA' M1 'DINI'); IDEINI = VRAI; DEINI = M2; FINSI; SI ('EGA' M1 'DFIN'); IDEFIN = VRAI; DEFIN = M2; FINSI; * -------------------------------------------------- Partie rectiligne SI ('EGA' M1 'D'); I=I+1; M2 = ABS M2; TACT.I = TABLE; TACT.I.'MOT' = 'ZDROI'; TACT.I.'L' = M2; LG = LG ET (PROG M2); LGTOT = LGTOT + M2; TACT.I.'SC' = LGTOT; FINSI; * ------------------------------------------------ Partie courbe : S,R SI ('EGA' M1 'S'); ARGU M3*'MOT' M4*'FLOTTANT'; SI ('EGA' M3 'R'); I=I+1; M4 = ABS M4; TACT.I = TABLE; TACT.I.'MOT' = 'ZCOUR'; TACT.I.'ANGLE' = (M2 / M4) / PI180; TACT.I.'RAYON' = M4; LG = LG ET (PROG (ABS M2)); LGTOT = LGTOT + (ABS M2); TACT.I.'SC' = LGTOT; SI ((ABS (TACT.I.'ANGLE')) > 179.999); MESS 'ERREUR : Angle superieur ou egal a 180 degres'; QUITTER ZIGZAG; FINSI; SINON; MESS 'ERREUR : S FLOT1 doit etre accompagne de R FLOT2'; QUITTER ZIGZAG; FINSI; FINSI; * ------------------------------------------------ Partie courbe : A,R SI ('EGA' M1 'A'); ARGU M3*'MOT' M4*'FLOTTANT'; SI ('EGA' M3 'R'); I=I+1; M4 = ABS M4; TACT.I = TABLE; TACT.I.'MOT' = 'ZCOUR'; TACT.I.'ANGLE' = M2; TACT.I.'RAYON' = M4; LG = LG ET (PROG ((ABS M2)*PI180*M4)); LGTOT = LGTOT + ((ABS M2)*PI180*M4); TACT.I.'SC' = LGTOT; SI ((ABS (TACT.I.'ANGLE')) > 179.999); MESS 'ERREUR : Angle superieur ou egal a 180 degres'; QUITTER ZIGZAG; FINSI; SINON; MESS 'ERREUR : A FLOT1 doit etre accompagne de R FLOT2'; QUITTER ZIGZAG; FINSI; FINSI; * ----------------------------------------- Partie courbe : S,R ou A,R SI ('EGA' M1 'R'); ARGU M3/'MOT' M4/'FLOTTANT'; SI ('EGA' M3 'S'); I=I+1; M2 = ABS M2; TACT.I = TABLE; TACT.I.'MOT' = 'ZCOUR'; TACT.I.'ANGLE' = (M4 / M2) / PI180; TACT.I.'RAYON' = M2; LG = LG ET (PROG (ABS M4)); LGTOT = LGTOT + (ABS M4); TACT.I.'SC' = LGTOT; SI ((ABS (TACT.I.'ANGLE')) > 179.999); MESS 'ERREUR : Angle superieur ou egal a 180 degres'; QUITTER ZIGZAG; FINSI; SINON; SI ('EGA' M3 'A'); I=I+1; M2 = ABS M2; TACT.I = TABLE; TACT.I.'MOT' = 'ZCOUR'; TACT.I.'ANGLE' = M4; TACT.I.'RAYON' = M2; LG = LG ET (PROG ((ABS M4)*PI180*M2)); LGTOT = LGTOT + ((ABS M4)*PI180*M2); TACT.I.'SC' = LGTOT; SI ((ABS (TACT.I.'ANGLE')) > 179.999); MESS 'ERREUR : Angle superieur ou egal a 180 degres'; QUITTER ZIGZAG; FINSI; SINON; MESS 'ERREUR : R FLOT1 doit etre accompagne de S FLOT2 ou A FLOT2'; QUITTER ZIGZAG; FINSI; FINSI; FINSI; FINSI; SINON; QUITTER B1; FINSI; FIN B1; SI (I < 1); QUITTER ZIGZAG; FINSI; SI ((NON IN1) ET (NON IDEINI) ET (NON IDEFIN)); MESS 'ERREUR : Il faut specifier N1 ou (DINI,DFIN).'; QUITTER ZIGZAG; FINSI; SI (IDEINI ET (NON IDEFIN)); IDEFIN = VRAI; DEFIN = DEINI; FINSI; SI ((NON IDEINI) ET IDEFIN); IDEINI = VRAI; DEINI = DEFIN; FINSI; * -------------------------- Choix arbitraire entre N1 et (DINI, DFIN) SI (IN1 et IDEINI); IDEINI = FAUX; IDEFIN = FAUX; FINSI; * ------------------------------------------- Repartition des elements SI IN1; SI (N1 < I); MESS 'ERREUR : Il faut au moins autant d elements que de lignes' ' elementaires.'; QUITTER ZIGZAG; FINSI; D0 = (TACT.I.'SC') / N1; DF = D0; SINON; D0 = DEINI; DF = DEFIN; FINSI; PTE = (DF - D0) / TACT.I.'SC'; * ---------------------------------------- Creation du maillage ZIGZAG PC = POIN0; REPETER B2 I; SI ('EGA' (TACT.&B2.'MOT') 'ZDROI'); PN = PC 'PLUS' ((TACT.&B2.'L')*V1); LIGN = DROIT PC PN 'DINI' (D0+(PTE*TACT.(&B2 - 1).'SC')) 'DFIN' (D0+(PTE*TACT.&B2.'SC')); PC = PN; TACT.&B2.'PF' = PN; FINSI; SI ('EGA' (TACT.&B2.'MOT') 'ZCOUR'); SI IDIM3; PO = PC 'PLUS' ((SIGN (TACT.&B2.'ANGLE'))*V2*(TACT.&B2.'RAYON')); PN = PC TOUR (TACT.&B2.'ANGLE') PO (PO 'PLUS' NOR); V1 = V1 TOUR (TACT.&B2.'ANGLE') (0. 0. 0.) NOR; V2 = V2 TOUR (TACT.&B2.'ANGLE') (0. 0. 0.) NOR; SINON; PO = PC 'PLUS' ((SIGN (TACT.&B2.'ANGLE'))*NOR*V2*(TACT.&B2.'RAYON')); PN = PC TOUR ((TACT.&B2.'ANGLE')*NOR) PO; V1 = V1 TOUR ((TACT.&B2.'ANGLE')*NOR) (0. 0.); V2 = V2 TOUR ((TACT.&B2.'ANGLE')*NOR) (0. 0.); FINSI; LIGN = CERC PC PO PN 'DINI' (D0+(PTE*TACT.(&B2 - 1).'SC')) 'DFIN' (D0+(PTE*TACT.&B2.'SC')); PC = PN; TACT.&B2.'PF' = PN; FINSI; SI ('EGA' &B2 1); GEO1 = LIGN; SINON; GEO1 = GEO1 ET LIGN; FINSI; FIN B2; 'FINP' GEO1; * --------------------------------------------------------------------