Итак, у вас есть единственная ломаная линия, и вы хотите проверить множество запросов на пересечение с горизонтальными сегментами.
Стоит построить некоторое разбиение двоичного пространства (BSP) поверх этой ломаной линии. В этом случае вы можете проверить пересечение за O(log(n))
время, поэтому общее время составляет O(nlogn)+O(qlogn)
(построение и проверка)
Если ваша полилиния, к счастью, выпуклый многоугольник (без один закрывающий край), все гораздо проще - просто сортируйте ребра по Y-координате и проверяйте только те, которые пересекают запрос Y (двоичный поиск, log (n) для запроса). В общем случае (невыпуклая) ваша ломаная линия может выглядеть как WMWMWMW
, и вам нужно проверить слишком много ребер.