Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 63909
Модуль Forms 63636
ТЕХНОЛОГИИ ДОСТ... 60486
Пример работы с... 59876
Имитационное мо... 55958
Реклама
Сейчас на сайте
Гостей: 10
На сайте нет зарегистрированных пользователей

Пользователей: 13,079
новичок: Openair
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование работы перекрёстка по регулированию движения на GPSS + Поя...
Диплом RSA, ЭЦП, сертификаты, шифрование на C#
Игра Sokoban на Delphi + Блок схемы

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Рекурсивное построение кривых Гильберта
Кривые Гильберта (Hilbert curves) - это самоподобные кривые, которые обыч-
но определяются рекурсивно. На рис. 5.2 изображены кривые Гильберта 1-го, 2-го,
и 3-го порядка
.
Кривые Гильберта
Рис. 5.2. Кривые Гильберта
Кривую Гильберта или любую другую самоподобную кривую можно создать раз-
биением большой кривой на меньшие части. Затем для построения следующих час-
тей необходимо использовать эту же кривую с соответствующим размером и углом
вращения. Полученные части допускается разбивать на более мелкие фрагменты до
тех пор, пока процесс не достигнет нужной глубины рекурсии. Порядок кривой опре-
деляется как максимальная глубина рекурсии, которой достигает процедура.
Процедура Hilbert управляет глубиной рекурсии, используя соответствую-
щий параметр глубины. При каждом рекурсивном вызове процедура уменьшает
данный параметр на единицу. Если процедура вызывается с глубиной рекурсии,
равной 1, она выводит простую кривую 1-го порядка, показанную слева на рис. 5.2,
и завершает работу. Это основное условие остановки рекурсии.
Например, кривая Гильберта 2-го порядка состоит из четырех кривых Гильбер-
та 1-го порядка. Точно так же кривая Гильберта 3-го порядка составлена из четы-
рех кривых Гильберта 2-го порядка, каждая из которых включает четыре кривых
Гильберта 1-го порядка. На рис. 5.3 изображены кривые Гильберта 2-го и 3-го по-
рядка. Меньшие кривые, из которых построены кривые большего размера, выде-
лены жирными линиями.
Кривые Гильберта, составленные из меньших кривых
Рис. 5.3: Кривые Гильберта, составленные из меньших кривых
Следующий код строит кривую Гильберта 1-го порядка:
with DrawArea.Canvas do
begin
LineTo(PenPos.X + Length, PenPos.Y);
LineTofPenPos.X, PenPos.Y + Length);
LineTofPenPos.X - Length, PenPos.Y);
end;



Предполагается, что рисунок начинается с левого верхнего угла области и что
переменная Length для каждого сегмента линии определена должным образом.
Метод для рисования кривой Гильберта более высоких порядков будет вы-
глядеть следующим образом:
procedure Hilbert (Depth : Integer);
begin
if (Depth = 1) then
Рисование кривой Гильберта глубины 1
else
Рисование и соединение четырех кривых Гильберта Hilbert (Depth - 1)
end;



Необходимо слегка усложнить этот метод, чтобы процедура Hilbert могла
определять направление, в каком будет рисоваться кривая - по часовой стрелке
или против. Это требуется для того, чтобы выбрать тип используемых кривых
Гильберта.
Эту информацию можно передать процедуре, добавив параметры dx и dy,
определяющие направление вывода первой линии в кривой. Если кривая имеет
глубину, равную единице, процедура выводит ее первую линию в соответствии
с функцией LineTo ( PenPos . X+dx , PenPos . Y+dy ) . Если кривая имеет большую
глубину, ей то процедура присоединяет первые две меньшие кривые с помощью
вызова LineTo ( PenPos . X+dx , PenPos . Y+dy ) . В любом случае процедура может
использовать dx и dy для того, чтобы определить направление рисования состав-
ляющих кривую линий.
Код Delphi для рисования Гильбертовых кривых короткий, но достаточно слож-
ный. Чтобы точно отследить, как изменяются dx и dy для построения различных
частей кривой, вам необходимо несколько раз пройти этот алгоритм в отладчике
для кривых 1-го и 2-го порядка.
procedure THilblForm.DrawHilbert (depth, dx, dy : Integer);
begin
with DrawArea .Canvas do
begin
if (depth > 1) then DrawHilbert (depth - 1,dy,dx);
LineTo ( PenPos . X+dx , PenPos . Y+dy ) ;
if (depth > 1) then DrawHilbert (depth - 1,dx,dy);
LineTo ( PenPos . X+dy , PenPos . Y+dx) ;
if (depth > 1) then DrawHilbert (depth - 1,dx,dy);
LineTo ( PenPos . X-dx , PenPos . Y-dy ) ;
if (depth > 1) then DrawHilbert (depth - 1,-dy,-dx);
end;
end;



Таблица 5.5. Количество рекурсивных обращений к процедуре Hilbert
Опубликовал Kest October 19 2009 15:42:02 · 0 Комментариев · 12258 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Counter [Исходник...
Delphi 7: Для про...
Удаление своего EXE
PrevInst
Шкрыль А. - Разра...
PDPcheck
Простой пример ка...
C++ Стандартная б...
Библиотека програ...
Игра Car [Исходни...
Midi
Delphi Russian Kn...
PHP 5. Полное рук...
MicroGPSS Studen ...
Быстрое создание ...
DFileDeleter
PHP: Полезные приемы
С. Г. Горнаков - ...
Защита от спама ...
Основы Delphi

Топ загрузок
Приложение Клие... 100449
Delphi 7 Enterp... 85822
Converter AMR<-... 20067
GPSS World Stud... 12518
Borland C++Buil... 11576
Borland Delphi ... 8504
Turbo Pascal fo... 7023
Visual Studio 2... 4989
Калькулятор [Ис... 4739
FreeSMS v1.3.1 3536
Случайные статьи
Машины VAX-11 и пр...
ГЕНОЛОГ
Теория тепловых ст...
Организация ввода-...
• Публикация CRL, ...
дополнительных ОГП...
Как сделать URL по...
4. Администратор д...
Аппаратура
Броня
Рабочая книга Excel
Метрика
Быстрая публикация
Редактирование диз...
Количество информа...
Частично автоматиз...
Она не действует н...
Уравновешивайте ра...
Зарезервированные ...
Беспроводные средс...
Как правильно выбр...
comнет явных довер...
Как отлично провес...
Игровые автоматы п...
Работа с модулями ...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?