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


