Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2010, 15:33   #1
Juriec
 
Регистрация: 15.10.2010
Сообщений: 3
Печаль Задача с окружностью и отрезком (C++)

люди!!! помогите пжлста. 3 недели уже парюсь над задачей..(

Задан отрезок своими концами (х1,у1), (х2,у2) и окружность своими радиусом r и центром (х0,у0). Определить, как расположены они друг относительно друга: отрезок внутри окружности, отрезок вне окружности, отрезок и окружность пересекаются.

случай, когда отрезок внутри я рассмотрел. напишите один из случаев когда отрезок вне или пересекает окружность плиз
Juriec вне форума Ответить с цитированием
Старый 15.10.2010, 20:58   #2
vlad_light
Пользователь
 
Регистрация: 27.08.2010
Сообщений: 95
По умолчанию

Отрезок принадлежит внутренности круга <=> когда его концы принадлежат внутренности.
Отрезок пересекает окружность в 1 точке <=> когда 1 конец принадлежат внутренности круга, а 2-ой - не пренадлежит, либо отрезок принадлежит касательной.
Отрезок пересекает окружность в 2 точках <=> высота треугольника ABO, где A,B - координаты концов отрезка, а О - координаты центра круга, проведенная из точки О на сторону АВ, меньше R. (Касается, когда высота равна R).
В других случаях отрезок не имеет общих точек с кругом.
Теперь формулы:
Точка A(x,y) принадлежит внутренности <=> sqr(x-x0) + sqr(y-y0) < sqr(R).
Высоту определяем через площадь:
p=(AB+AO+BO)/2
S=sqrt(p*(p-AB)*(p-AO)*(p-BO));
S=0,5*AB*OH;
OH= sqrt(p*(p-AB)*(p-AO)*(p-BO)) / (0,5*AB)

Надеюсь, подсказки помогут) Если нет - скажи, я напишу код программы.
Но советую всё-таки разобраться в этом!

Последний раз редактировалось vlad_light; 15.10.2010 в 21:01.
vlad_light вне форума Ответить с цитированием
Старый 15.10.2010, 21:01   #3
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Запишем параметрическое уравнение прямой, проходящей через две заданные точки. Подставим x и y, выраженные через t, в уравнение окружности. Получится квадратное уравнение, решения которого - пересечения прямой и окружности. Остаётся только перебрать разные варианты.
circleXline1.gif
Код:
#include <iostream>
#include <cmath>
#include <algorithm>
#include <windows.h>

using namespace std;

inline float sqr(float x)
{
    return x * x;
}

int main()
{
    const float eps = 1e-10;
    SetConsoleOutputCP(1251);
    float x1, y1, x2, y2, x0, y0, r;
    cin >> x1 >> y1 >> x2 >> y2 >> x0 >> y0 >> r;
    float dx01 = x1 - x0, dy01 = y1 - y0, dx12 = x2 - x1, dy12 = y2 - y1;
    float a = sqr(dx12) + sqr(dy12);
    if (fabs(a) < eps)
    {
        cout << "Начало и конец отрезка совпадают!" << endl;
        return 0;
    }
    float k = dx01 * dx12 + dy01 * dy12;
    float c = sqr(dx01) + sqr(dy01) - sqr(r);
    float d1 = sqr(k) - a * c;
    if (d1 < 0)
        cout << "Прямая не пересекается с окружностью - отрезок снаружи" << endl;
    else if (fabs(d1) < eps)
    {
        float t = -k / a;
        float xi = x1 + t * dx12, yi = y1 + t * dy12;
        cout << "Прямая касается окружности в точке "
            "(" << xi << "; " << yi << ")" << endl;
        if (t > 0 - eps && t < 1 + eps)
            cout << "Отрезок снаружи, имеет общую точку с окружностью" << endl;
        else
            cout << "Отрезок строго снаружи" << endl;
    }
    else
    {
        float t1 = (-k + sqrt(d1)) / a, t2 = (-k - sqrt(d1)) / a;
        if (t1 > t2)
            swap(t1, t2);
        float xi1 = x1 + t1 * dx12, yi1 = y1 + t1 * dy12;
        float xi2 = x1 + t2 * dx12, yi2 = y1 + t2 * dy12;
        cout << "Прямая пересекает окружность в двух точках: "
            "(" << xi1 << "; " << yi1 << ")" << " и " <<
            "(" << xi2 << "; " << yi2 << ")" << endl;
        if (t1 >= 0 - eps && t2 <= 1 + eps)
            if (t1 > 0 - eps && t2 < 1 + eps)
                cout << "Отрезок строго внутри" << endl;
            else
                cout << "Отрезок внутри, имеет как минимум одну общую точку с окружностью" << endl;
        else if (t2 <= 0 + eps || t1 >= 1 - eps)
            if (t2 < 0 + eps || t1 > 1 - eps)
                cout << "Отрезок строго снаружи" << endl;
            else
                cout << "Отрезок снаружи, имеет общую точку с окружностью" << endl;
        else
            cout << "Отрезок пересекает окружность в двух точках" << endl;
    }
    cin.sync();
    cin.peek();
}
Somebody вне форума Ответить с цитированием
Старый 22.10.2010, 16:08   #4
Juriec
 
Регистрация: 15.10.2010
Сообщений: 3
Счастье

всё, разобрался))) спс всем)
Juriec вне форума Ответить с цитированием
Старый 22.10.2010, 17:15   #5
Kingdom_Reborn
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 130
По умолчанию

Такой вариант: Находим уравнение прямой, которая проходит через отрезок и находим расстояние от центра окружности до прямой. Если оно больше радиуса - то отрезок вне окружности, если меньше, то: если расстояние от центра окружности до обоих концов отрезка меньше радиуса, то отрезок внутри, иначе пересекает окружность.
Kingdom_Reborn вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
delphi управление окружностью tanek Помощь студентам 10 06.03.2010 20:58
Задача по си++ lubafffka Помощь студентам 1 03.05.2009 20:42
Определить, совпадает ли текст с конечным отрезком ряда 0123456789 stasig Паскаль, Turbo Pascal, PascalABC.NET 2 09.12.2008 22:52
Кто поможет с "пульсирующей" окружностью??? Solny6ko YasnoE Помощь студентам 11 18.05.2007 20:27