raycasting.f90

### TABLE OF CONTENTS

- 1. NUM/raycasting

## NUM/raycasting [ Modules ]

[ Top ] [ Modules ]

NOM

     raycasting(sol,x,y,z,chi)

DESCRIPTION

      Algorithme de raycasting permettant de determiner si la cellule courante est dans le "solide" ou non.
      raycasting algorithm to determine whether the current cell is in the ‘solid’ or not.

        ENTREES / INPUT
        sol   : solide / solid
        x,y,z : coordonnees du point a tester / coordinates of the point to be tested

        SORTIES / OUTPUT
        chi   : indicatrice de presence (0: non, 1: oui) / presence indicator (0: no, 1: yes)

SOURCE

    ! Ce logiciel est regi par la licence [CeCILL-B]
    ! This software is governed by the [CeCILL-B] license
    !=========================== DEBUT DES DECLARATIONS ====================
    !.1-----  Implicit, Use
      use num_typ
      IMPLICIT NONE
    !.2-----  Declaration
      real(kind=kind(0.d0)), intent(in)  :: x,y,z
    !! coordonnees du centre de la cellule a tester / coordinates of the centre of the cell to be tested
      type(solide), intent(inout)        :: sol !! Objet solide / Solid object
      real(kind=kind(0.d0)), intent(out) :: chi !! Indicatrice de presence (0: non, 1: oui) / Presence indicator (0: no, 1: yes)

      integer                            :: k,ind
      real(kind=kind(0.d0))              :: xn

      type(point)                        :: ori,v0,v1,v2
      integer                            :: cpt,intersect
      type(vect_3)                       :: dir
    !=========================== DEBUT DU CODE EXECUTABLE ==================

      ind=0

      !~!
      !~!  ! 3D : voir "Fast, minimum storage Ray/triangle intersection" (1997) - Moller et Trumbore
      !~!
        ori%x=x ! Origine du rayon
        ori%y=y ! Origine du rayon
        ori%z=z ! Origine du rayon
        dir%v(1)=sol%xg%v(1) - x                ! Vecteur directeur du rayon
        dir%v(2)=sol%xg%v(2) - y
        dir%v(3)=sol%xg%v(3) - z
        dir%v(1)=1.d0                ! Vecteur directeur du rayon
        dir%v(2)=0.d0
        dir%v(3)=0.d0
        xn=dsqrt(dir%v(1)**2+dir%v(2)**2+dir%v(3)**2)
        cpt = 0
        if (xn.ne.0.d0)dir%v=dir%v/xn
            !call display(ori)
            !write(*,*)dir,sol%xg

        DO k=1,sol%nb_face ! Boucle sur les faces/triangles

            ! Construction des points du triangle
            v0=sol%list_vertex(sol%list_facette(k)%vertex(1))
            v1=sol%list_vertex(sol%list_facette(k)%vertex(2))
            v2=sol%list_vertex(sol%list_facette(k)%vertex(3))

            ! Compteur d intersection
            cpt = cpt + intersect(V0,V1,V2,ori,dir)
            !write(*,*)intersect(V0,V1,V2,ori,dir)
            !call display(v0)
            !call display(v1)
            !call display(v2)
        END DO

        ind=0
        IF (mod(cpt,2).EQ.1) ind=1 ! Si le nombre d intersection est impair, alors la maille est dans le polygone.

      IF (ind.NE.0) chi=sol%id*1.d0
    !===========================   FIN DE LA ROUTINE    ====================
    END SUBROUTINE raycasting