Arbre BSP

Signaler
Messages postés
10
Date d'inscription
mercredi 29 octobre 2003
Statut
Membre
Dernière intervention
12 mai 2004
-
Messages postés
10
Date d'inscription
mercredi 29 octobre 2003
Statut
Membre
Dernière intervention
12 mai 2004
-
Je suis en train de coder la gestion d'un niveau avec un arbre bsp et je n'arrive pas à coder une fonctions.

Face decoupeface (Face f, const facePrincipal* p){}

en gros coupe la face en deux par la facePrincipale et stocke une partie dans Face(return) et l'autre dans f.

voila si quelqu'un pouvait m'orienter dans une direction parce que je ne vois pas comment empoigner le probleme.
merci d'avance.

Zyvon

2 réponses

Messages postés
2835
Date d'inscription
lundi 11 août 2003
Statut
Modérateur
Dernière intervention
16 décembre 2006
10
:big) Neodante :big)

Normal que tu ais du mal, c'est l'une des fonctions les plus dure à coder pour la construction d'un arbre BSP. Je pense que tu utilises un arbre BSP 3D puisque tu utilises un plan (face ?) pour découper une autre face ! Malheureusement cette algo est assez dur à réaliser là tout de suite devant mon écran en plein cours !! Mais ce soir je vais regarder si je peux retrouver un bout de code là dessus et te l'envoyer ?
@+
Messages postés
10
Date d'inscription
mercredi 29 octobre 2003
Statut
Membre
Dernière intervention
12 mai 2004

Voila deux fonctions que j'ai codé...
Ca marche pas mais peut-être ca peut vous eclairer sur mon probleme...

Point cut(const Plan* p, const Point a,const Point b)
{
float decal;
float da = produit_scalaire(p->vecteur_normal,a);
float db = produit_scalaire(p->vecteur_normal,b);
if(db-da == 0)
return a;
decal= ( 0-da ) / ( db - da );
Point c;
c.X = a.X + decal*(b.X - a.X);
c.Y = a.Y + decal*(b.Y - a.Y);
c.Z = a.Z + decal*(b.Z - a.Z);
c.u =0.0;
c.v =0.0;
return c;
}

Face decoupe_face (Face f, const Plan* p, bool avant){

int i, j,if1,if2;
Face f1;
Face f2;
f1 = f;
f2 = f;
f1.nombre_point = 0;
f2.nombre_point = 0;
if1 = 0;
if2 = 0;
// Pour chaque segment du polygone
for (i=(f.nombre_point-1), j=0; j(f.nombre_point); i=j++){
// Distance du pt 0 au plan

float d0 = distance_plan(p,f.liste_point[i]);
float d1 = distance_plan(p,f.liste_point[j]);

// pt 0 derrière ?
if (d0 < 0) {
// Ajoute un point au polygone arrière
f1.liste_point[if1]=f.liste_point[i];
f1.nombre_point++; if1++;
}
else
// Ajoute un point au polygone avant
f2.liste_point[i]=f.liste_point[i]; f2.nombre_point++;
if2++;

// Les deux points sont-ils du même coté ?
if (d0*d1 < 0)
{ // Non, découpe le segment Point newPoint = cut (p, f.liste_point[i],f.liste_point[j]);

// Ajoute ce point aux 2 polygones
f1.liste_point[if1]= newPoint;
f2.liste_point[if2]= newPoint; f1.nombre_point++; f2.nombre_point++;
if1++;
if2++;
}
}

if (avant) {
return f1;
}else return f2;
}