2017-04-25 15 views
0

J'essaie d'apprendre à définir et à détecter mathématiquement les «coups» sur une capsule 2D.Détection de collision pour une capsule 2D ou une sphère balayée

Je définis et détecte des hits sur un cercle 2D. Voici ma classe:

class Circle 
{ 
    private double xpos; 
    private double ypos; 
    private double radius; 

    public Circle(double x, double y, double r) 
    { 
     xpos = x; 
     ypos = y; 
     radius = r; 
    } 

    public bool HitCircle(double x, double y) 
    { 
     bool hit = false; 

     double distance = Math.Pow(x - xpos, 2) + Math.Pow(y - ypos, 2);   
     if (distance <= radius * radius) hit = true; 

     return hit; 
    } 
} 

Le cercle est une position x et y et un rayon. La fonction HitCircle est l'implémentation C# de la formule de distance.

Une capsule est définie comme 4 points et un rayon:

class Capsule 
{ 
    double x1pos; 
    double y1pos; 
    double x2pos; 
    double y2pos; 
    double radius; 

    public Capsule(double x1, double y1, double x2, double y2, double r) 
    { 
     x1pos = x1; 
     y1pos = y1; 
     x2pos = x2; 
     y2pos = y2; 
     radius = r; 
    } 

    public bool HitCapsule(double x, double y) 
    { 
     bool hit = false; 
     //?? This is where I need help 
     return hit; 
    } 
} 

J'ai besoin d'aide pour comprendre et mettre en œuvre le calcul de la fonction HitCapsule dans la classe de capsule. Si je comprends bien, une capsule est comme un cercle, sauf qu'au lieu d'avoir un rayon autour d'un seul point, elle a un rayon autour d'un segment de droite. Pour l'instant, j'essaie juste d'entourer mon cerveau de certaines de ces définitions géométriques. Je pourrais essayer de transformer cela en un rayon rayonnant simple dans le futur mais je voulais aller directement à ces parties mathématiques.

Merci. Je ne sais pas si cela est utile, mais voici mon 2d "raytracer." Il dessine le cercle à la console en utilisant ascii. C'est utile de me montrer que j'ai correctement mis en place les maths.

static void Main(string[] args) 
    { 
     double aimx = 30; 
     double aimy = 8; 

     Circle circle = new Circle(45, 13, 12); 
     bool hit = circle.HitCircle(aimx, aimy); 

     Console.WriteLine("Did we hit? {0}", hit); 


     for(int y = 26; y >= 0; y--) 
     { 
      for(int x = 0; x < 90; x++) 
      { 
       if(x == aimx && y == aimy) //Draw target 
       { 
        Console.Write("X"); 
       } 
       else if(circle.HitCircle(x, y)) //Draw all circle hits 
       { 
        Console.Write("#"); 
       } 
       else 
       { 
        Console.Write("-"); 
       } 
      } 
      Console.Write('\n'); 
     } 
     Console.Read(); 
    } 
} 

Répondre

1

L'intersection de point à capsule est un cas de calcul de la distance du point au segment de ligne qui définit la capsule. Si c'est < = r alors vous vous croisez.

There's a question here that shows how to find that distance, mais il suppose une familiarité avec les vecteurs et le produit scalaire.

+0

Merci pour le lien, je suis en train de le lire maintenant. On dirait que les maths deviennent assez excitants. – ekcell

+0

Vous n'avez encore rien vu. C'est l'un des problèmes les plus simples dans la collision –

+0

J'ai pu obtenir une capsule à travailler en utilisant le lien que vous avez fourni. Je travaille toujours à comprendre les maths mais c'est certainement la bonne direction. – ekcell