! !----------------------------------------------------------------------- ! !Purpose: ! Definition of parameter types used in G2S: module. ! !Copyright: ! Copyright (C) 2001 Ecole Polytechnique de Montreal. ! This library is free software; you can redistribute it and/or ! modify it under the terms of the GNU Lesser General Public ! License as published by the Free Software Foundation; either ! version 2.1 of the License, or (at your option) any later version. ! !Author(s): ! G. Civario (CS-SI) ! !Comments: ! De plus, quelques fonctions utilitaires sont aussi definies, telles que : ! - isEqual : teste l'egalite a epsilon pres de deux doubles, et les egalise ! et si leur valeur est proche, les egalise a la moyenne des deux ! - isEqualConst : teste l'egalite a epsilon pres de deux doubles ! - isEqualAngl : teste l'egalite a epsilon pres de deux angles en les ! normalisant si besoin ! - isEqualConstAngl : teste l'egalite a epsilon pres de deux angles normaux ! - angleNormal : retourne la valeur de l'angle centree entre -Pi et Pi ! - distance : calcule la distance entre un point et une droite, et calcule ! les coordonnees de la projection du point sur la droite ! - longVect : calcule la norme d'un vecteur ! - calculeAngle : calcule l'angle d'un vecteur par rapport a Ox ! - estColli : teste la colinearite de deux vecteurs ! - pointsAlignes : teste l'alignement de trois points ! - estAGauche : teste si un point est a gauche d'une droite ! - estAGaucheStrict : teste si un point est strictement a gauche d'une droite ! - estADroite : teste si un point est a droite d'une droite ! - estADroiteStrict : teste si un point est strictement a droite d'une droite ! - isPi : teste l'egalite avec Pi d'un angle ! - estPaire : teste la parite d'un entier ! - isAngleInInterval : teste l'appartenance d'un angle a un domaine angulaire ! !----------------------------------------------------------------------- ! module constUtiles implicit none double precision,parameter :: epsilon = 1.d-4 double precision,parameter :: muleps1 = 5.d0 double precision,parameter :: muleps2 = 2.d0 double precision,parameter :: pi_c = 3.14159265358979d0 double precision,parameter :: pi_2_c = 1.57079632679490d0 double precision,parameter :: pi_3_c = 1.04719755119660d0 double precision,parameter :: dpi_c = 6.28318530717959d0 !=2.*pi double precision,parameter :: rad2deg = 5.72957795130823d1 !=180./pi double precision,parameter :: deg2rad = 1.74532925199433d-2 !=pi/180. double precision,parameter :: infinity = 1.d99 double precision,parameter :: sqrt3_2d = 8.66025403784439d-1 !=sqrt(3)/2 character*10,parameter :: formatr = '(1p,e18.7)' character*5,parameter :: formati = '(i6)' character*21,parameter :: formath = '(3x,4hMACR,i6.6,:,2x)' real,parameter :: gSALeps = 1e-4 ! Numerical Constants double precision, parameter :: dp_0 = 0.0d0 double precision, parameter :: dp_1 = 1.0d0 double precision, parameter :: dp_05 = 0.5d0 contains logical function isEqual(a,b) double precision,intent(inout) :: a,b isEqual = (abs(b-a)pi_c) angleNormal = angleNormal - dpi_c end function angleNormal logical function isEqualConst(a,b) double precision,intent(in) :: a,b isEqualConst = (abs(b-a)0.d0).or.pointsAlignes(ox,oy,ex,ey,ptx,pty) end function estAGauche function estAGaucheStrict(ox,oy,ex,ey,ptx,pty) double precision,intent(in) :: ox,oy,ex,ey,ptx,pty logical :: estAGaucheStrict double precision :: tmp tmp = sin(calculeAngle(ox,oy,ptx,pty)-calculeAngle(ox,oy,ex,ey)) estAGaucheStrict=(tmp>0.d0).and.(.not.pointsAlignes(ox,oy,ex,ey,ptx,pty)) end function estAGaucheStrict function estADroite(ox,oy,ex,ey,ptx,pty) double precision,intent(in) :: ox,oy,ex,ey,ptx,pty logical :: estADroite double precision :: tmp tmp = sin(calculeAngle(ox,oy,ptx,pty)-calculeAngle(ox,oy,ex,ey)) estADroite=(tmp<0.d0).or.pointsAlignes(ox,oy,ex,ey,ptx,pty) end function estADroite function estADroiteStrict(ox,oy,ex,ey,ptx,pty) double precision,intent(in) :: ox,oy,ex,ey,ptx,pty logical :: estADroiteStrict double precision :: tmp tmp = sin(calculeAngle(ox,oy,ptx,pty)-calculeAngle(ox,oy,ex,ey)) estADroiteStrict=(tmp<0.d0).and.(.not.pointsAlignes(ox,oy,ex,ey,ptx,pty)) end function estADroiteStrict function isPi(angl) double precision,intent(in) :: angl logical :: isPi isPi=isEqualConst(abs(angl),pi_c) end function isPi logical function estPaire(n) integer,intent(in) :: n estPaire = ((n/2)*2==n) end function estPaire function isAngleInInterval(a,o,e) double precision,intent(in) :: a,o,e integer :: isAngleInInterval !dit si un angle est sur sur l'interval [o,e]: ! 0 -> pas dessus, ! 1 -> c'est l'origine, ! 2 -> entre les deux, ! 3 -> c'est l'extremite double precision :: aa,oo,ee aa = angleNormal(a) ; oo = angleNormal(o) ; ee = angleNormal(e) if (isEqualConstAngl(oo,aa)) then isAngleInInterval = 1 else if (isEqualConstAngl(ee,aa)) then isAngleInInterval = 3 else if (oo