2010-03-16 4 views
3

J'essaye d'écrire du code qui va dessiner la ligne qui est une tangente entre 2 cercles. Jusqu'à présent, j'ai pu dessiner plusieurs cercles et lignes entre les centres.
J'ai une classe qui stocke les valeurs utilisées pour dessiner les cercles (rayon, position). ce dont j'ai besoin est une méthode dans cette classe pour trouver toutes les tangentes possibles entre 2 cercles.
toute aide serait géniale.
ce que j'ai jusqu'à présent (il pourrait très bien être une charge de déchets)tangente de deux cercles

public static Vector2[] Tangents(circle c1, circle c2) 
{ 
      if (c2.radius > c1.radius) 
      { 
       circle temp = c1; 
       c1 = c2; 
       c2 = temp; 
      } 
      circle c0 = new circle(c1.radius - c2.radius, c1.center); 
      Vector2[] tans = new Vector2[2]; 
      Vector2 dir = _point - _center; 
      float len = (float)Math.Sqrt((dir.X * dir.X) + (dir.Y * dir.Y)); 
      float angle = (float)Math.Atan2(dir.X, dir.Y); 
      float tan_length = (float)Math.Sqrt((len * len) - (_radius * _radius)); 
      float tan_angle = (float)Math.Asin(_radius/len); 
      tans[0] = new Vector2((float)Math.Cos(angle + tan_angle), (float)Math.Sin(angle + tan_angle)); 
      tans[1] = new Vector2((float)Math.Cos(angle - tan_angle), (float)Math.Sin(angle - tan_angle)); 
      Vector2 dir0 = c0.center - tans[0]; 
      Vector2 dir1 = c0.center - tans[1]; 

      Vector2 tan00 = Vector2.Add(Vector2.Multiply(tans[0], (float)c2.radius), c1.center); 
      Vector2 tan01 = c2.center; 
      Vector2 tan10 = Vector2.Add(Vector2.Multiply(tans[1], (float)c2.radius), c1.center); 
      Vector2 tan11 = c2.center; 
} 

Répondre

3

à mon humble avis, vous devez d'abord essayer de résoudre le problème avec un crayon et du papier avant de commencer à coder. Ce lien at Mathworld semble être un bon point de départ.

EDIT: The article on this page semble prometteur.

+0

je l'ai fait mais c'est différent quand je l'ai mis dans le code – harryovers

Questions connexes