Merci,
J'ai testé le code que tu as posté hier, je pense qu'il y a une erreur, mais je ne trouve pas ou (et c'est peut être moi, quand je l'ai convertit en python). Quoique il en soit, tu m'as fait le plus gros du travail. J'ai pu trouver le reste en suivant quelques tutos, et ça semble fonctionner. Je n'en aurais la certitude que quand j'aurais intégré le code dans mon convertisseur, ça me prendra un peu de temps. Mais ça marche avec tous les exemples simples que j'ai essayé.
Si quelqu'un est intéressé, voici le code python :
- Code: Tout sélectionner
import math
def vec(a,b) :return [b[0]-a[0], b[1]-a[1], b[2]-a[2]]
def norm(a) :return math.sqrt(a[0]*a[0] + a[1]*a[1] + a[2]*a[2])
def cross(u, v) :return [u[1]*v[2]-u[2]*v[1], u[2]*v[0]-u[0]*v[2], u[0]*v[1]-u[1]*v[0]]
def dot(u,v) :return v[0]*u[0]+v[1]*u[1]+v[2]*u[2]
def triangle_normal_vec(a, b, c) :return cross(vec(a,b), vec(c,b))
def project_point_on_triangle_plane(p, a, b, c) :
n = triangle_normal_vec(a, b, c)
t = (n[0]*a[0]-n[0]*p[0] + n[1]*a[1]-n[1]*p[1] + n[2]*a[2]-n[2]*p[2])/float(n[0]*n[0]+n[1]*n[1]+n[2]*n[2])
return [p[0]+t*n[0], p[1]+t*n[1], p[2]+t*n[2]]
def is_same_side(p1,p2, a,b) :
cp1 = cross(vec(a,b), vec(a,p1))
cp2 = cross(vec(a,b), vec(a,p2))
if dot(cp1, cp2)>=0 :return True
else :return False
def is_point_in_triangle(p, a,b,c) :
p = project_point_on_triangle_plane(p, a, b, c)
if is_same_side(p,a, b,c) and is_same_side(p,b, a,c) and is_same_side(p,c, a,b) :return True
else :return False
a, b, c = [1,1,1], [7,1,5], [12,1,1]
p = [7,0,5]
raw_input(is_point_in_triangle(p, a,b,c))
Globalement, la démarche est la suivante :
- recupérer le vecteur normal au triangle (simple produit en croix de deux des vecteurs composant le triangle)
- a partir de là, on peut projeter le point dans le plan du triangle
- vérifier si le point appartient au triangle (pas trop comprit cette partie, mais ça à l'air de marcher)
Encore merci pour ton aide, j'y serais pas arrivé sans toi!