Выбор Дизайна - 2D план дома - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь найти лучший способ структурировать мою программу.

Я планирую представить двухмерный план дома со стенами, дверями, окнами и колоннами . Стены имеют фиксированный размер и добавляются одна за другой. Колонны могут быть размещены только по бокам стены. Двери / окна расположены в тех же местах, что и колонны.

Кроме того, в будущем я планирую хранить планы в базе данных. Я не против делать какие-либо преобразования данных для сохранения / загрузки планов, если это облегчает манипулирование планами в программе.

Пример: Example plan

Мои идеи пока:

  • Использование двух матриц: одна для представления стен, а другая для представления колонн / окон / дверей. Минусы: Матрица стен будет странной, вы можете разместить больше вертикальных стен, чем горизонтальных стен в одном «ряду» плана
  • Использование объектов, которые хранят ссылки на смежные объекты. Минусы: очень интуитивно понятное и, возможно, затрудняет вывод плана на экран

Я почти уверен, что это очень распространенный сценарий, и, надеюсь, мне удастся указать верное направление, какую структуру данных я могу использовать для внутреннего представления.

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Я бы использовал многомерный индекс, такой как дерево квадрантов или дерево R *.Преимущества:

  • Вы действительно свободны с вашими координатами, элементы не должны «привязываться» к данной сетке, и вы можете поворачивать объекты (диагональный стол, стена, ...)
  • Проверка столкновений относительно проста, просто выполните запрос диапазона (с небольшим полем) по объекту (или по одному из его углов), и он вернет всех соседей
0 голосов
/ 11 мая 2018

Использование объектов, которые хранят ссылки на смежные объекты, вероятно, лучший выбор.Вот несколько преимуществ:

  • Меньшие объемы данных для сохранения / загрузки;большинство ваших матриц будет пустым пространством, и простое извлечение реальных объектов для сохранения вместо сохранения всей матрицы будет меньше (теоретически; если ваши сохраненные объекты громоздки, это преимущество может быть не реализовано)
  • Это гибко;проще добавить новый тип объекта или изменить их соответствие друг другу по сравнению с жесткой структурой матрицы.Это облегчит поддержку и расширение вашего кода, что является долгосрочным преимуществом.Например, если вы хотите добавить стены разной длины, это гораздо проще сделать в системе на основе объектов, чем полностью менять дизайн матрицы.
  • Вы избегаете проблемы размера холста;Если пользователь хочет расширить свой дизайн, в матричном решении вы должны увеличить размер матриц, что может быть дорогостоящим (особенно в отношении пункта 1) и раздражающим.В системе объектов вы можете определить их положение относительно некоторого источника и определить размер холста позже (например, если мы проведем итерацию по каждому объекту и найдем min / max x и y по всему набору, размер холста будет разницей между этими объектами).минимальные / максимальные значения).

Простой способ реализации этого заключается в следующем:

  • Каждый объект имеет позицию x, y
  • Для рисованияхолст, первый цикл над каждым объектом и найти наименьшие значения x, y и наибольшие значения x, y
  • например, если у нас есть 3 объекта со следующими координатами <3,4> <0,8> <-4,0> тогда наши min x = -4, min y = 0, max x = 3, max y = 8, поэтому наш холст представляет собой прямоугольник от <-4,0> до <3,8>
  • сдвинуть весь прямоугольник в положительное;в приведенном выше примере, например, мы добавили бы <4,0> к позиции каждого объекта.
  • Создайте холст с x-длиной и y-высотой найденного блока (в примере,это будет 7 в ширину и 8 в высоту, умноженные на несколько пикселей (например, 10 пикселей / единица)
  • Обведите все объекты и нарисуйте их в смещенном положении (например, мы нарисовали бы объект с позицией <3,4> при <7,4>)
...