Download intseg.eso

Back to the list

   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