дано N
отрезков на плоскости с началом координат в (0, 0)
соответственно, расположение которых может быть абсолютно любым
последний отрезок назовём красным.
необходимо определить - видим ли красный отрезок из точки (0, 0)
или он заслонён (прикрыт другими отрезками/отрезком).
для наглядности картинка:
здесь видно,
что если 1 или 2 красные - то их видно из (0, 0)
если же красные это 3 или 4 - то не видно
собственно, моё решение (O(N)) следующее:
обозначим через red
красный (последний) отрезок,
через red.start
и red.end
обозначим соответсвующие концы красного, тогда, если хотя бы один из отрезков
(0, 0), (red.start)
и (0, 0), (red.end)
НЕ пересекает какой-нибудь НЕ красный отрезок, то он видим из начала координат, иначе НЕ видим.
Тоесть, задача сводится к корректному определению пересечения отрезков.
вобщем, реализовал - всё работает как надо (могу показать код если интересно).
Интересует, какие есть другие алгориты работающие, например, за логарифмическое время ? Или за линейное но с другим подходом ?
edit
оказалось, что данный алгоритм не корректен, и он не учитывает случай, когда левые и правые части красного отрезка закрыты а середина видна
Правильный алгоритм:
пересечь черные отрезки с линией красного и оставить те части черных отрезков, которые находятся в одной полуплоскости (граница - линия красного отрезка) с точкой (0,0). Спроецировать все оставшиеся черные куски на линию красного отрезка. Если красный отрезок полностью перекрыт (анализ объединения отрезков, лежащих на одной прямой) - он не видим, в противном случае - видим.
Уточнение от @AnT:
ортогональная проекция здесь не подходит. Нужна проекция вдоль луча из точки (0, 0).
Так, мое уточнение:
"Оставшимися" будем называть части черных отрезков лежащие внутри треугольника образованного красным отрезком и отрезками, соединяющими точку (0,0) с концами красного отрезка.
Update
иллюстрация к комментарию @ampawd про ортогональную проекцию на ось Х. А про "сумму частей проекций" Вы сами можете привести контр-пример - сумма частей будет больше проекции красного, а дырки все равно останутся. Нужно именно объединение.
Update 2
Зеленые куски - это и есть проекции черных кусков (попавших внутрь оранжево-красного треугольника) на красный отрезок. Если красный отрезок полностью перекрыт зелеными, то он не виден.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Написать на C++ класс, описывающий граф/орграфКласс должен поддерживать следующую функциональность:
Нам дали изучать win api (хотя хз зачем он вообще в текущих реалиях нужен)
Есть целочисленный массив, как найти количество разных чисел в нем? Собственно, как функцию сравнения (проверку) правильно задать, вот эту:...
Какой код компилируется Си и С++, корректно работает, но при этом может отличается по быстродействию вследствие различий стандартов C и C++?