Comment savoire si un segment coupe un polygonne ou pas? [Résolu]

svirpiren 29 Messages postés mercredi 15 décembre 2004Date d'inscription 23 février 2011 Dernière intervention - 4 mai 2005 à 15:17 - Dernière réponse : svirpiren 29 Messages postés mercredi 15 décembre 2004Date d'inscription 23 février 2011 Dernière intervention
- 5 mai 2005 à 10:50
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
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
KeniiyK 326 Messages postés vendredi 13 août 2004Date d'inscription 2 novembre 2007 Dernière intervention - 4 mai 2005 à 20:07
3
Merci
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

Merci KeniiyK 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de KeniiyK
Meilleure réponse
KeniiyK 326 Messages postés vendredi 13 août 2004Date d'inscription 2 novembre 2007 Dernière intervention - 4 mai 2005 à 20:12
3
Merci
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

Merci KeniiyK 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

Commenter la réponse de KeniiyK
svirpiren 29 Messages postés mercredi 15 décembre 2004Date d'inscription 23 février 2011 Dernière intervention - 4 mai 2005 à 15:17
0
Merci
a oui, j'oublié on est dans l'espace

pierre
Commenter la réponse de svirpiren
cs_Joky 1791 Messages postés lundi 22 novembre 2004Date d'inscription 31 janvier 2009 Dernière intervention - 4 mai 2005 à 15:48
0
Merci
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
Commenter la réponse de cs_Joky
cs_Joky 1791 Messages postés lundi 22 novembre 2004Date d'inscription 31 janvier 2009 Dernière intervention - 4 mai 2005 à 15:49
0
Merci
Euh pardon, s'il est colinéaire au vecteur normal, il le coupe désolé


void Aurevoir( void ); //Bonne journée
Commenter la réponse de cs_Joky
Arnaud16022 1329 Messages postés vendredi 15 août 2003Date d'inscription 16 juin 2010 Dernière intervention - 4 mai 2005 à 16:54
0
Merci
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
Commenter la réponse de Arnaud16022
svirpiren 29 Messages postés mercredi 15 décembre 2004Date d'inscription 23 février 2011 Dernière intervention - 4 mai 2005 à 19:31
0
Merci
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
Commenter la réponse de svirpiren
Arnaud16022 1329 Messages postés vendredi 15 août 2003Date d'inscription 16 juin 2010 Dernière intervention - 4 mai 2005 à 19:38
0
Merci
voila

ou alors: coldet.dll, tres bien

_______________________


Omnia vincit labor improbus
Commenter la réponse de Arnaud16022
Arnaud16022 1329 Messages postés vendredi 15 août 2003Date d'inscription 16 juin 2010 Dernière intervention - 4 mai 2005 à 21:06
0
Merci
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
Commenter la réponse de Arnaud16022
KeniiyK 326 Messages postés vendredi 13 août 2004Date d'inscription 2 novembre 2007 Dernière intervention - 4 mai 2005 à 21:19
0
Merci
Pardon j'avais pas vu que tu l'avais mailé, mais bon avec deux sources maintenant il va s'en sortir...

KeniiyK
Commenter la réponse de KeniiyK
Arnaud16022 1329 Messages postés vendredi 15 août 2003Date d'inscription 16 juin 2010 Dernière intervention - 4 mai 2005 à 21:21
0
Merci
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
Commenter la réponse de Arnaud16022
svirpiren 29 Messages postés mercredi 15 décembre 2004Date d'inscription 23 février 2011 Dernière intervention - 5 mai 2005 à 10:50
0
Merci
mercie a tous, je v voire ca

pierre
Commenter la réponse de svirpiren

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.