Re: обрамляющий прямоугольник
От: watchmaker  
Дата: 16.12.13 08:52
Оценка: 5 (1)
Здравствуйте, Аноним, Вы писали:

А>Столкнулся с такой задачей в некую функцию добавляют/ удаляют прямоугольники заданный двумя точками X1Y1 (верхний, левый) и X2Y2 (нижний правый).


А>void Add(X1, Y1, X2, Y2);

А>void Remove(X1, Y1, X2, Y2);


Удаляются только те прямоугольники, которые уже были добавлены? Если это так, то просто заведи пару сбалансированных деревьев поиска, например. При добавлении прямоугольника добавляешь в одно дерево ключи x1 и x2, а в другое дерево ключи y1 и y2. При удалении просто исключаешь из деревьев соответствующие ключи. Обрамляющий прямоугольник находится из наименьшего и наибольшего значения ключей из обоих деревьев. Дублирующиеся ключи в деревьях можно хранить либо многократно, либо в комбинации "уникальный ключ" + счётчик.
Если удаляться могут не только добавленные прямоугольники, и нужно определять такую ситуацию (например, сообщая об невозможности удаления), то можно несложно изменить структуру данных и для такого случая — в дереве сделать ключи уникальными, а в данных, связанных с ключом, хранить множество уникальных идентификаторов для добавленных прямоугольников. Тогда при вызове удаления можно будет определить, добавлялся ранее такой прямоугольник или нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.