begin process at 2012 02 10 06:53:20
  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 Transparence dans une picture box [ par johnnous ] bonjour j'ai un soucis je fait une rotation d'une picturebox cela marche bien mais je n'arrive à avoir la couleur transparente private void Ro Alternative à Math.Pow [ par illy86 ] Bonjour, J'utilise la fonction Math.Pow sur deux doubles dans une double boucle parcourant toute une image. Cette méthode me coûte trop de mémoire e equation logistique et structure fractale [ par foufouange ] bon soir je suis entrain de réaliser une application sur la structure fractale des poumons par l'équation logistique.J'espère que vous m'aider à réal Gestion mémoire d'un arbre [ par MasterShadows ] Bonjour à tous et à toutes, Je suis confronté à un problème assez dramatique. Dans ma source déposée [url=http://www.csharpfr.com/codes/WPF-RESOLVEUR probleme C# interface graphique [ par symbashas ] Voici un code que j'essaye de faire et ne reussit pas. Ce que je cherche a faire c'est de calculer le périmétre et la surface d'un carré, d'un rectang Dessinner un graph dans un pannel [ par ben500fr ] Bonjour a tous, Tout d'abord, désolé si je ne suis pas dans la bonne rubrique, 'algorithme/math' me semble le plus proche de ce que je cherche. 1- c Taille de texte dans une richTextBox [ par hanny94 ] Bonjour à tous. J'ai un soucis avec ma comboBox pour que mon texte soit afficher avec une taille de texte. Dans mon programme: Private void Form_Lo


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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,998 sec (4)

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