Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3009 connectés 

 


Dernière réponse
Sujet : 3D : Savoir si un point appartient a un triangle. [probleme d'algo]
Slide

Hercule a écrit a écrit :

 
Tu te retrouves donc avec une equation:
ax+by+cz+d=0. Tu connais a b c. Tu as un point qui verifie l'équation (un sommet du triangle appartient au plan). Il te reste que "d" comme inconnu (tu saura résoudre l'équation j'espère).




 
Voilà :) merci bcp ;p
C'est fait !!!
Bon, ca semble marchait, mais, j'ai pas encore tt testé
 

Code :
  1. function TForm1.CollisionTriangulisationSpace(Const X,Y,Z:Double; Const point1,point2,point3:TSpacePoint):boolean;
  2. var
  3.   VNormal:TSpacePoint;
  4.   IconnuD:double;
  5.   begin
  6. {ax+by+cz+d=0
  7. a= VNormal.X
  8. b= VNormal.Y
  9. c= VNormal.Z
  10. d= IconnuD
  11. VNormal.X*X+VNormal.Y*Y+VNormal.Z*Z+IconnuD=0;}
  12. VNormal.X:=(point1.Y-point2.Y)*(point3.Z-point2.Z)-(point1.Z-point2.Z)*(point3.Y-point2.Y);
  13. VNormal.Y:=(point1.Z-point2.Z)*(point3.X-point2.X)-(point1.X-point2.X)*(point3.Z-point2.Z);
  14. VNormal.Z:=(point1.X-point2.X)*(point3.Y-point2.Y)-(point1.Y-point2.Y)*(point3.X-point2.X);
  15. IconnuD:=-(VNormal.X*point1.X+VNormal.Y*point1.Y+VNormal.Z*point1.Z);
  16. result:=false;
  17. IF ((CollisionTriangulisation(X,Y,point1,point2,point3))
  18. and (trunc(VNormal.X*X+VNormal.Y*Y-VNormal.Z*Z+IconnuD)=0)) then result:=true;
  19. end;


 
Edit: Erreur de signe


Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
Slide

Hercule a écrit a écrit :

 
Tu te retrouves donc avec une equation:
ax+by+cz+d=0. Tu connais a b c. Tu as un point qui verifie l'équation (un sommet du triangle appartient au plan). Il te reste que "d" comme inconnu (tu saura résoudre l'équation j'espère).




 
Voilà :) merci bcp ;p
C'est fait !!!
Bon, ca semble marchait, mais, j'ai pas encore tt testé
 

Code :
  1. function TForm1.CollisionTriangulisationSpace(Const X,Y,Z:Double; Const point1,point2,point3:TSpacePoint):boolean;
  2. var
  3.   VNormal:TSpacePoint;
  4.   IconnuD:double;
  5.   begin
  6. {ax+by+cz+d=0
  7. a= VNormal.X
  8. b= VNormal.Y
  9. c= VNormal.Z
  10. d= IconnuD
  11. VNormal.X*X+VNormal.Y*Y+VNormal.Z*Z+IconnuD=0;}
  12. VNormal.X:=(point1.Y-point2.Y)*(point3.Z-point2.Z)-(point1.Z-point2.Z)*(point3.Y-point2.Y);
  13. VNormal.Y:=(point1.Z-point2.Z)*(point3.X-point2.X)-(point1.X-point2.X)*(point3.Z-point2.Z);
  14. VNormal.Z:=(point1.X-point2.X)*(point3.Y-point2.Y)-(point1.Y-point2.Y)*(point3.X-point2.X);
  15. IconnuD:=-(VNormal.X*point1.X+VNormal.Y*point1.Y+VNormal.Z*point1.Z);
  16. result:=false;
  17. IF ((CollisionTriangulisation(X,Y,point1,point2,point3))
  18. and (trunc(VNormal.X*X+VNormal.Y*Y-VNormal.Z*Z+IconnuD)=0)) then result:=true;
  19. end;


 
Edit: Erreur de signe

Hercule tu trouve l'equation du plan.
a,b,c,d sont les constante du plan :
ax+by+cz+d=0.
Donc un point A(x,y,z) appartient au plan si
ax+by+cz+d=0.
 
Pour une droite en 2D (cours de math de base):
y=ax+b;
 
Pour obtenir l'equation du plan par rapport au triangle:
Tu calcules une normal au triangle  
(en faisant le produit vectoriel des vecteurs de 2 cotés du triangle). Les coordonnées du vecteur normal sont les coeff a b c
 
Tu te retrouves donc avec une equation:
ax+by+cz+d=0. Tu connais a b c. Tu as un point qui verifie l'équation (un sommet du triangle appartient au plan). Il te reste que "d" comme inconnu (tu saura résoudre l'équation j'espère).
 
 
pour le reste tu as:
http://www.blackpawn.com/texts/poi [...] fault.html
http://www.siggraph.org/education/ [...] ection.htm
 
darkoli

Slide a écrit a écrit :

Bon voilà, je voudrais determiné si un point appartient a un triangle en 3D. Je l'ai dejà fait en pour la 2D, voici mon code, qui fonctionne d'ailleur .



 
Donc tu parles d'une "pyramide avec une base triangulaire" => un volume
Dans ce cas tu a le produit mixte !!!
Ca permet pour une face donnée de savoir de quel côté de la face se trouve ton point (côté intérieur ou côté exterieure du triangle).
 
Je l'ai fait avec un cube et ça marche bien.

Slide http://wims.unice.fr/~wims/wims.cg [...] r&+cmd=new
 
Heu lol :) J'ai pas reussi l'exercice, c'est pas de mon niveau, ouinnnnnn, pouvez pas m'aider pls :p
Slide

