facet
C FACET SOURCE JC220346 16/11/29 21:15:14 9221 C---------------------------------------------------------------------| C | C | C CETTE FONCTION LOGIQUE INDIQUE SI LA FACETTE JF EST VALIDE. | C -0- On verifie que les diag des quadr ne sont pas des aretes ! C -1- ON TESTE LES ANGLES DES SEGMENTS DE LA FACETTES | C SI CES ANGLES SONT TROP PETITS, LA FACETTE EST INVALIDE | | C -2- ON TESTE LES ANGLES DE LA FACETTE JF AVEC LES FACETES | C ADJACENTES: SI CET ANGLE EST TROP PETIT, LA FACETTE EST | C INVALIDE | | C -3- ON TESTE L'INTERSECTION DE LA FACETTE AVEC LES FACETTES | C ENVIRONNANTES. | C -4- ON VERIFIE LA POSITION DES ARETES DE LA FACETTE PAR | C AUX FACETTES AVOISINANTES | C | C---------------------------------------------------------------------| C IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC TDEMAIT -INC PPARAM -INC CCOPTIO C SI LA FACETTE A ETE SUPPRIME ELLE EST CONSIDEREE COMME BONNE ifs=jf icause=.false. iirfac=0 j1rfac=0 j2rfac=0 ifrfac=0 DO 10 I=1,NFACET IF (IFUT(I).EQ.JF) GOTO 20 10 CONTINUE RETURN 20 CONTINUE C C I1=NFC(1,JF) I3=NFC(3,JF) I4=NFC(4,JF) C C 0EME CAS C -------- if (i4.ne.0) then DO 100 I=1,40 IF=NPF(I,I1) if (if.eq.jf) goto 100 IF (IF.EQ.0) GOTO 120 DO 110 J=1,40 IF (NPF(J,i3).EQ.0) GOTO 100 IF (IF.eq.NPF(J,i3)) GOTO 150 110 continue 100 continue 120 continue DO 130 I=1,40 if (if.eq.jf) goto 130 IF (IF.EQ.0) GOTO 160 DO 140 J=1,40 IF (NPF(J,i4).EQ.0) GOTO 130 IF (IF.eq.NPF(J,i4)) GOTO 150 140 continue 130 continue goto 160 150 continue * write (6,*) ' facet diagonale arete' return 160 continue endif C C 1ER CAS C -------- IF (I4.NE.0) THEN ELSE ENDIF C C 2EME CAS: C -------- C IF (ANG.GT.CFACET.or.ang.lt.-2000000-cfacet) then icause=.true. ifrfac=ifs iirfac=nfc(1,kf) j1rfac=nfc(2,kf) j2rfac=nfc(3,kf) * write (6,*) ' facet angle 1 incorrect ',ang RETURN ENDIF C IF (ANG.GT.CFACET.or.ang.lt.-2000000-cfacet) then icause=.true. ifrfac=ifs iirfac=nfc(1,kf) j1rfac=nfc(2,kf) j2rfac=nfc(3,kf) * write (6,*) ' facet angle 2 incorrect ',ang RETURN ENDIF C IF (I4.EQ.0) THEN IF (ANG.GT.CFACET.or.ang.lt.-2000000-cfacet) then icause=.true. ifrfac=ifs iirfac=nfc(1,kf) j1rfac=nfc(2,kf) j2rfac=nfc(3,kf) * write (6,*) ' facet angle 3 incorrect ',ang RETURN ENDIF ELSE IF (ANG.GT.CFACET.or.ang.lt.-2000000-cfacet) then icause=.true. ifrfac=ifs iirfac=nfc(1,kf) j1rfac=nfc(2,kf) j2rfac=nfc(3,kf) * write (6,*) ' facet angle 4 incorrect ',ang RETURN ENDIF C IF (ANG.GT.CFACET.or.ang.lt.-2000000-cfacet) then icause=.true. ifrfac=ifs iirfac=nfc(1,kf) j1rfac=nfc(2,kf) j2rfac=nfc(3,kf) * write (6,*) ' facet angle 5 incorrect ',ang RETURN ENDIF ENDIF C C 3EME CAS: C --------- C C TEST DE L'INTERSECTION DE LA FACETTE JF AVEC LES FACETTES ENVIRON C ----------------------------------------------------------------- C ( AYANT UN POINT COMMUN AVEC LA FACETTE TESTEE ) C EGALEMENT TEST DES POSITIONS RELATIVES C -------------------------------------- C NBD=4 IF (NFC(4,JF).EQ.0) NBD=3 IPROB=0 DO 200 IP=1,NBD * POINT DE LA FACE II=NFC(IP,JF) * TEST DE SITUATION A EVITER SI 4 FACES AUTOUR DU POINT DO 210 I=1,40 * FACE CONTENANT LE POINT KF=NPF(I,II) IF (KF.EQ.0) GOTO 200 IF (KF.EQ.JF) GOTO 210 IF (I1.EQ.J1) GOTO 210 * Y A T IL INTERSECTION ??? LES DEUX POINTS D'UNE FACE SONT DE PART ET * D'AUTRE DE L'AUTRE av1=abs(v1) av2=abs(v2) VV=max(av1,av2)/faccri *pv IF (V1*V2.GE.0.d0) GOTO 210 IF (av1.gt.vv.and.av2.gt.vv.and.V1*V2.GT.1D-12*dref**3) GOTO 210 aw1=abs(w1) aw2=abs(w2) ww=max(aw1,aw2)/faccri *pv IF (W1*W2.GE.0.d0) GOTO 210 IF (aw1.gt.ww.and.aw2.gt.ww.and.W1*W2.GT.1D-12*dref**3) GOTO 210 * si les deux facettes sont à peu pres coplanaires, test spécial if (max(av1,av2,aw1,aw2).lt.1e-6*dref**(3/2)) then * write (6,*) ' FACET facettes coplanaires ' * si il y a intersection i1 ou i2 est entre j1 et j2 ou l'inverse xi1=xyz(1,i1)-xyz(1,ii) yi1=xyz(2,i1)-xyz(2,ii) zi1=xyz(3,i1)-xyz(3,ii) si1=sqrt(xi1**2+yi1**2+zi1**2) si2=sqrt(xi2**2+yi2**2+zi2**2) xj1=xyz(1,j1)-xyz(1,ii) yj1=xyz(2,j1)-xyz(2,ii) zj1=xyz(3,j1)-xyz(3,ii) sj1=sqrt(xj1**2+yj1**2+zj1**2) sj2=sqrt(xj2**2+yj2**2+zj2**2) xn1=yi1*zj1-zi1*yj1 yn1=zi1*xj1-xi1*zj1 zn1=xi1*yj1-yi1*xj1 xn2=yi1*zj2-zi1*yj2 yn2=zi1*xj2-xi1*zj2 zn2=xi1*yj2-yi1*xj2 sc1=xn1*xn2+yn1*yn2+zn1*zn2 sd1=xi1*(xj1/sj1+xj2/sj2)+yi1*(yj1/sj1+yj2/sj2) > +zi1*(zj1/sj1+zj2/sj2) xn1=yi2*zj1-zi2*yj1 yn1=zi2*xj1-xi2*zj1 zn1=xi2*yj1-yi2*xj1 xn2=yi2*zj2-zi2*yj2 yn2=zi2*xj2-xi2*zj2 zn2=xi2*yj2-yi2*xj2 sc2=xn1*xn2+yn1*yn2+zn1*zn2 sd2=xi2*(xj1/sj1+xj2/sj2)+yi2*(yj1/sj1+yj2/sj2) > +zi2*(zj1/sj1+zj2/sj2) if ((sc1.lt.0.D0.and.sd1.gt.0.d0).or. > (sc2.lt.0.D0.and.sd2.gt.0.d0)) then * WRITE (6,*) ' FACET TRIANGLES COPLANAIRES INTERSECTANTS ' * WRITE (6,*) II,I1,I2,II,J1,J2,v1,v2,w1,w2,sc1,sc2 icause=.true. ifrfac=ifs iirfac=ii j1rfac=j1 j2rfac=j2 RETURN endif goto 210 endif * VERIFIER QUE II (I1 I2 INTER F2 ) ET II (J1 J2 INTER F1) SONT * DANS LA MEME DIRECTION if ((v2-v1).eq.0.d0) goto 210 if ((w2-w1).eq.0.d0) goto 210 IF (XN1*XN2+YN1*YN2+ZN1*ZN2.LT.0.D0) GOTO 210 * WRITE (6,*) ' FACET TRIANGLES INTERSECTANTS ' * WRITE (6,*) II,I1,I2,II,J1,J2,v1,v2,w1,w2 * WRITE (6,*) XN1*XN2+YN1*YN2+ZN1*ZN2 * WRITE (6,*) 'dref ',dref * write (6,*) 'ii ',xyz(1,ii),xyz(2,ii),xyz(3,ii) * write (6,*) 'i1 ',xyz(1,i1),xyz(2,i1),xyz(3,i1) * write (6,*) 'i2 ',xyz(1,i2),xyz(2,i2),xyz(3,i2) * write (6,*) 'j1 ',xyz(1,j1),xyz(2,j1),xyz(3,j1) * write (6,*) 'j2 ',xyz(1,j2),xyz(2,j2),xyz(3,j2) icause=.true. ifrfac=ifs iirfac=ii j1rfac=j1 j2rfac=j2 RETURN 210 CONTINUE 200 CONTINUE C C TEST DE LA POSITION DES ARETES PAR AUX FACETTES VOISINES C * FACET=ARET(I1,I2) * IF (.NOT.FACET) RETURN * FACET=ARET(I2,I3) * IF (.NOT.FACET) RETURN * IF (I4.EQ.0) THEN * FACET=ARET(I3,I1) * IF (.NOT.FACET) RETURN * ELSE * FACET=ARET(I3,I4) * IF (.NOT.FACET) RETURN * FACET=ARET(I4,I1) * IF (.NOT.FACET) RETURN * ENDIF RETURN * test de la position des points existants par rapport a la facette C C C FACET=FALSE SI LA NOUVELLE FACETTE EST MAUVAISE C FACET=TRUE SI LA NOUVELLE FACETTE EST BONNE C END
© Cast3M 2003 - Tous droits réservés.
Mentions légales