1 : C INTSEG SOURCE PASCAL 12/03/27 21:15:06 7338 2 : C 3 : SUBROUTINE INTSEG(NRA,NRB,NRC,NRD,IINT,XI,YI) 4 : C----------------------------------------------------------------------C 5 : C Determination du point d'intersection entre deux droites C 6 : C C 7 : C NRA, NRB = entiers, numeros des noeuds du segment [AB] C 8 : C NRC, NRD = entiers, numeros des noeuds du segment [CD] C 9 : C C 10 : C IINT = indicateur sur l'intersection : C 11 : C - IINT = 2 l'intersection coincide avec un des noeuds C 12 : C - IINT = 1 l' intersection est dans les segments C 13 : C C 14 : C - IINT = 0 l'intersection est hors des segments C 15 : C C 16 : C - IINT = -1 les droites sont paralleles mais les C 17 : C quatre points ne sont pas alignes C 18 : C - IINT = -2 les droites sont paralleles et les quatre C 19 : C points sont alignes C 20 : C C 21 : C XI, YI = coordonnees du point d'intersection entre les C 22 : C droites (AB) et (CD) (nulles si IINT negatif) 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=1.E-14) 29 : C 30 : SEGACT,MCOORD 31 : IDIMP1=IDIM+1 32 : C Extraction des coordonnees des points A, B, C et D 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 : XC=XCOOR((NRC-1)*IDIMP1+1) 38 : YC=XCOOR((NRC-1)*IDIMP1+2) 39 : XD=XCOOR((NRD-1)*IDIMP1+1) 40 : YD=XCOOR((NRD-1)*IDIMP1+2) 41 : C Calcul du point d'intersection entre [A B] et [C D] 42 : DET=((XA-XB)*(YD-YC))-((YA-YB)*(XD-XC)) 43 : C Si DET>0, il y a intersection entre les droites (AB) et (CD) 44 : IF (ABS(DET).GT.ZERO) THEN 45 : ZA=(((XD-XB)*(YD-YC))-((YD-YB)*(XD-XC)))/DET 46 : ZB=(((XA-XB)*(YD-YB))-((YA-YB)*(XD-XB)))/DET 47 : C Si ZA et ZB sont compris entre 0 et 1, l'intersection est bien 48 : C situee a dans les segments [AB] et [CD] 49 : IF (((ZA.GT.0.).AND.(ZA.LT.1.)).AND. 50 : & ((ZB.GT.0.).AND.(ZB.LT.1.))) THEN 51 : IINT=1 52 : C Sinon, l'intersection est en dehors des segments [AB] et [CD] 53 : ELSE 54 : IINT=0 55 : ENDIF 56 : C Coordonnees du point d'intersection de (AB) et (CD) 57 : XI=(ZA*XA)+((1.-ZA)*XB) 58 : YI=(ZA*YA)+((1.-ZA)*YB) 59 : C Test si le point I coincide avec A, B, C ou D 60 : DAI=(((XI-XA)**2)+((YI-YA)**2))**0.5 61 : DA=((XA**2)+(YA**2))**0.5 62 : IF (DA.EQ.0.) DA=1. 63 : IF (ABS(DAI/DA).LT.ZERO) THEN 64 : IINT=2 65 : ENDIF 66 : DBI=(((XI-XB)**2)+((YI-YB)**2))**0.5 67 : DB=((XB**2)+(YB**2))**0.5 68 : IF (DB.EQ.0.) DB=1. 69 : IF (ABS(DBI/DB).LT.ZERO) THEN 70 : IINT=2 71 : ENDIF 72 : DCI=(((XI-XC)**2)+((YI-YC)**2))**0.5 73 : DC=((XC**2)+(YC**2))**0.5 74 : IF (DC.EQ.0.) DC=1. 75 : IF (ABS(DCI/DC).LT.ZERO) THEN 76 : IINT=2 77 : ENDIF 78 : DDI=(((XI-XD)**2)+((YI-YD)**2))**0.5 79 : DD=((XD**2)+(YD**2))**0.5 80 : IF (DD.EQ.0.) DD=1. 81 : IF (ABS(DDI/DD).LT.ZERO) THEN 82 : IINT=2 83 : ENDIF 84 : C Si DET<0, il n'y a pas d'intersection, droites paralleles 85 : ELSE 86 : C On determine si les quatre points A,B,C et D sont alignes ou 87 : C non, calcul des distances des points C et D a la droite (AB) 88 : AA=YB-YA 89 : BB=XA-XB 90 : CC=((XB-XA)*YA)-((YB-YA)*XA) 91 : DABC=ABS((AA*XC)+(BB*YC)+CC)/(((AA**2)+(BB**2))**0.5) 92 : DABD=ABS((AA*XD)+(BB*YD)+CC)/(((AA**2)+(BB**2))**0.5) 93 : IF ((DABC.LT.ZERO).AND.(DABD.LT.ZERO)) THEN 94 : IINT=-2 95 : ELSE 96 : IINT=-1 97 : ENDIF 98 : XI=0. 99 : YI=0. 100 : ENDIF 101 : C 102 : 999 RETURN 103 : END 104 : 105 :
© Cast3M 2003 - All rights reserved.
Disclaimer