try: from paraview import vtk 
except: import vtk
import numpy
try: from paraview import numpy_support 
except: from vtk.util import numpy_support

#######################################################
############ TENTATIVE DE SPHERE INSCRITES ############
#######################################################

#__________________________________________________________________________________________
def trouver_zero_fonction_croissante(valeur_1, valeur_2, fonction_a_annuler, precision=1e-6):
    """recherche le zero de la fonction dans l'intervalle [valeur_1, valeur_2]
    fonction est supposee etre CROISSANTE dans l'intervalle [valeur_1, valeur_2]
    
    """
    milieu = (valeur_1 + valeur_2) / 2.0
    if numpy.abs(valeur_1 - valeur_2) < precision:
        return milieu
    
    f_milieu = fonction_a_annuler(milieu)
    if f_milieu < 0:
        return trouver_zero_fonction_croissante(milieu, valeur_2, fonction_a_annuler, precision)
    else:
        return trouver_zero_fonction_croissante(valeur_1, milieu, fonction_a_annuler, precision)
#__________________________________________________________________________________________

#__________________________________________________________________________________________
def trouver_centres_spheres_inscrites(surface_1, surface_2, 
        precision=1e-6, pas_initial=10):
    """fonction qui recherche les centres des spheres inscrites entre les surface_1 et surface_2
    
    le vecteur 'Normals' doit etre present aux noeuds de surface_1
    
    la recherche se fait par trouver_zero_fonction_croissante, pour chacun des points de surface_1
    on cherche un point sur la ligne orthogonale a surface_1, equidistant de surface_1 et surface_2
        --> centre de la sphere inscrite entre surface_1 et surface_2
            passant par le point de surface_1 considere
    
    surface_1 et surface_2 doivent etre des vtkPolyData
    """
    
    # initialisation des outils vtk de calcul des distances
    calcul_distance_1 = vtk.vtkKdTreePointLocator()
    calcul_distance_1.SetDataSet(surface_1)
    calcul_distance_1.BuildLocator()
    calcul_distance_2 = vtk.vtkKdTreePointLocator()
    calcul_distance_2.SetDataSet(surface_2)
    calcul_distance_2.BuildLocator()
    vtkMath = vtk.vtkMath()
    
    # lecture des donnees de la surface
    liste_normals_surface_1 = numpy_support.vtk_to_numpy(surface_1.GetPointData().GetArray('Normals'))
    liste_points_surface_1 = numpy_support.vtk_to_numpy(surface_1.GetPoints().GetData())