Поиск:

Ответ в темуСоздание новой темы Создание опроса
> площадь пресечения круга и треугольника 
:(
    Опции темы
tennisru
Дата 6.1.2012, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 3.12.2011

Репутация: нет
Всего: нет




дано координаты центра и радиус окружности, координаты треугольника.
найти площадь пресечения круга и треугольника , с погрешностью 0,0000001
даже не представляю как это делать, через вектора но как?
PM MAIL   Вверх
maxdiver
Дата 6.1.2012, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



PM MAIL WWW ICQ   Вверх
sQu1rr
Дата 7.1.2012, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: нет
Всего: 13



Очень хороший вариант описан тут
Цитата(maxdiver @  6.1.2012,  09:25 Найти цитируемый пост)
http://forum.vingrad.ru/forum/topic-343151.html 


Но можно и через векторы.
Функция считает пересечения между прямой заданой двуми точками и окружностью лежащей в начале координат с радиусом r
Вроде как в расчетах не должен был ошибиться, ибо считал не я а wolframalpha.com
Код

struct point {
    double x;
    double y;
};

typedef std::pair<point, point> points_t;
points_t findIntersect(const point & pa, const point & pb, double r) {
    double a = pa.x, b = pa.y, c = pb.x, d = pb.y;

    double p1 = -2*a*b*d + 2*a*d*d + 2*b*b*c - 2*b*c*d;
    double p2 = 4*(-a*a+2*a*c-b*b+ 2*b*d - c*c - d*d);
    double p3 = -a*a*d*d + a*a*r*r + 2*a*b*c*d - 2*a*c*r*r - b*b*c*c + c*c*r*r;
    double p4 = sqrt(p1 * p1 - p2 * p3) + 2*a*b*d - 2*a*d*d - 2*b*b*c + 2*b*c*d;
    double p5 = 2*(-a*a + 2*a*c - b*b + 2*b*d - c*c - d*d);

    double x1 = p4/p5;
    double y1 = sqrt(r*r-x1*x1);

    double x2 = -x1;
    double y2 = sqrt(r*r-x2*x2);

    return std::make_pair(point(x1, y1), point(x2, y2));
}

До первого варианта легко дойти и точность у него приемлемая.
Второй вариант работает молниеносно (компилятор еще и сильно оптимизирует), а точность зависит только от компьютера.

Смысл в том, что берете уравнение круга, уравнение прямой по двум точкам (или вектора, как хотите) и приравниваете.
Уравнение круга можно взять для начала координат и просто сдвинуть точки треугольника на расстояние до центра коружности по каждой оси. (так сделано у меня)
То что получается считать не обязательно, на это есть wolframalpha.com
Главное не забыть потом проверить точки на пренадлежность к отрезку, так как пересечение считается по прямой.
А далее площадь по формуле площади полигона (через детерменант), как это указано в топике который вам скинул maxdiver
PM MAIL Skype GTalk   Вверх
maxdiver
Дата 7.1.2012, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



sQu1rr
Вы привели, как искать точки пересечения треугольника с кругом, что в общем-то очень боянистая задача, и её можно решать и из геометрических соображений, избегая явного решения сложных квадратных уравнений.

Однако самое интересное ведь начинается дальше: как считать площадь? Тут есть несколько трудностей:
1) некоторые вершины треугольника могли лежать внутри круга, как вы предлагаете это обрабатывать
2) в искомом пересечении круга и треугольника некоторые рёбра являются прямыми отрезками, а некоторые - дугами окружности (например, когда две вершины треугольника лежат внутри круга, а одна - вне). Опять же, вы не описали, как это обрабатывать, да и, кроме того, вообще посчитать площадь такого "кривого сектора" круга - не самая простая задача, связанная с вычислением интегралов.

P.S. В той теме я кратко описал точное решение, которое учитывает всё это. Само собой, в нём тоже используется пересечение прямой и окружности, но я просто хотел сказать, что это, imho, где-то лишь 10% от всего решения.
PM MAIL WWW ICQ   Вверх
sQu1rr
Дата 8.1.2012, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: нет
Всего: 13



Цитата(maxdiver @  7.1.2012,  18:50 Найти цитируемый пост)
 некоторые вершины треугольника могли лежать внутри круга, как вы предлагаете это обрабатывать

Преведенная мною функция выдаст пересечения линии образованными сторонами с окружностью. Принадлежность точки к сторонее треугольника можно вычеслить сравнением ее координат с крайними координатами отрезка. Не вижу особой проблемы.


Цитата(tennisru @  6.1.2012,  08:09 Найти цитируемый пост)
даже не представляю как это делать, через вектора но как? 

ТС спросил про векторы, я указал на возможное решение для нахождения пересчений, первым делом повторно указав на ваш топик, так как мой алгоритм покрывает, как вы правильно указали только лишь альтернативное нахождение пересечений треугольника и круга. Нигде не было мною заявлено что это решение задачи,
более того, внизу я сослался на ваше решение в плане вычесления площади, указывая формулу площади полигона, что само собой непременимо в подходе описанным мной, имея ввиду ваш способ решения.
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0875 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.