Comment savoire si un segment coupe un polygonne ou pas?

[Résolu]
Signaler
Messages postés
29
Date d'inscription
mercredi 15 décembre 2004
Statut
Membre
Dernière intervention
23 février 2011
-
Messages postés
29
Date d'inscription
mercredi 15 décembre 2004
Statut
Membre
Dernière intervention
23 février 2011
-
bonjour, j'aurai besoin de savoire comment es-ce que l'on peu faire
pour savoire si un segment dont on connait les coordonnées passa au
traver un quadrilatére dont on connait les coordonnées des sommet.

merci d'avance


pierre

12 réponses

Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Tiens, je te poste ici une de mes fonctions pour savoir si il y a intersection, et ou... avec un triangle -> assez simple pour l'adapté au quad planaire...

Demi-droite : position (pos ) + une direction (dir) normalisée
Le triangle pt[3]

Le type CPoint3 represente un point ou un vecteur 3D....

bool CLASSE::Intersection(const CPoint3& pos,const CPoint3& dir,const CPoint3 pt[3])
{
// normale du triangle
CPoint3 normal=(pt[1]-pt[0])^(pt[2]-pt[0]); // produit vectoriel


// si la direction est // a la face FALSE
float dotProd2=normal*dir; // produit scalaire
if(dotProd2==0.0f)
{
return false;
}


// calcul de la distance entre position et intersection
float dotProd1=normal*pos;
float d=-(normal*pt[0]);
t=(-dotProd1-d)/(dotProd2);


// calcul de l'intersection
CPoint3 ptInters=pos+dir*t;


// Si l'intersection est egale a un des points TRUE
if(ptInters==pt[0] || ptInters==pt[1] || ptInters==pt[2])
{
return true;
}


CPoint3 vect1=pt[0]-ptInters;
CPoint3 vect2=pt[1]-ptInters;
CPoint3 vect3=pt[2]-ptInters;


CPoint3 crossProd1=vect1^vect2;
CPoint3 crossProd2=vect2^vect3;
CPoint3 crossProd3=vect3^vect1;


// Si l'intersection est sur une arete TRUE
if(crossProd1.IsNull() && (vect1*vect2<0.0f))
{
return true;
}
if(crossProd2.IsNull() && (vect2*vect3<0.0f))
{
return true;
}
if(crossProd3.IsNull() && (vect3*vect1<0.0f))
{
return true;
}


// Si le point est hors du triangle FALSE
if(crossProd1*crossProd2<=0.0f)
{
return false;
}
if(crossProd2*crossProd3<=0.0f)
{
return false;
}


// Si on arrive ici, l'intersection est dans le triangle TRUE
return true;
}

KeniiyK
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Pardon, j'ai enleve d'autres test (relatif a mon prg) mais on peut rajouter le test suivant si on ne veut pas d'intersection "derriere" notre point etant donne la direction :
.
.
.
// calcul de la distance entre position et intersection
float dotProd1=normal*pos;
float d=-(normal*pt[0]);
t=(-dotProd1-d)/(dotProd2);

if(t<0.0f) return false // pas d'intersection derriere
if(t<=0.0f) // pas d'intersection derriere ni egale a la position
.
.
.

KeniiyK
Messages postés
29
Date d'inscription
mercredi 15 décembre 2004
Statut
Membre
Dernière intervention
23 février 2011

a oui, j'oublié on est dans l'espace

pierre
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Oula lol
Bé selon les mathématiques :)
Le segment à un vecteur directeur, si il est colinéaire à un des vecteur normal des plans définis par ton quadrilataire, il ne coupera pas le plan concerné...
Mais traduire ça en C++ :)
Bé euh il doit avoir plus simple j'présume


void Aurevoir( void ); //Bonne journée
Messages postés
1787
Date d'inscription
lundi 22 novembre 2004
Statut
Membre
Dernière intervention
31 janvier 2009
2
Euh pardon, s'il est colinéaire au vecteur normal, il le coupe désolé


void Aurevoir( void ); //Bonne journée
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
ca c'était chez digiben du temps ou c'était pas payant :(

j'ai encore ses tutos qqpart sur le disque, donne moi ton mail et je t'envoie tt ca

++

ad


_______________________


Omnia vincit labor improbus
Messages postés
29
Date d'inscription
mercredi 15 décembre 2004
Statut
Membre
Dernière intervention
23 février 2011

mon mail : seigneurvirpiren@msn.com (mercie)

et pour la réponse avec le vecteur normal, c que mon but c
d'empeché des objet de passer au travers de polygone dans l'espace,
donc il fo que je sache si il coupe dans le polygone ou pas

mercie quand meme

+


pierre
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
voila

ou alors: coldet.dll, tres bien

_______________________


Omnia vincit labor improbus
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
oui ca a l'air bon, plsu ou moins la meme chose que ce que j'ai mailé.

bonne suite

++

ad

_______________________


Omnia vincit labor improbus
Messages postés
326
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
2 novembre 2007
2
Pardon j'avais pas vu que tu l'avais mailé, mais bon avec deux sources maintenant il va s'en sortir...

KeniiyK
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
aucun pb, je vais pas me vexer pr ca tu sais, 2 tiens valent mieux que 1 tu l'auras lol

_______________________


Omnia vincit labor improbus
Messages postés
29
Date d'inscription
mercredi 15 décembre 2004
Statut
Membre
Dernière intervention
23 février 2011

mercie a tous, je v voire ca

pierre