Определение видимости отрезка

318
16 марта 2017, 23:03

дано 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

оказалось, что данный алгоритм не корректен, и он не учитывает случай, когда левые и правые части красного отрезка закрыты а середина видна

Answer 1

Правильный алгоритм:

пересечь черные отрезки с линией красного и оставить те части черных отрезков, которые находятся в одной полуплоскости (граница - линия красного отрезка) с точкой (0,0). Спроецировать все оставшиеся черные куски на линию красного отрезка. Если красный отрезок полностью перекрыт (анализ объединения отрезков, лежащих на одной прямой) - он не видим, в противном случае - видим.

Уточнение от @AnT:

ортогональная проекция здесь не подходит. Нужна проекция вдоль луча из точки (0, 0).

Так, мое уточнение:

"Оставшимися" будем называть части черных отрезков лежащие внутри треугольника образованного красным отрезком и отрезками, соединяющими точку (0,0) с концами красного отрезка.

Update

иллюстрация к комментарию @ampawd про ортогональную проекцию на ось Х. А про "сумму частей проекций" Вы сами можете привести контр-пример - сумма частей будет больше проекции красного, а дырки все равно останутся. Нужно именно объединение.

Update 2

Зеленые куски - это и есть проекции черных кусков (попавших внутрь оранжево-красного треугольника) на красный отрезок. Если красный отрезок полностью перекрыт зелеными, то он не виден.

READ ALSO
Граф. Написать класс на С++ [требует правки]

Граф. Написать класс на С++ [требует правки]

Написать на C++ класс, описывающий граф/орграфКласс должен поддерживать следующую функциональность:

719
Win Api (LONG в C++ (long или int))

Win Api (LONG в C++ (long или int))

Нам дали изучать win api (хотя хз зачем он вообще в текущих реалиях нужен)

225
Количество разных чисел в массиве c++

Количество разных чисел в массиве c++

Есть целочисленный массив, как найти количество разных чисел в нем? Собственно, как функцию сравнения (проверку) правильно задать, вот эту:...

280
Отличия в оптимизации C и C++

Отличия в оптимизации C и C++

Какой код компилируется Си и С++, корректно работает, но при этом может отличается по быстродействию вследствие различий стандартов C и C++?

228