Кривые Серпинского — это рекурсивно определённая последовательность непрерывных замкнутых плоских фрактальныхкривых, открытых Вацлавом Серпинским. Кривая в пределе при полностью заполняет единичный квадрат, так что предельная кривая, также называемая кривой Серпинского, является примером заполняющих пространство кривых.
Кривая Серпинского полезна для некоторых практических приложений, поскольку она более симметрична по сравнению с другими обычно рассматриваемыми заполняющими пространство кривыми. Например, она использовалась в качестве базиса для быстрого построения приближённого решения задачи коммивояжёра (которая ищет кратчайший обход заданных точек) — эвристическое решение заключается в посещении точек в той последовательности, в какой они встречаются на кривой Серпинского[1]. Для осуществления требуется два шага. Сначала вычисляется обратная позиция каждой точки, затем значения сортируются. Эта идея использовалась для системы маршрутизации коммерческих машин, которая базировалась только на карточках Rolodex[2].
На основе кривой Серпинского могут быть реализованы вибраторные либо печатные конструкции антенн[3].
Построение кривой
Заполняющая пространство кривая является непрерывным отображением единичного интервала в единичный квадрат и (псевдо) обратным отображением единичного квадрата в единичный интервал. Один из способов построения псевдообратного отображения следующий. Пусть нижний левый угол (0, 0) единичного квадрата соответствует 0.0 (и 1.0). Тогда верхний левый угол (0, 1) должен соответствовать 0.25, верхний правый угол (1, 1) — 0.50, а нижний правый угол (1, 0) — 0.75. Прообраз внутренних точек вычисляется с использованием рекурсивной структуры кривой. Ниже приведена функция на Java, вычисляющая относительное положение любой точки на кривой Серпинского (то есть, псевдообратное значение). Функция принимает координаты точки (x, y) и углы заключающего прямоугольного равнобедренного треугольника (ax, ay), (bx, by) и (cx, cy) (Заметим, что единичный квадрат является объединением двух таких треугольников). Остальные параметры определяют уровень точность вычислений.
Следующая программа на языке Лого рисует кривую Серпинского с использованием рекурсии.
to half.sierpinski :size :level
if :level = 0 [forward :size stop]
half.sierpinski :size :level - 1
left 45
forward :size * sqrt 2
left 45
half.sierpinski :size :level - 1
right 90
forward :size
right 90
half.sierpinski :size :level - 1
left 45
forward :size * sqrt 2
left 45
half.sierpinski :size :level - 1
end
to sierpinski :size :level
half.sierpinski :size :level
right 90
forward :size
right 90
half.sierpinski :size :level
right 90
forward :size
right 90
end
Loren K. Platzman, John J. Bartholdi III. Spacefilling curves and the planar traveling salesman problem // Journal of the Association of Computing Machinery. — 1989. — Т. 36, вып. 4. — С. 719—737.