Си - Решение задачи про многоугольник и точку.
Модераторы: Хыиуду, MOTOCoder, Medved, dr.Jekill
Помогите, пожалуйста, решить типовую задачу повышенной сложности на Си:
На плоскости координатами своих упорядоченных вершин заданы произвольный многоугольник без самопересечения и точка а, находящаяся вне многоугольника. Определить число вершин, видимых из точки а.
На плоскости координатами своих упорядоченных вершин заданы произвольный многоугольник без самопересечения и точка а, находящаяся вне многоугольника. Определить число вершин, видимых из точки а.
- un4-funeral
- Сообщения: 60
- Зарегистрирован: 18 апр 2008, 23:40
- Контактная информация:
эм...соединяешь эту точку с вершинами
если какая-то прямая пересекает сторону(до этой вершины) многоугольника, то не видна точка
если какая-то прямая пересекает сторону(до этой вершины) многоугольника, то не видна точка
un4-funeral писал(а):эм...соединяешь эту точку с вершинами
если какая-то прямая пересекает сторону(до этой вершины) многоугольника, то не видна точка
Тут весь вопрос, как определить пересечение. Можно, конечно, по формулам аналитической геометрии, но, думается, есть какой-то способ поизящнее
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
А как задать многоугольник без самопересечения?
Тривиальный пример - любой треугольник
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
нет, это слишком просто. в своей проге я делаю запрос на количество вершин. затем у меня рандомно генерируются вершины. Для начала мне нужно, чтобы эти вершины образовали многоугольник без самопересечений. может быть это как-нибудь через площадь можно сделать?
2fed писал(а):нет, это слишком просто. в своей проге я делаю запрос на количество вершин. затем у меня рандомно генерируются вершины. Для начала мне нужно, чтобы эти вершины образовали многоугольник без самопересечений. может быть это как-нибудь через площадь можно сделать?
Можно применить алгоритм пересечения отрезков см. здесь, но задача усложнится при количестве точек больше 3х, так как соединить их можно по разному, а значит, нужен перебор вершин и нахождение того варианта, который не даст самопересечений, либо не забракует данный набор вершин.
Смутно всплывает из подсознания, что можно через подсчет суммы величин внутренних углов.2fed писал(а):Для начала мне нужно, чтобы эти вершины образовали многоугольник без самопересечений. может быть это как-нибудь через площадь можно сделать?
Сумма величин внутренних углов N-угольника равна 180°(N-2).
Видимо, в многоугольнике, где стороны пересекаются, эта формула не работает.
Ну почему же, в этом случае внутренний угол получается больше 180, берется внешний
It's a long way to the top if you wanna rock'n'roll
Многоугольник строим так.
Вершины заданы их координатами (x,y). Соответсвенно, имеем массив M[j]=(xj, yj).
Находим нижнюю точку - min(y) (если их несколько, то берем любую)
Её координаты - (x0,y0)
Остальной массив сортируем по возрастанию значения (xj-x0)/(yj-y0). Геометрически, это выглядит как обход лучом из точки (x0,y0) слева направо. Всё. В отсортированном массиве точки расположены по порядку по часовой стрелке начиная с нулевой.
(Возможные нюансы: вырождения какого-либо угла в 180 градусов и проверка деления на ноль)
По видимости - ща додумаю
Вершины заданы их координатами (x,y). Соответсвенно, имеем массив M[j]=(xj, yj).
Находим нижнюю точку - min(y) (если их несколько, то берем любую)
Её координаты - (x0,y0)
Остальной массив сортируем по возрастанию значения (xj-x0)/(yj-y0). Геометрически, это выглядит как обход лучом из точки (x0,y0) слева направо. Всё. В отсортированном массиве точки расположены по порядку по часовой стрелке начиная с нулевой.
(Возможные нюансы: вырождения какого-либо угла в 180 градусов и проверка деления на ноль)
По видимости - ща додумаю