дано 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
Зеленые куски - это и есть проекции черных кусков (попавших внутрь оранжево-красного треугольника) на красный отрезок. Если красный отрезок полностью перекрыт зелеными, то он не виден.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей