Télécharger intpseg2.eso

Retour à la liste

Numérotation des lignes :

  1. C INTPSEG2 SOURCE SH236661 13/11/25 21:15:08 7869
  2. C
  3. SUBROUTINE INTPSEG2(NRA,NRB,NRC,X1,Y1,X2,Y2,
  4. & IINT,XI1,YI1,XI2,YI2)
  5. C----------------------------------------------------------------------C
  6. C Determination de l'intersection entre un segment et C
  7. C un demi plan definit par une droite et un point dans le demi plan C
  8. C C
  9. C NRA, NRB = entiers, numeros des noeuds de la droite (AB) C
  10. C NRC = entier, numero du noeud dans le demi plan C
  11. C X1,Y1 C
  12. C X2,Y2 = coordonnees des points P1 et P2 du segment [P1,P2] C
  13. C l'ordre P1,P2 est important (voir ci dessous) C
  14. C C
  15. C IINT = indicateur sur l'intersection : C
  16. C - IINT = 0 P1P2 est hors du demi plan C
  17. C --> les coordonnees de I1 et I2 sont nulles C
  18. C - IINT = 1 P1P2 intersecte le demi plan C
  19. C --> I1 et I2 sont les points d'intersection C
  20. C XI1,YI1 C
  21. C XI2,YI2 = coordonnees des points du segment d'intersection C
  22. C oriente comme le segment [P1,P2] 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=1D-14)
  29. C
  30. SEGACT,MCOORD
  31. IDIMP1=IDIM+1
  32. C Extraction des coordonnees des points A, B
  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. C Vecteur normal a la droite AB
  38. XN=(YB-YA)
  39. YN=(XA-XB)
  40. C Signe du produit scalaire n.AC
  41. XC=XCOOR((NRC-1)*IDIMP1+1)
  42. YC=XCOOR((NRC-1)*IDIMP1+2)
  43. PSC=(XN*(XC-XA))+(YN*(YC-YA))
  44. IF (ABS(PSC).LT.ZERO) THEN
  45. C Demi plan mal definit
  46. CALL ERREUR(363)
  47. ENDIF
  48. SIGC=SIGN(1D0,PSC)
  49. C Signe du produit scalaire n.AP1
  50. PS1=(XN*(X1-XA))+(YN*(Y1-YA))
  51. SIG1=SIGN(1D0,PS1)
  52. IF (ABS(PS1).LT.ZERO) SIG1=SIGC
  53. C Signe du produit scalaire n.AP2
  54. PS2=(XN*(X2-XA))+(YN*(Y2-YA))
  55. SIG2=SIGN(1D0,PS2)
  56. IF (ABS(PS2).LT.ZERO) SIG2=SIGC
  57. C Il y a 4 cas possibles
  58. IINT=0
  59. XI1=0D0
  60. YI1=0D0
  61. XI2=0D0
  62. YI2=0D0
  63. C 1) [P1,P2] est hors du demi plan
  64. IF ((SIG1.NE.SIGC).AND.(SIG2.NE.SIGC)) THEN
  65. GOTO 999
  66. ENDIF
  67. C 2) P1 est dans le demi plan et P2 dehors
  68. IF ((SIG1.EQ.SIGC).AND.(SIG2.NE.SIGC)) THEN
  69. IINT=1
  70. XI1=X1
  71. YI1=Y1
  72. GOTO 100
  73. ENDIF
  74. C 3) P2 est dans le demi plan et P1 dehors
  75. IF ((SIG1.NE.SIGC).AND.(SIG2.EQ.SIGC)) THEN
  76. IINT=2
  77. XI2=X2
  78. YI2=Y2
  79. GOTO 100
  80. ENDIF
  81. C 4) [P1,P2] est entierment dans le demi plan
  82. IF ((SIG1.EQ.SIGC).AND.(SIG2.EQ.SIGC)) THEN
  83. IINT=1
  84. XI1=X1
  85. YI1=Y1
  86. XI2=X2
  87. YI2=Y2
  88. GOTO 999
  89. ENDIF
  90. C
  91. 100 CONTINUE
  92. C Calcul de l'intersection du segment (P1,P2) avec la droite (AB)
  93. DET=((X1-X2)*(YB-YA))-((Y1-Y2)*(XB-XA))
  94. C Si DET>0, il y a intersection entre les droites (AB) et (CD)
  95. IF (ABS(DET).GT.ZERO) THEN
  96. C Coordonnees barycentriques du point d'intersection
  97. ZETA=(((XB-X2)*(YB-YA))-((YB-Y2)*(XB-XA)))/DET
  98. C Coordonnees du point d'intersection
  99. XI=(ZETA*X1)+((1.-ZETA)*X2)
  100. YI=(ZETA*Y1)+((1.-ZETA)*Y2)
  101. ELSE
  102. C Si le determinant est negatif, il n'y a pas d'intersection
  103. C ==> erreur
  104. IINT=0
  105. XI1=0D0
  106. YI1=0D0
  107. XI2=0D0
  108. YI2=0D0
  109. GOTO 999
  110. ENDIF
  111. C Ce point correspond a I1 ou I2 selon la valeur de IINT
  112. IF (IINT.EQ.1) THEN
  113. XI2=XI
  114. YI2=YI
  115. ELSEIF (IINT.EQ.2) THEN
  116. IINT=1
  117. XI1=XI
  118. YI1=YI
  119. ENDIF
  120. C Fin du programme
  121. 999 RETURN
  122. END
  123.  
  124.  
  125.  

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