Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Пересечение треугольника окружностью C++


Автор: maskofreallive 28.11.2010, 14:17
Дана такая задача:
На плоскости заданы N точек. У каждой точки свои координаты. Дана окружность радиуса R с центром в точке (0, 0). Нужно указать множество всех треугольников с вершинами в заданных точках, которые пересекают окружность и которые находятся в окружности.
Может кто поможет?

Автор: WhKitten 28.11.2010, 14:25
Если все вершины треугольника лежат в окружности, то треугольник лежит в окружности.
Если хотя бы одна вершина треугольника лежит в окружности, то треугольник лежит в окружности, либо пересекает её.
Лежит ли точка в окружности определяется по теореме Пифагора.

Автор: sQu1rr 28.11.2010, 14:26
Вопросы:
1. Множество или кол-во?
2. Если у треугольника вершина на окружности, он ее пересекает? ( вообще нет )

Считаешь точки в окружности ( и на ней ), тоесть sqrt(X^2 + Y^2) <= R : Пусть это A
Остальные точки вне окружности. Пусть это B

Дальше чистой воды математика. Все треугольники с 1 или 2 точками из множества B - пересекают окружность. Все треугольники с точками из множества A - внутри нее

PS. Кажется немного опаздал  smile 

Автор: maskofreallive 28.11.2010, 16:34
1. В тексте задачи написано множество. Как я понял, в данном случае "указать множество" означает вывести на экран номера всех треугольников или координаты их вершин. 
2. Если у треугольника вершина на окружности, то он ее не пересекает.

Автор: sQu1rr 28.11.2010, 23:08
Цитата(maskofreallive @  28.11.2010,  16:34 Найти цитируемый пост)
1. В тексте задачи написано множество. Как я понял, в данном случае "указать множество" означает вывести на экран номера всех треугольников или координаты их вершин. 
2. Если у треугольника вершина на окружности, то он ее не пересекает. 


Ну так все понятно smile
Пусть множество А - см выше будет вектором и Б - вектор
Тогда
Код

for( auto A = vA.begin(); A != vA.end(); ++A )
    for( auto B = vB.begin(); B != vB.end(); ++B )
        for( auto C = B + 1; C != vB.end(); ++C )
            std::cout << "(" << A->x << "," << A->y << ")" ... << std::endl;

Это те, что пересекают. Для тех что не пересекают еще проще smile

Добавлено @ 23:08
ЗЫ
Это псевдокод, где vA и vB - векторы множеств А и Б соответственно... содержат структуры с координатами

Добавлено @ 23:09
ЗЫ№2
Перепутал B с A ))) Но смысл не меняется

Автор: maskofreallive 29.11.2010, 21:09
Благодарю, жаль плюсик поставить не могу. =(

Автор: JackYF 29.11.2010, 22:52
Цитата(maskofreallive @  29.11.2010,  20:09 Найти цитируемый пост)
жаль плюсик поставить не могу. =( 


Ну, это дело поправимое smile


M
JackYF
В следующий раз помечай тему решённой.


Автор: Wadsunsed 7.9.2022, 04:43
Модератор: Сообщение скрыто.

Автор: frepliefs 10.9.2022, 02:16
Модератор: Сообщение скрыто.

Автор: HiesAmesk 13.9.2022, 04:29
Модератор: Сообщение скрыто.

Автор: agrinly 16.9.2022, 19:26
Модератор: Сообщение скрыто.

Автор: guifiaria 7.10.2022, 07:10
Модератор: Сообщение скрыто.

Автор: Evacuucky 12.10.2022, 21:27
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)