Как сортировать / рисовать псевдо-3D здания, чтобы они не перекрывались визуально - PullRequest
4 голосов
/ 17 июля 2011

У меня есть векторные данные для зданий на моей карте, и я хочу, чтобы они выглядели вытянутыми в зависимости от известной высоты.

Я знаю, что это обычная задача, но я не нашел удовлетворительного решения.

Я видел реализацию в mapnik , они используют простую сортировку по минимуму Y всех вершин в многоугольнике.В результате, большинство нарисовано правильно, но некоторые по-прежнему перекрываются (около 2-3%).

Buildings overlap if sorted just by minimum Y

В большинстве случаев достаточно просто хорошо разбирать строительные материалы (как-нибудь?) и нарисуйте их в соответствующей последовательности (для вышеприведенного случая эта последовательность будет 3-2-1).

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

enter image description here

ОБНОВЛЕНО:

Итак, существует два вида сегментов: стены и крышки.Сегменты стен легко заказать (минимум Y).Я не могу понять, как заказать шапки.

Спасибо.

1 Ответ

2 голосов
/ 17 июля 2011

В случае прямых стен их легко отсортировать по глубине.Рассмотрим только их основания, которые являются прямыми отрезками.Обратите внимание, что каждая линия делит плоскость на две части, одна из которых ближе к зрителю, а другая - дальше.Для любого сегмента A назовите более близкую часть A + и более дальнюю часть A-.Теперь для любых двух сегментов A и B выполнено хотя бы одно из предложений:

  1. A полностью лежит в B +
  2. A полностью лежит в B-
  3. B полностью лежит в A-
  4. B полностью лежит в A +
  5. Один сегмент параллелен линии обзора, а другой - полностью слева или полностью справа от нее
  6. A и B пересекаются

В случаях 1 и 3 B следует нарисовать до A (A может перекрывать B, но B не может закрывать A);в случаях (2) и (4) A до B;в случае 5 это не имеет значения;и 6 не должно встречаться для обычных стен.

Теперь вы можете выполнять топологическую сортировку стен и рисовать их от самых дальних к ближайшим.

Что касается крыш, то это невозможно для вогнутыхздания, так как часть крыши может быть скрыта стеной, которая затемняет другую часть той же крыши.Представьте себе низкое U-образное здание, видимое с его стороны, с высокой башней посередине U. Башня будет затенена и скрыта U-крышей, поэтому в любом порядке, в котором вы их рисуете, картина будетнеправильно.

Таким образом, вам придется разделить вогнутые крыши на выпуклые многоугольники.Тогда должно быть легко отсортировать их вместе со стенами по тем же принципам.

Совершенно другой метод - использовать Z-буфер, который освобождает вас от мысли о порядке.У меня сложилось впечатление, что вы можете получить Z-буфер на самых дешевых графических картах для мобильных телефонов в эти дни.

...