Введение
Кривая, заполняющая пространство
Кривая Гильберта (также известная как пространственно-заполняющая кривая Гильберта) — это непрерывная фрактальная кривая, заполняющая пространство, впервые описанная немецким математиком Давидом Гильбертом в 1891 году как вариант пространственно-заполняющих кривых Пеано, открытых Джузеппе Пеано в 1890 году. Поскольку она заполняет пространство, её размерность Хаусдорфа равна 2 (в точности, её образ является единичным квадратом, размерность которого равна 2 в любом определении размерности; её график — компактное множество, гомеоморфное замкнутому единичному интервалу, с размерностью Хаусдорфа, равной 2). Кривая Гильберта строится как предел кусочно-линейных кривых. Длина n-й кривой равна , то есть длина растёт экспоненциально с n, даже несмотря на то, что каждая кривая содержится в квадрате с площадью .
Приложения и алгоритмы отображения
И истинная кривая Гильберта, и ее дискретные приближения полезны, поскольку они обеспечивают отображение между одномерным и двумерным пространством, достаточно хорошо сохраняющее локальность. Это означает, что две точки данных, близкие друг к другу в одномерном пространстве, останутся близкими и после преобразования. Обратное, однако, не всегда верно. Благодаря этому свойству локальности кривая Гильберта широко используется в информатике. Например, диапазон IP-адресов, используемых компьютерами, можно отобразить на изображение с помощью кривой Гильберта. Код для генерации изображения будет преобразовывать координаты из двумерных в одномерные для определения цвета каждого пикселя, и кривая Гильберта иногда используется, поскольку она располагает близкие IP-адреса рядом друг с другом на изображении. Свойство локальности кривой Гильберта также применялось при разработке алгоритмов для исследования местности мобильными роботами. В алгоритме, известном как дитеринг Римерсмы, фотографии в оттенках серого можно преобразовать в дитерированное черно-белое изображение с использованием пороговой обработки, при этом остаток от каждого пикселя добавляется к следующему пикселю вдоль кривой Гильберта. Код для этого будет преобразовывать координаты из одномерных в двумерные, и кривая Гильберта иногда используется, поскольку она не создает отвлекающих узоров, которые были бы заметны глазу, если бы порядок следования пикселей был просто слева направо в каждой строке. Кривые Гильберта в более высоких измерениях являются обобщением кодов Грея и иногда используются для аналогичных целей по тем же причинам. Для многомерных баз данных предлагается использовать порядок Гильберта вместо порядка Z, поскольку он лучше сохраняет локальность. Например, кривые Гильберта использовались для сжатия и ускорения индексов R-деревьев (см. Гильбертово R-дерево). Они также применялись для сжатия хранилищ данных. Линейное расстояние любой точки вдоль кривой можно преобразовать в координаты в n измерениях для заданного n, и наоборот, используя один из нескольких стандартных математических методов, таких как метод Скиллинга. Кривые Гильберта можно эффективно реализовать даже в том случае, если пространство данных не является квадратным. Кроме того, существует несколько возможных обобщений кривых Гильберта для более высоких измерений.
Другие варианты реализации
В книге Graphics Gems II обсуждается когерентность кривой Гильберта и приводится её реализация. Кривая Гильберта широко используется при рендеринге изображений и видео. Популярные программы, такие как Blender и Cinema 4D, используют кривую Гильберта для трассировки объектов и рендеринга сцен. Программное обеспечение для нарезки, используемое для преобразования 3D-моделей в траектории инструмента для 3D-принтера, обычно предлагает кривую Гильберта в качестве варианта для схемы заполнения.