2010-03-16 3 views
3

Я пытаюсь написать код, который рисует линию, которая является касательной между двумя кругами. до сих пор я мог рисовать несколько кругов и линии между центрами.
У меня есть класс, который хранит значения, используемые при рисовании кругов (радиус, положение). Мне нужен метод в этом классе, чтобы найти все возможные касания между двумя кругами.
любая помощь была бы замечательной.
это то, что я до сих пор (это очень хорошо может быть груз мусора)тангенс из двух кругов

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; 
} 

ответ

3

ИМХО вы должны сначала попытаться решить проблему с помощью карандаша и бумаги, прежде чем начать кодирование. Эта ссылка at Mathworld кажется хорошей отправной точкой.

EDIT: The article on this page выглядит перспективным.

+0

Я сделал это, но он отличается, когда я помещаю его в код – harryovers