У меня есть список прямоугольников, и мне нужно создать список прямоугольников, которые пересекаются.
Прямоугольники определяются с помощьюПересечения прямоугольников
- Точка
- Размер
- Boolean, может ли прямоугольник двигаться
- Boolean ли прямоугольник может быть удален
Нет прямоугольниками не может быть перемещен, но не может быть удален
Пересечение определено usin г
- Указатель на первый прямоугольник
- Указатель на второй прямоугольник
- Список точек первого прямоугольника, которые находятся во втором
- Список точек второго прямоугольника, которые находятся в первом
Мне нужен контейнер для этого, так как прямоугольники можно добавлять, удалять или перемещать. Операции, которые мне нужны:
- Вставка прямоугольника
- Вытащите прямоугольника (возможно только для тех, кто отмечен для него)
- Изменение положения прямоугольника (не размер, возможно только с теми, кто помечаются для it)
- Создание набора пересечений.
Как я могу реализовать такой контейнер? Я могу сделать это легко, используя метод перекрестной проверки, но это будет далеко не оптимизировано.
Я думал о сохранении карты прямоугольника -> пересечения, а затем всякий раз, когда добавляется прямоугольник, проверяйте, пересекается ли что-либо и добавляет пересечение к карте, а когда оно удалено, удалите ключ с карты, но я не знаю как проверить, пересекает ли он что-либо быстро, или как перемещать прямоугольники без удаления и повторного ввода.
Я могу использовать C++ 11.
Это имеет ту же сложность, что и перекрестная проверка – Dani
Технически, да. Однако постоянная на фронте в тысячу раз меньше. В зависимости от ваших данных может быть, что большинство случаев становятся O (1), поскольку они достаточно далеки от других прямоугольников. –
константа не может быть в тысячу раз меньше. в той же теории вы можете подразделить на бесконечность и сделать ее «O (1)» для произвольного случая. – Dani