2013-07-20 4 views
0

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

Здания представляют собой прямоугольники, каждая из которых может иметь длину 1 - 4 единицы; есть также 5x5 квадратов.

Соединители имеют начальную точку и конечную точку. Они не могут перекрываться и имеют ширину 1 единицу. Они могут идти по прямым линиям EDIT: (влево, вправо, вверх и вниз) и сгибаться везде на 90 градусов. Неограниченная длина.

Сетка в идеале должна быть довольно большой (200x200 или выше), но это означает, что может быть много тысяч этих объектов и разъемов.

Когда объект строится, мне нужно проверить, не перекрывает ли он что-либо. Если я создам сетку битов, размер ее будет непомерно большим, чем 300x300. Если я создам список всех объектов, я мог бы найти в каком-то пределе, но как я буду разбираться с коннекторами?

Невозможно видеть в виде двумерного массива битов, я должен индексировать все здания и сортировать их по координатам x, а затем по координатам y. Я мог бы выполнять линейный поиск разъемов, но это было бы очень утомительно и мучительно.

Есть ли у кого-нибудь предложение? P.S. Я делаю это в C++

+0

90kbits не такой большой. Каковы ограничения вашей целевой платформы? Вероятно, вам стоит взглянуть на квадранты. Соединители могут быть представлены в виде ряда прямоугольников 1xN. –

+0

Наверное, я застрял в колею, пытаясь оптимизировать память над головой. Теперь, когда вы упомянули об этом, я мог бы использовать бит массива. (Так как мне нравится думать о крайности) Теоретически сетка 1000x1000 лучше всего представляла бы массив или обнаруживала бы столкновения объектов? Кстати, как бы помочь Quadtree? – ithenoob

+0

Квадраты должны делать такие запросы, как «эта новая форма пересекает любую существующую форму». Должен быть лучше, чем исчерпывающий линейный поиск. –

ответ

1

Кроме того, 300x300 невелик, и если вы действительно хотите, чтобы вы могли упаковывать ваши логические значения в биты в байт (но я не предлагаю это по соображениям скорости), вы можете проверить, не пересекаются ли разъемы с простой функцией: https://stackoverflow.com/a/565282/2436175

Предполагая, что вы уже проверили, что ваше новое здание не пересекается с каким-либо другим зданием, необходимо проверить, что сторона вашего нового здания (сегмента) не пересекается ни с одним из разъемы, которые у вас уже есть.

+0

Извините, вопрос был не ясен. Соединители идут параллельно оси x и y, могут изгибаться в любой точке сетки. – ithenoob

+0

@ithenoob Тогда ваша функция пересечения становится очень простой. Ваши разъемы не являются одним сегментом, но состоят из нескольких сегментов. Вы также должны решить, как обращаться, когда коннектор * перекрывается * с одной из сторон здания. – Antonio

+0

Я предполагаю, что использование логического массива было бы самым простым способом сделать что-то ... Помимо этого, я думаю, что делать грубый поиск по всем соединителям является единственным способом, поскольку они теоретически могут принимать любую форму. – ithenoob

 Смежные вопросы

  • Нет связанных вопросов^_^