Download intpseg2.eso

Back to the list

   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
  45 :          CALL ERREUR(363)
  46 :       ENDIF
  47 :       SIGC=SIGN(1D0,PSC)
  48 : C     Signe du produit scalaire n.AP1
  49 :       PS1=(XN*(X1-XA))+(YN*(Y1-YA))
  50 :       SIG1=SIGN(1D0,PS1)
  51 :       IF (ABS(PS1).LT.ZERO) SIG1=SIGC
  52 : C     Signe du produit scalaire n.AP2
  53 :       PS2=(XN*(X2-XA))+(YN*(Y2-YA))
  54 :       SIG2=SIGN(1D0,PS2)
  55 :       IF (ABS(PS2).LT.ZERO) SIG2=SIGC
  56 : C     Il y a 4 cas possibles
  57 :       IINT=0
  58 :       XI1=0D0
  59 :       YI1=0D0
  60 :       XI2=0D0
  61 :       YI2=0D0
  62 : C     1) [P1,P2] est hors du demi plan
  63 :       IF ((SIG1.NE.SIGC).AND.(SIG2.NE.SIGC)) THEN
  64 :          GOTO 999
  65 :       ENDIF
  66 : C     2) P1 est dans le demi plan et P2 dehors
  67 :       IF ((SIG1.EQ.SIGC).AND.(SIG2.NE.SIGC)) THEN
  68 :          IINT=1
  69 :          XI1=X1
  70 :          YI1=Y1
  71 :          GOTO 100
  72 :       ENDIF
  73 : C     3) P2 est dans le demi plan et P1 dehors
  74 :       IF ((SIG1.NE.SIGC).AND.(SIG2.EQ.SIGC)) THEN
  75 :          IINT=2
  76 :          XI2=X2
  77 :          YI2=Y2
  78 :          GOTO 100
  79 :       ENDIF
  80 : C     4) [P1,P2] est entierment dans le demi plan
  81 :       IF ((SIG1.EQ.SIGC).AND.(SIG2.EQ.SIGC)) THEN
  82 :          IINT=1
  83 :          XI1=X1
  84 :          YI1=Y1
  85 :          XI2=X2
  86 :          YI2=Y2
  87 :          GOTO 999
  88 :       ENDIF
  89 : C
  90 : 100   CONTINUE
  91 : C     Calcul de l'intersection du segment (P1,P2) avec la droite (AB)
  92 :       DET=((X1-X2)*(YB-YA))-((Y1-Y2)*(XB-XA))
  93 : C     Si DET>0, il y a intersection entre les droites (AB) et (CD)
  94 :       IF (ABS(DET).GT.ZERO) THEN
  95 : C        Coordonnees barycentriques du point d'intersection
  96 :          ZETA=(((XB-X2)*(YB-YA))-((YB-Y2)*(XB-XA)))/DET
  97 : C        Coordonnees du point d'intersection
  98 :          XI=(ZETA*X1)+((1.-ZETA)*X2)
  99 :          YI=(ZETA*Y1)+((1.-ZETA)*Y2)
 100 :       ELSE
 101 : C        Si le determinant est negatif, il n'y a pas d'intersection
 102 : C        ==> erreur
 103 :          IINT=0
 104 :          XI1=0D0
 105 :          YI1=0D0
 106 :          XI2=0D0
 107 :          YI2=0D0
 108 :          GOTO 999
 109 :       ENDIF
 110 : C     Ce point correspond a I1 ou I2 selon la valeur de IINT
 111 :       IF (IINT.EQ.1) THEN
 112 :          XI2=XI
 113 :          YI2=YI
 114 :       ELSEIF (IINT.EQ.2) THEN
 115 :          IINT=1
 116 :          XI1=XI
 117 :          YI1=YI
 118 :       ENDIF
 119 : C     Fin du programme
 120 : 999   RETURN
 121 :       END
 122 : 
 123 :  

© Cast3M 2003 - All rights reserved.
Disclaimer