касательная двух окружностей - PullRequest
3 голосов
/ 16 марта 2010

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

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

1 Ответ

3 голосов
/ 17 марта 2010

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

РЕДАКТИРОВАТЬ: Статья на этой странице выглядит многообещающе.

...