Пересечение прямой с окружностью



Дано прямая и окружность
Найти точки пересечения окружности и прямой
Идея заключается в повороте окружности и прямой, чтоб прямая совпала с осью абцисс.
Находим точки пересечения окружности и оси абцисс, а потом поворачиваем их обратно.

Листинг C++

int cross_line_circle (line l, circle c, point &p1, point &p2)
{
    // проекция центра окружности на прямую
    point p = closest_point (l, c.c);
    // сколько всего решений?
    int flag = 0;
    double d = dist (c.c, p);
    if (abs (d - c.r) <= eps) flag = 1;
    else
        if (c.r > d) flag = 2;
        else return 0;

    // находим расстояние от проекции до точек пересечения
    double k = sqrt (c.r * c.r - d * d);
    double t = dist (point (0, 0), point (l.b, - l.a));
    // добавляем к проекции векторы направленные к точкам пеерсечения
    p1 = add_vector (p, point (0, 0), point (- l.b, l.a), k / t);
    p2 = add_vector (p, point (0, 0), point (l.b, - l.a), k / t);

    return flag;
}

27.06.2007, 13:59

По всем вопросам обращаться: rumterg@gmail.com