1 : C INTPSEG2 SOURCE SH236661 13/11/25 21:15:08 7869 2 : C 3 : SUBROUTINE INTPSEG2(NRA,NRB,NRC,X1,Y1,X2,Y2, 4 : & IINT,XI1,YI1,XI2,YI2) 5 : C----------------------------------------------------------------------C 6 : C Determination de l'intersection entre un segment et C 7 : C un demi plan definit par une droite et un point dans le demi plan C 8 : C C 9 : C NRA, NRB = entiers, numeros des noeuds de la droite (AB) C 10 : C NRC = entier, numero du noeud dans le demi plan C 11 : C X1,Y1 C 12 : C X2,Y2 = coordonnees des points P1 et P2 du segment [P1,P2] C 13 : C l'ordre P1,P2 est important (voir ci dessous) C 14 : C C 15 : C IINT = indicateur sur l'intersection : C 16 : C - IINT = 0 P1P2 est hors du demi plan C 17 : C --> les coordonnees de I1 et I2 sont nulles C 18 : C - IINT = 1 P1P2 intersecte le demi plan C 19 : C --> I1 et I2 sont les points d'intersection C 20 : C XI1,YI1 C 21 : C XI2,YI2 = coordonnees des points du segment d'intersection C 22 : C oriente comme le segment [P1,P2] C 23 : C----------------------------------------------------------------------C 24 : IMPLICIT INTEGER(I-N) 25 : IMPLICIT REAL*8 (A-H,O-Z) 26 : -INC CCOPTIO 27 : -INC SMCOORD 28 : PARAMETER (ZERO=1D-14) 29 : C 30 : SEGACT,MCOORD 31 : IDIMP1=IDIM+1 32 : C Extraction des coordonnees des points A, B 33 : XA=XCOOR((NRA-1)*IDIMP1+1) 34 : YA=XCOOR((NRA-1)*IDIMP1+2) 35 : XB=XCOOR((NRB-1)*IDIMP1+1) 36 : YB=XCOOR((NRB-1)*IDIMP1+2) 37 : C Vecteur normal a la droite AB 38 : XN=(YB-YA) 39 : YN=(XA-XB) 40 : C Signe du produit scalaire n.AC 41 : XC=XCOOR((NRC-1)*IDIMP1+1) 42 : YC=XCOOR((NRC-1)*IDIMP1+2) 43 : PSC=(XN*(XC-XA))+(YN*(YC-YA)) 44 : IF (ABS(PSC).LT.ZERO) THEN 45 : C Demi plan mal definit 45 : CALL ERREUR(363) 46 : ENDIF 47 : SIGC=SIGN(1D0,PSC) 48 : C Signe du produit scalaire n.AP1 49 : PS1=(XN*(X1-XA))+(YN*(Y1-YA)) 50 : SIG1=SIGN(1D0,PS1) 51 : IF (ABS(PS1).LT.ZERO) SIG1=SIGC 52 : C Signe du produit scalaire n.AP2 53 : PS2=(XN*(X2-XA))+(YN*(Y2-YA)) 54 : SIG2=SIGN(1D0,PS2) 55 : IF (ABS(PS2).LT.ZERO) SIG2=SIGC 56 : C Il y a 4 cas possibles 57 : IINT=0 58 : XI1=0D0 59 : YI1=0D0 60 : XI2=0D0 61 : YI2=0D0 62 : C 1) [P1,P2] est hors du demi plan 63 : IF ((SIG1.NE.SIGC).AND.(SIG2.NE.SIGC)) THEN 64 : GOTO 999 65 : ENDIF 66 : C 2) P1 est dans le demi plan et P2 dehors 67 : IF ((SIG1.EQ.SIGC).AND.(SIG2.NE.SIGC)) THEN 68 : IINT=1 69 : XI1=X1 70 : YI1=Y1 71 : GOTO 100 72 : ENDIF 73 : C 3) P2 est dans le demi plan et P1 dehors 74 : IF ((SIG1.NE.SIGC).AND.(SIG2.EQ.SIGC)) THEN 75 : IINT=2 76 : XI2=X2 77 : YI2=Y2 78 : GOTO 100 79 : ENDIF 80 : C 4) [P1,P2] est entierment dans le demi plan 81 : IF ((SIG1.EQ.SIGC).AND.(SIG2.EQ.SIGC)) THEN 82 : IINT=1 83 : XI1=X1 84 : YI1=Y1 85 : XI2=X2 86 : YI2=Y2 87 : GOTO 999 88 : ENDIF 89 : C 90 : 100 CONTINUE 91 : C Calcul de l'intersection du segment (P1,P2) avec la droite (AB) 92 : DET=((X1-X2)*(YB-YA))-((Y1-Y2)*(XB-XA)) 93 : C Si DET>0, il y a intersection entre les droites (AB) et (CD) 94 : IF (ABS(DET).GT.ZERO) THEN 95 : C Coordonnees barycentriques du point d'intersection 96 : ZETA=(((XB-X2)*(YB-YA))-((YB-Y2)*(XB-XA)))/DET 97 : C Coordonnees du point d'intersection 98 : XI=(ZETA*X1)+((1.-ZETA)*X2) 99 : YI=(ZETA*Y1)+((1.-ZETA)*Y2) 100 : ELSE 101 : C Si le determinant est negatif, il n'y a pas d'intersection 102 : C ==> erreur 103 : IINT=0 104 : XI1=0D0 105 : YI1=0D0 106 : XI2=0D0 107 : YI2=0D0 108 : GOTO 999 109 : ENDIF 110 : C Ce point correspond a I1 ou I2 selon la valeur de IINT 111 : IF (IINT.EQ.1) THEN 112 : XI2=XI 113 : YI2=YI 114 : ELSEIF (IINT.EQ.2) THEN 115 : IINT=1 116 : XI1=XI 117 : YI1=YI 118 : ENDIF 119 : C Fin du programme 120 : 999 RETURN 121 : END 122 : 123 :
© Cast3M 2003 - All rights reserved.
Disclaimer