patbasi a écrit a écrit :

Juste une chtite suggestion en passant (avant de dodoter):
 
1/ teste si le point appartient au même plan que le triangle (équation de plan je crois que c de la forme ax+by+cz+d=0)
 
2/Si oui: tu te ramènes à un problème plan comme tu l'as fait avant
 
Cependant il y a peut-être (probablement?) plus simple et plus rapide; mais bon c toujours un point de départ.




 
Quelqu'un m'a parlé de ax+by+cz+d=0, le probleme est que j'ai jamais utilisé ca en cours, en gros ca donnerait un system du genre :
 
a*point1.x+b*point1.y+c*point1.z+d=0
a*point2.x+b*point2.y+c*point2.z+d=0
a*point3.x+b*point3.y+c*point3.z+d=0
 
Ensuite, je ne vois pas du tout quoi faire, on ma dit de mettre pour a, b et c, les coordonnées du point a verifié, et que si l'equation n'était pas egal à O, alors le point ne fait pas partie du plan, mais pour le point d, je mets quoi ???
 
Tu m'explique please ? ca ne doit pas etre compliquer.
 
Merci :p

PatBasi Juste une chtite suggestion en passant (avant de dodoter):
 
1/ teste si le point appartient au même plan que le triangle (équation de plan je crois que c de la forme ax+by+cz+d=0)
 
2/Si oui: tu te ramènes à un problème plan comme tu l'as fait avant
 
Cependant il y a peut-être (probablement?) plus simple et plus rapide; mais bon c toujours un point de départ.
Slide Bon voilà, je voudrais determiné si un point appartient a un triangle en 3D. Je l'ai dejà fait en pour la 2D, voici mon code, qui fonctionne d'ailleur  .  
 
Au faite, si vous voulez savoir pourquoi je cherche pour un triangle et pas pour d'autre forme geometrique, c'est tres simple : Un carré, un losange, un quadrlatere, ou autre, est un assemblage de triangle  donc, suffit de le faire pour les triangles, est de decoupé les otres formes en triangle  
 
Bon, voilà donc le code que j'ai fait pour l'axe X et Y. Il ne manque que l'axe des Z maintenant...  
 
//------------------CODE------------------  
type TSpacePoint = packed record  
  X: Double;  
  Y: Double;  
  Z: Double;  
end;  
 
function TForm1.CollisionTriangulisation(Const X,Y : Double; Const point1,point2,point3:TSpacePoint):boolean;  
var  
  CoeffA1,PtsOrigineB1,Ycomp1; Double;  
  CoeffA2,PtsOrigineB2,Ycomp2; Double;  
  CoeffA3,PtsOrigineB3,Ycomp3; Double;  
  point1c,point2c,point3c,pointT:TSpacePoint;  
  begin  
point1c:=point1;  
point2c:=point2;  
point3c:=point3;  
  If ((point1.x<point2.x)) then  
  begin  
  pointT:=point1c;  
  point1c:=point2c;  
  point2c:=pointT;  
  end;  
 
  //ax+b=y  
  CoeffA1:=((point1c.y-point2c.y)/(point1c.x-point2c.x));  
  PtsOrigineB1:=(point2c.y-((point1c.y-point2c.y)/(point1c.x-point2c.x))*point2c.x);  
 
  CoeffA2:=((point2c.y-point3c.y)/(point2c.x-point3c.x));  
  PtsOrigineB2:=(point3c.y-((point2c.y-point3c.y)/(point2c.x-point3c.x))*point3c.x);  
 
  CoeffA3:=((point3c.y-point1c.y)/(point3c.x-point1c.x));  
  PtsOrigineB3:=(point1c.y-((point3c.y-point1c.y)/(point3c.x-point1c.x))*point1c.x);  
 
  Ycomp1:=CoeffA1*X+PtsOrigineB1;  
  Ycomp2:=CoeffA2*X+PtsOrigineB2;  
  Ycomp3:=CoeffA3*X+PtsOrigineB3;  
 
  result:=false;  
 
If ((point3c.y>point1c.y) or (point3c.y>point2c.y)) then  
    If    (((point1c.x>point3c.X) and (point2c.x<point3c.x) and (Y>Ycomp1) and (Y<Ycomp2) and (Y<Ycomp3)) //  + milieu  
        or ((point1c.x<point3c.X)                        and (Y>Ycomp1) and (Y<Ycomp2) and (Y>Ycomp3))  // + droite  
        or ((point2c.x>point3c.X)                        and (Y>Ycomp1) and (Y>Ycomp2) and (Y<Ycomp3)))  // + gauche  
        then result:=true;  
 
If ((point3c.y<point1c.y) or (point3c.y<point2c.y)) then  
    If (((point1c.x>point3c.X) and (point2c.x<point3c.x) and (Y<Ycomp1) and (Y>Ycomp2) and (Y>Ycomp3)) //  + milieu  
        or ((point1c.x<point3c.X) and (Y<Ycomp1) and (Y>Ycomp2) and (Y<Ycomp3))  // + droite  
        or ((point2c.x>point3c.X) and (Y<Ycomp1) and (Y<Ycomp2) and (Y>Ycomp3))) // + gauche  
        then result:=true;  
end;  
//------------------CODE------------------  
 
Je ne pense pas obtenir de l'aide, car ce probleme est complexe, mais, j'essai quand meme de poser ma question ici, on sait jamais que quelqu'un m'aide  
 
Au faite, me renoyer pas sur www.google.com ou sur une otre page du genre, moi je veux le faire moi meme ;p , ou avec votre aide.  
 

Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR