begin process at 2010 02 09 22:33:27
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Algorithme

 > 

Maths

 > 

Collision avec un segment


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Collision avec un segment

jeudi 21 mai 2009 à 17:31:44 | Collision avec un segment

Kite37

Bonjour,

Dans le cadre de développement d'un mini jeu, je doit faire régulièrement des vérifications de collisions entre des cercles ou des points et des segments.

La détection entre un segment et un cercle marche très bien avec le code si dessous (qui est une application du théorème d'al kaishi) mais dès que je veut mettre un rayon de 0 en paramètre pour détecter un point (par exemple un click) cela ne marche pas.

A défaut de trouver le correctif rendant ce morceau de code viable pour les cercles et les points, quelqu'un peut-il poster une méthode simple et efficace qui permet de vérifier si un point est bien dans un segment?

(j'ai essayé d'autre méthode qui utilise les principes de colinéarité de vecteur, etc, mais ça ne veut pas marcher non plus, à n'y rien comprendre).

Voici mon code :

public bool collideCercle(int rayon, Vector2 centre)
         {

             for (int i = 0; i < nombreNoeuds; i++)
             {

                 if (Math.Abs(noeuds[i].X - centre.X) <= rayon && Math.Abs(noeuds[i].Y - centre.Y) <= rayon)
                     return true;

                     float projeté;
                     float ACentre;
                     float BCentre;
                     float AB;

                     float maxACentre;
                  

                     float angleSegmentSegCentre;
                   
                     if (i < nombreNoeuds - 1)
                     {
                         ACentre = (float)Math.Sqrt(Math.Pow((centre.X - noeuds[i].X),2) + Math.Pow((centre.Y - noeuds[i].Y),2) );
                         BCentre = (float)Math.Sqrt(Math.Pow((centre.X - noeuds[i + 1].X) ,2)+Math.Pow((centre.Y - noeuds[i + 1].Y),2));
                         AB = (float)Math.Sqrt(Math.Pow((noeuds[i].X - noeuds[i + 1].X),2)+Math.Pow((noeuds[i].Y - noeuds[i + 1].Y),2));

                         angleSegmentSegCentre = (float)Math.Acos((Math.Pow(ACentre,2)+Math.Pow( AB,2) - Math.Pow(BCentre,2)) / (2 * AB * ACentre));
                        
                         projeté = ACentre * (float)Math.Sin(angleSegmentSegCentre);

                         maxACentre = (float)Math.Sqrt(Math.Pow(projeté,2) + Math.Pow(AB,2));
                      
                         if (projeté <= rayon && ACentre <= maxACentre && BCentre <= maxACentre)
                                 return true;
                        
                     }
                     else
                     {
                         ACentre = (float)Math.Sqrt(Math.Pow((centre.X - noeuds[i].X), 2) + Math.Pow((centre.Y - noeuds[i].Y), 2));
                         BCentre = (float)Math.Sqrt(Math.Pow((centre.X - noeuds[ 0].X), 2) + Math.Pow((centre.Y - noeuds[ 0].Y), 2));
                         AB = (float)Math.Sqrt(Math.Pow((noeuds[i].X - noeuds[ 0].X), 2) + Math.Pow((noeuds[i].Y - noeuds[ 0].Y), 2));

                         angleSegmentSegCentre = (float)Math.Acos((Math.Pow(ACentre, 2) + Math.Pow(AB, 2) - Math.Pow(BCentre, 2)) / (2 * AB * ACentre));

                         projeté = ACentre * (float)Math.Sin(angleSegmentSegCentre);

                         maxACentre = (float)Math.Sqrt(Math.Pow(projeté, 2) + Math.Pow(AB, 2));

                         if (projeté <= rayon && ACentre <= maxACentre && BCentre <= maxACentre)
                             return true;

                     }



                
                
             }
             return false;

         }


Merci de votre attention


Cordialement,


KiTe.
vendredi 22 mai 2009 à 14:55:05 | Re : Collision avec un segment

GG29

Membre Club
Pour détecter si un point est sur un segment il suffit de calculer la distance entre le point A du segment et le point P ainsi que la distance entre le point P et le point B. Si la somme des 2 distances vaut la longueur du segment AB alors le point est sur le segment.

  A                P                        B
  +-----------+----------------+
  <-----------><--------------->
 
dimanche 24 mai 2009 à 14:00:43 | Re : Collision avec un segment

Kite37

Bonjour,

J'avais aussi testé cette méthode qui marchait plutôt bien, mais certains points ne passaient pas, sans savoir pourquoi ...

J'ai testé la méthode que vous avez posté, la vérification de colinéarité, la méthode d'Al Kashi et d'autres, mais dans tous les cas il y avait des imprécisions plus ou moindre ... sans pour autant trouver d'où elles venaient =S.

En tout cas merci d'avoir pris le temps de m'aider, je vais continuer à faire des tests d'ici peu ^^

Cordialement

KiTe.
_____________________________________
La connaissance est le plus précieux des trésors.


Cette discussion est classée dans : math, centre, float, noeuds, pow


Répondre à ce message

Sujets en rapport avec ce message

Math.Pow je comprend pas :S [ par floc95 ] Bonjour à tous :) Alors voilà mon problème, je voudrais faire une puissance et donc j'ai vu qu'il faut mettre Math.Pow pour le faire mais en mettant rotation image [ par johnnous ] bonsoir j'aimerais faire tourner une picturebox1 dans une autre picturebox2 je veux faire une rotation par le coin superieur gauche cela marche mais l Comparer des noeuds XML [ par rintchu ] salut,je voudrais pouvoir comparer des noeuds XML. Le probleme c'est que selon la methode que j'utilise, soit ils sont tjs différents, soit ils sont t prob chargement dll/conversion de type cpp/c# [ par davtemp ] bonjour,J'ai un programme en cpp 6.0 qui charge une dll compilée aussi en cpp 6.0. Mon programme fonctionne bien et j'en suis bien content, sauf que l [C#] Problème de float = - INFINITY [ par flo040903 ] Bonjour, J'utilise une variable R0 de type Float dans un programme en C#. Dans le test que je fais R0 = 97.86.Dans les calculs que je réalise, je suis Comment modifier les images des noeuds des TreeView? [ par nicola2s ] J'ai créé un treeview et j'aimerai que mes noeuds apparaissent avec l'image d'un dossier et que les fichiers apparaissent avec une autre imageJe sais Problème avec l'affichage des données de PostgreSQL (WebAppli) [ par juaker ] Slt à vous,J'ai un problème concernant l'affichage des informations contenues dans ma base PostgreSQL.En fait j'utilise un odbcDataAdapter.fill avec u Transition [ par fabmas ] Bonjour,je cherche a programmer des transitions :pour cela je cree un tableau de bitmap (pour le double buffer)je boucle x fois pour le remplir avec u Impression [ par RM50Man ] Voila le code , j utilise ce code pour faire un apercu mais et le code se termine jamais le nombre de page de l apercu ne cesse d augmentercomme une b conversion de valeurs numériques de varchar vers float? [ par firas_tn ] Salut a tous,j'ai une table ou il ya des valeurs numériques et lkeurs type est varchar mais le probleme lors de la connexion a la base il ya une instr


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,374 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales