Télécharger dedans.eso

Retour à la liste

Numérotation des lignes :

dedans
  1. C DEDANS SOURCE CB215821 23/01/25 21:15:11 11573
  2. C
  3. SUBROUTINE DEDANS(NP1,IPT1,XTOL,BOOL1)
  4. C----------------------------------------------------------------------C
  5. C Determine si un point est situe a l'interieur C
  6. C - d'un contour oriente ferme constitue de SEG2 (en 2D) C
  7. C - d'une surface enveloppe orientee fermee constituee de TRI3 (en 3D) C
  8. C C
  9. C NP1 = entier, numero du point C
  10. C IPT1 = entier, numero du maillage contour/enveloppe C
  11. C XTOL = flottant, tolerance pour le test de nullite de l'angle C
  12. C solide C
  13. C BOOL1 = booleen, egal a .TRUE. si NP1 est dans IPT1 C
  14. C----------------------------------------------------------------------C
  15. IMPLICIT INTEGER(I-N)
  16. IMPLICIT REAL*8 (A-H,O-Z)
  17.  
  18. -INC PPARAM
  19. -INC CCOPTIO
  20. -INC SMELEME
  21. -INC SMCOORD
  22. -INC CCREEL
  23. C
  24. C Zero utilise pour tester la colinearite/coplaneite du point avec
  25. C les elements du contour/enveloppe
  26. PARAMETER (ZERO=1D-10)
  27. LOGICAL BOOL1
  28. C
  29. IDIMP1=IDIM+1
  30. BOOL1=.TRUE.
  31. C
  32. C
  33. IF (IDIM.EQ.2) THEN
  34. X1=XCOOR((NP1-1)*IDIMP1+1)
  35. Y1=XCOOR((NP1-1)*IDIMP1+2)
  36. C On calcule la somme des angles des segments du contour vus par
  37. C le point P1
  38. OMEGA=0D0
  39. DO I=1,IPT1.NUM(/2)
  40. C Coordonnees des points A et B du segment I
  41. NRA=IPT1.NUM(1,I)
  42. NRB=IPT1.NUM(2,I)
  43. XA=XCOOR((NRA-1)*IDIMP1+1)
  44. YA=XCOOR((NRA-1)*IDIMP1+2)
  45. XB=XCOOR((NRB-1)*IDIMP1+1)
  46. YB=XCOOR((NRB-1)*IDIMP1+2)
  47. C Calcul de l'angle oriente entre P1A et P1B
  48. C - le produit scalaire donne l'angle (entre 0 et pi)
  49. C - le produit vectoriel donne le signe
  50. RAX=XA-X1
  51. RAY=YA-Y1
  52. RA=SQRT((RAX*RAX)+(RAY*RAY))
  53. RBX=XB-X1
  54. RBY=YB-Y1
  55. RB=SQRT((RBX*RBX)+(RBY*RBY))
  56. PS=(RAX*RBX)+(RAY*RBY)
  57. PV=(RAX*RBY)-(RAY*RBX)
  58. SIG1=SIGN(1D0,PV)
  59. RD=RA*RB
  60. IF ((RA.LE.ZERO).OR.(RB.LE.ZERO).OR.(RD.LE.ZERO)) THEN
  61. C Si le denominateur est nul, les points sont confondus
  62. C alors le point P1 coincide avec un sommet du segment
  63. C donc il est sur le contour --> on quitte
  64. OMEGA=2D0*XPI
  65. GOTO 1
  66. ENDIF
  67. IF (ABS(PV).LE.ZERO) THEN
  68. C Si le produit vectoriel est nul, le point P1 est situe
  69. C sur la droite AB, l'angle est considere comme nul
  70. OMEGA1=0D0
  71. ELSE
  72. COS1=PS/RD
  73. IF (COS1.GT. 1.D0) COS1=1D0
  74. IF (COS1.LT.-1.D0) COS1=-1D0
  75. OMEGA1=SIG1*(ACOS(COS1))
  76. ENDIF
  77. OMEGA=OMEGA+OMEGA1
  78. ENDDO
  79. 1 CONTINUE
  80. OMEGA=OMEGA/(2D0*XPI)
  81. C Si OMEGA est nul alors P1 est dehors
  82. IF (ABS(OMEGA).LT.XTOL) BOOL1=.FALSE.
  83. C
  84. C
  85. ELSEIF (IDIM.EQ.3) THEN
  86. X1=XCOOR((NP1-1)*IDIMP1+1)
  87. Y1=XCOOR((NP1-1)*IDIMP1+2)
  88. Z1=XCOOR((NP1-1)*IDIMP1+3)
  89. C On calcule la somme des angles solides des triangles de
  90. C l'enveloppe vus par le point P1
  91. OMEGA=0D0
  92. DO I=1,IPT1.NUM(/2)
  93. C Coordonnees des points A,B et C du triangle I
  94. NRA=IPT1.NUM(1,I)
  95. NRB=IPT1.NUM(2,I)
  96. NRC=IPT1.NUM(3,I)
  97. XA=XCOOR((NRA-1)*IDIMP1+1)
  98. YA=XCOOR((NRA-1)*IDIMP1+2)
  99. ZA=XCOOR((NRA-1)*IDIMP1+3)
  100. XB=XCOOR((NRB-1)*IDIMP1+1)
  101. YB=XCOOR((NRB-1)*IDIMP1+2)
  102. ZB=XCOOR((NRB-1)*IDIMP1+3)
  103. XC=XCOOR((NRC-1)*IDIMP1+1)
  104. YC=XCOOR((NRC-1)*IDIMP1+2)
  105. ZC=XCOOR((NRC-1)*IDIMP1+3)
  106. C Calcul de l'angle solide oriente du triangle ABC vu depuis
  107. C le point P1 (formule de Van Oosterom et Strackee)
  108. RAX=XA-X1
  109. RAY=YA-Y1
  110. RAZ=ZA-Z1
  111. RA=SQRT((RAX*RAX)+(RAY*RAY)+(RAZ*RAZ))
  112. RBX=XB-X1
  113. RBY=YB-Y1
  114. RBZ=ZB-Z1
  115. RB=SQRT((RBX*RBX)+(RBY*RBY)+(RBZ*RBZ))
  116. RCX=XC-X1
  117. RCY=YC-Y1
  118. RCZ=ZC-Z1
  119. RC=SQRT((RCX*RCX)+(RCY*RCY)+(RCZ*RCZ))
  120. RD=(RA*RB*RC) + (((RAX*RBX)+(RAY*RBY)+(RAZ*RBZ))*RC)
  121. & + (((RAX*RCX)+(RAY*RCY)+(RAZ*RCZ))*RB)
  122. & + (((RBX*RCX)+(RBY*RCY)+(RBZ*RCZ))*RA)
  123. IF ((RA.LE.ZERO).OR.(RB.LE.ZERO).OR.(RC.LE.ZERO).OR.
  124. & (ABS(RD).LE.ZERO)) THEN
  125. C Si le denominateur est nul, alors le point P1 coincide
  126. C avec un sommet du triangle ABC, donc il est sur
  127. C l'enveloppe --> on quitte
  128. OMEGA=4D0*XPI
  129. GOTO 2
  130. ENDIF
  131. RN= (RAX*((RBY*RCZ)-(RBZ*RCY)))
  132. & -(RBX*((RAY*RCZ)-(RAZ*RCY)))
  133. & +(RCX*((RAY*RBZ)-(RAZ*RBY)))
  134. IF (ABS(RN).LE.ZERO) THEN
  135. C Si le numerateur est nul, le point P1 est dans le plan
  136. C du triangle ABC, donc l'angle solide est considere comme
  137. C nul
  138. OMEGA1=0D0
  139. ELSE
  140. AT=ATAN2(RN,RD)
  141. OMEGA1=2D0*AT
  142. ENDIF
  143. OMEGA=OMEGA+OMEGA1
  144. ENDDO
  145. 2 CONTINUE
  146. OMEGA=OMEGA/(4D0*XPI)
  147. C Si OMEGA est nul alors P1 est dehors
  148. IF (ABS(OMEGA).LT.XTOL) BOOL1=.FALSE.
  149. ENDIF
  150. C
  151. C Fin du programme
  152. 999 RETURN
  153. END
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales