C INTSEG SOURCE PASCAL 12/03/27 21:15:06 7338 C SUBROUTINE INTSEG(NRA,NRB,NRC,NRD,IINT,XI,YI) C----------------------------------------------------------------------C C Determination du point d'intersection entre deux droites C C C C NRA, NRB = entiers, numeros des noeuds du segment [AB] C C NRC, NRD = entiers, numeros des noeuds du segment [CD] C C C C IINT = indicateur sur l'intersection : C C - IINT = 2 l'intersection coincide avec un des noeuds C C - IINT = 1 l' intersection est dans les segments C C C C - IINT = 0 l'intersection est hors des segments C C C C - IINT = -1 les droites sont paralleles mais les C C quatre points ne sont pas alignes C C - IINT = -2 les droites sont paralleles et les quatre C C points sont alignes C C C C XI, YI = coordonnees du point d'intersection entre les C C droites (AB) et (CD) (nulles si IINT negatif) C C----------------------------------------------------------------------C IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC CCOPTIO -INC SMCOORD PARAMETER (ZERO=1.E-14) C SEGACT,MCOORD IDIMP1=IDIM+1 C Extraction des coordonnees des points A, B, C et D XA=XCOOR((NRA-1)*IDIMP1+1) YA=XCOOR((NRA-1)*IDIMP1+2) XB=XCOOR((NRB-1)*IDIMP1+1) YB=XCOOR((NRB-1)*IDIMP1+2) XC=XCOOR((NRC-1)*IDIMP1+1) YC=XCOOR((NRC-1)*IDIMP1+2) XD=XCOOR((NRD-1)*IDIMP1+1) YD=XCOOR((NRD-1)*IDIMP1+2) C Calcul du point d'intersection entre [A B] et [C D] DET=((XA-XB)*(YD-YC))-((YA-YB)*(XD-XC)) C Si DET>0, il y a intersection entre les droites (AB) et (CD) IF (ABS(DET).GT.ZERO) THEN ZA=(((XD-XB)*(YD-YC))-((YD-YB)*(XD-XC)))/DET ZB=(((XA-XB)*(YD-YB))-((YA-YB)*(XD-XB)))/DET C Si ZA et ZB sont compris entre 0 et 1, l'intersection est bien C situee a dans les segments [AB] et [CD] IF (((ZA.GT.0.).AND.(ZA.LT.1.)).AND. & ((ZB.GT.0.).AND.(ZB.LT.1.))) THEN IINT=1 C Sinon, l'intersection est en dehors des segments [AB] et [CD] ELSE IINT=0 ENDIF C Coordonnees du point d'intersection de (AB) et (CD) XI=(ZA*XA)+((1.-ZA)*XB) YI=(ZA*YA)+((1.-ZA)*YB) C Test si le point I coincide avec A, B, C ou D DAI=(((XI-XA)**2)+((YI-YA)**2))**0.5 DA=((XA**2)+(YA**2))**0.5 IF (DA.EQ.0.) DA=1. IF (ABS(DAI/DA).LT.ZERO) THEN IINT=2 ENDIF DBI=(((XI-XB)**2)+((YI-YB)**2))**0.5 DB=((XB**2)+(YB**2))**0.5 IF (DB.EQ.0.) DB=1. IF (ABS(DBI/DB).LT.ZERO) THEN IINT=2 ENDIF DCI=(((XI-XC)**2)+((YI-YC)**2))**0.5 DC=((XC**2)+(YC**2))**0.5 IF (DC.EQ.0.) DC=1. IF (ABS(DCI/DC).LT.ZERO) THEN IINT=2 ENDIF DDI=(((XI-XD)**2)+((YI-YD)**2))**0.5 DD=((XD**2)+(YD**2))**0.5 IF (DD.EQ.0.) DD=1. IF (ABS(DDI/DD).LT.ZERO) THEN IINT=2 ENDIF C Si DET<0, il n'y a pas d'intersection, droites paralleles ELSE C On determine si les quatre points A,B,C et D sont alignes ou C non, calcul des distances des points C et D a la droite (AB) AA=YB-YA BB=XA-XB CC=((XB-XA)*YA)-((YB-YA)*XA) DABC=ABS((AA*XC)+(BB*YC)+CC)/(((AA**2)+(BB**2))**0.5) DABD=ABS((AA*XD)+(BB*YD)+CC)/(((AA**2)+(BB**2))**0.5) IF ((DABC.LT.ZERO).AND.(DABD.LT.ZERO)) THEN IINT=-2 ELSE IINT=-1 ENDIF XI=0. YI=0. ENDIF C 999 RETURN END