C INTPSEG2 SOURCE SH236661 13/11/25 21:15:08 7869 C SUBROUTINE INTPSEG2(NRA,NRB,NRC,X1,Y1,X2,Y2, & IINT,XI1,YI1,XI2,YI2) C----------------------------------------------------------------------C C Determination de l'intersection entre un segment et C C un demi plan definit par une droite et un point dans le demi plan C C C C NRA, NRB = entiers, numeros des noeuds de la droite (AB) C C NRC = entier, numero du noeud dans le demi plan C C X1,Y1 C C X2,Y2 = coordonnees des points P1 et P2 du segment [P1,P2] C C l'ordre P1,P2 est important (voir ci dessous) C C C C IINT = indicateur sur l'intersection : C C - IINT = 0 P1P2 est hors du demi plan C C --> les coordonnees de I1 et I2 sont nulles C C - IINT = 1 P1P2 intersecte le demi plan C C --> I1 et I2 sont les points d'intersection C C XI1,YI1 C C XI2,YI2 = coordonnees des points du segment d'intersection C C oriente comme le segment [P1,P2] C C----------------------------------------------------------------------C IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMCOORD PARAMETER (ZERO=1D-14) C SEGACT,MCOORD IDIMP1=IDIM+1 C Extraction des coordonnees des points A, B XA=XCOOR((NRA-1)*IDIMP1+1) YA=XCOOR((NRA-1)*IDIMP1+2) XB=XCOOR((NRB-1)*IDIMP1+1) YB=XCOOR((NRB-1)*IDIMP1+2) C Vecteur normal a la droite AB XN=(YB-YA) YN=(XA-XB) C Signe du produit scalaire n.AC XC=XCOOR((NRC-1)*IDIMP1+1) YC=XCOOR((NRC-1)*IDIMP1+2) PSC=(XN*(XC-XA))+(YN*(YC-YA)) IF (ABS(PSC).LT.ZERO) THEN C Demi plan mal definit CALL ERREUR(363) ENDIF SIGC=SIGN(1D0,PSC) C Signe du produit scalaire n.AP1 PS1=(XN*(X1-XA))+(YN*(Y1-YA)) SIG1=SIGN(1D0,PS1) IF (ABS(PS1).LT.ZERO) SIG1=SIGC C Signe du produit scalaire n.AP2 PS2=(XN*(X2-XA))+(YN*(Y2-YA)) SIG2=SIGN(1D0,PS2) IF (ABS(PS2).LT.ZERO) SIG2=SIGC C Il y a 4 cas possibles IINT=0 XI1=0D0 YI1=0D0 XI2=0D0 YI2=0D0 C 1) [P1,P2] est hors du demi plan IF ((SIG1.NE.SIGC).AND.(SIG2.NE.SIGC)) THEN GOTO 999 ENDIF C 2) P1 est dans le demi plan et P2 dehors IF ((SIG1.EQ.SIGC).AND.(SIG2.NE.SIGC)) THEN IINT=1 XI1=X1 YI1=Y1 GOTO 100 ENDIF C 3) P2 est dans le demi plan et P1 dehors IF ((SIG1.NE.SIGC).AND.(SIG2.EQ.SIGC)) THEN IINT=2 XI2=X2 YI2=Y2 GOTO 100 ENDIF C 4) [P1,P2] est entierment dans le demi plan IF ((SIG1.EQ.SIGC).AND.(SIG2.EQ.SIGC)) THEN IINT=1 XI1=X1 YI1=Y1 XI2=X2 YI2=Y2 GOTO 999 ENDIF C 100 CONTINUE C Calcul de l'intersection du segment (P1,P2) avec la droite (AB) DET=((X1-X2)*(YB-YA))-((Y1-Y2)*(XB-XA)) C Si DET>0, il y a intersection entre les droites (AB) et (CD) IF (ABS(DET).GT.ZERO) THEN C Coordonnees barycentriques du point d'intersection ZETA=(((XB-X2)*(YB-YA))-((YB-Y2)*(XB-XA)))/DET C Coordonnees du point d'intersection XI=(ZETA*X1)+((1.-ZETA)*X2) YI=(ZETA*Y1)+((1.-ZETA)*Y2) ELSE C Si le determinant est negatif, il n'y a pas d'intersection C ==> erreur IINT=0 XI1=0D0 YI1=0D0 XI2=0D0 YI2=0D0 GOTO 999 ENDIF C Ce point correspond a I1 ou I2 selon la valeur de IINT IF (IINT.EQ.1) THEN XI2=XI YI2=YI ELSEIF (IINT.EQ.2) THEN IINT=1 XI1=XI YI1=YI ENDIF C Fin du programme 999 RETURN END