Си - Решение задачи про многоугольник и точку.

За вознаграждение или нахаляву (если повезёт)

Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill

2fed
Сообщения: 3
Зарегистрирован: 27 май 2008, 01:54

Помогите, пожалуйста, решить типовую задачу повышенной сложности на Си:
На плоскости координатами своих упорядоченных вершин заданы произвольный многоугольник без самопересечения и точка а, находящаяся вне многоугольника. Определить число вершин, видимых из точки а.
Аватара пользователя
un4-funeral
Сообщения: 60
Зарегистрирован: 18 апр 2008, 23:40
Контактная информация:

эм...соединяешь эту точку с вершинами
если какая-то прямая пересекает сторону(до этой вершины) многоугольника, то не видна точка
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

un4-funeral писал(а):эм...соединяешь эту точку с вершинами
если какая-то прямая пересекает сторону(до этой вершины) многоугольника, то не видна точка

Тут весь вопрос, как определить пересечение. Можно, конечно, по формулам аналитической геометрии, но, думается, есть какой-то способ поизящнее
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
2fed
Сообщения: 3
Зарегистрирован: 27 май 2008, 01:54

А как задать многоугольник без самопересечения?
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Тривиальный пример - любой треугольник
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
2fed
Сообщения: 3
Зарегистрирован: 27 май 2008, 01:54

нет, это слишком просто. в своей проге я делаю запрос на количество вершин. затем у меня рандомно генерируются вершины. Для начала мне нужно, чтобы эти вершины образовали многоугольник без самопересечений. может быть это как-нибудь через площадь можно сделать?
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

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

Можно применить алгоритм пересечения отрезков см. здесь, но задача усложнится при количестве точек больше 3х, так как соединить их можно по разному, а значит, нужен перебор вершин и нахождение того варианта, который не даст самопересечений, либо не забракует данный набор вершин.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

2fed писал(а):Для начала мне нужно, чтобы эти вершины образовали многоугольник без самопересечений. может быть это как-нибудь через площадь можно сделать?
Смутно всплывает из подсознания, что можно через подсчет суммы величин внутренних углов.
Сумма величин внутренних углов N-угольника равна 180°(N-2).
Видимо, в многоугольнике, где стороны пересекаются, эта формула не работает.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Ну почему же, в этом случае внутренний угол получается больше 180, берется внешний
It's a long way to the top if you wanna rock'n'roll
chur
Сообщения: 195
Зарегистрирован: 17 фев 2004, 10:44
Откуда: Riga, Latvia

Многоугольник строим так.
Вершины заданы их координатами (x,y). Соответсвенно, имеем массив M[j]=(xj, yj).
Находим нижнюю точку - min(y) (если их несколько, то берем любую)
Её координаты - (x0,y0)
Остальной массив сортируем по возрастанию значения (xj-x0)/(yj-y0). Геометрически, это выглядит как обход лучом из точки (x0,y0) слева направо. Всё. В отсортированном массиве точки расположены по порядку по часовой стрелке начиная с нулевой.
(Возможные нюансы: вырождения какого-либо угла в 180 градусов и проверка деления на ноль)

По видимости - ща додумаю
Ответить