Download trdbse.eso

Back to the list

   1 : C TRDBSE    SOURCE    CHAT      05/01/13    03:46:00     5004           
   2 :       SUBROUTINE TRDBSE(NN,ITRNOE,NBNMAX,ITRTRI,NBCMAX,
   3 :      >                   NOETRI,COORD,ITP,IAR)
   4 : C     ******************************************************     
   5 : C     OBJET :  SELECTIONNE LE TRIANGLE INCIDENT A UN NOEUD
   6 : C              ET QUI INTERSECTE UNE DEMI-DROITE PARTANT 
   7 : C              DE CE NOEUD
   8 : C     EN ENTREE: 
   9 : C        NN() : LES INDICES DES NOEUDS DU SEGMENT
  10 : C     EN SORTIE: 
  11 : C        ITP  :  LE TRIANGLE INTERSECTANT NN
  12 : C        IAR  :  L'INDICE DE L'ARETE DE ITP INTERSECTEE PAR NN
  13 : C     NIVEAU  : FICHIER
  14 : C     ********************************************************
  15 :       IMPLICIT INTEGER(I-N)
  16 :       INTEGER   NN(*),ITRNOE(*),NBNMAX,ITRTRI(*),NBCMAX
  17 :       INTEGER   NOETRI(*),ITP,IAR
  18 :       REAL*8      COORD(*)
  19 : C
  20 :       REAL*8      XN(4), DROITE(3), PZERO, X(2),Y(2),S1,S2
  21 :       INTEGER   IDE,IDIMC,I
  22 :       INTEGER   ITPDEB,ISENS,IARDEB,N1,N2,IERR
  23 : C 
  24 : C     --- LE SEGMENT N'EST PAS RESPECTE ---
  25 :       IDIMC = 2
  26 :       IDE = 2
  27 :       DO 10 I=1,IDIMC
  28 :         XN(I)     = COORD((NN(1)-1)*IDIMC+I)
  29 :         XN(IDIMC+I)= COORD((NN(2)-1)*IDIMC+I)
  30 :    10 CONTINUE
  31 :       PZERO = 1.D-10 *((XN(3)-XN(1))**2 + (XN(4)-XN(2))**2)
  31 : C      CALL G2DDRO2P( XN, DROITE ) REMPLACE PAR O.STAB
  31 :       CALL DR2PO( COORD((NN(1)-1)*IDIMC+1),
  32 :      >                COORD((NN(2)-1)*IDIMC+1),DROITE,IERR)
  33 : C      
  34 : C     --- RECHERCHE DE L'ELEMENT DE DEPART ---
  35 : C     --------------------------------------------
  36 :       ISENS = 1
  36 :       CALL SESFR2(NN,ISENS,IDE,ITRNOE,NBNMAX,ITRTRI,
  37 :      >                     NBCMAX,NOETRI,ITP,IAR)
  38 :       IF((IAR.EQ.-1).OR.(ITP.EQ.0))GO TO 999
  39 :       ITPDEB = ITP
  40 :       IARDEB = IAR
  41 : C      
  42 : C     --- TEST D'INTERSECTION : L'ARETE OPPOSEE ---
  43 : C
  44 :    20 I = IAR
  45 :       N2 = ITRNOE((ITP-1)*NBNMAX+I)     
  46 :       X(2) = COORD((N2-1)*IDIMC + 1)
  47 :       Y(2) = COORD((N2-1)*IDIMC + 2)
  48 :       I = MOD(I,3)+1
  49 :       I = MOD(I,3)+1 
  50 :       N1 = ITRNOE((ITP-1)*NBNMAX+I)    
  51 :       X(1) = COORD((N1-1)*IDIMC + 1)
  52 :       Y(1) = COORD((N1-1)*IDIMC + 2)
  53 : C
  54 :       S1 = DROITE(1)*X(1)+DROITE(2)*Y(1)+DROITE(3)
  55 :       S2 = DROITE(1)*X(2)+DROITE(2)*Y(2)+DROITE(3)
  56 :       IF(((S1.GT. PZERO).AND.(S2.LT.-PZERO)).OR.
  57 :      >   ((S1.LT.-PZERO).AND.(S2.GT. PZERO)))THEN
  58 : C        --- VERIFICATION DU COTE : PRSCAL > 0---
  59 :          S1 = ((X(1)-XN(1))*(XN(4)-XN(2))) -
  60 :      >        ((Y(1)-XN(2))*(XN(3)-XN(1)))
  61 :          S2 = ((X(1)-XN(1))*(Y(2)-Y(1))) -
  62 :      >        ((Y(1)-XN(2))*(X(2)-X(1)))     
  63 :          IF( (S1*S2).GT.PZERO )THEN
  64 :          IAR = I
  65 :          GOTO 999
  66 :          ENDIF
  67 :       ENDIF
  68 : C     --- ON PASSE AU TRIANGLE SUIVANT --- 
  69 :       IAR = MOD(IAR,NBCMAX)+1  
  69 :       CALL SESFR1(ITP,IAR,ITRTRI,NBCMAX,ITP,IAR)
  70 :       IF((ITP.NE.ITPDEB ).AND.(ITP.NE.0))GOTO 20    
  71 :       ITP = 0
  72 :       IAR = 0
  73 :   999 END             
  74 :  
  75 :  

© Cast3M 2003 - All rights reserved.
Disclaimer