Я не знаю стандартного алгоритма для вашей задачи, но первая мысль, которая пришла мне в голову, это представить прямоугольники в виде 4 линий, а если у вас много отрезков - найти пересечения всех отрезков и линий (путем сортировкиотрезки линий и линий, а затем «сливаются» их координаты).
То есть это N * log (N) + M * Log (M), где N - количество отрезков линий, M - количество квадратов.
После этого вы можете найти отрезки, которые пересекают квадрат как (SquareHorizLine1Intersections UNION SquareHorizLine2Intersections) INTERSECT (SquareVerticalLine1Intersections UNION SquareVerticalLine2Intersections)
Снова установить пересечения и объединения, где K *, K имеют сложность, где K * Logэто размер набора.Или даже просто войти (K), если вы используете структуру данных "Биноминальная куча" (есть также куча Фибоначчи, которая может быть еще более эффективной).
Таким образом, этот алгоритм выглядит как сложность N * log (N).Я надеюсь, что это помогает ... Или вам нужно лучше?