Навигация
Главная
Поиск
Форум
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
Подключение Mic... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Организация зап... 64647
Создание потоко... 62133
Модуль Forms 61246
Создание отчето... 61202
ТЕХНОЛОГИИ ДОСТ... 57661
Пример работы с... 55173
Имитационное мо... 53052
Реклама
Сейчас на сайте
Гостей: 10
На сайте нет зарегистрированных пользователей

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

Моделирование процесса передачи данных по магистрали с основным и резерв...
Моделирование работы узла коммутации сообщений на GPSS + Пояснительная з...
Моделирование работы класса персональных компьютеров на GPSS + Отчет + Б...

Реклама



Подписывайся на 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 Комментариев · 11865 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
C++ : библиотека ...
Архив программ
ZipTV
Proeffectimage
PHP/MySQL для нач...
WordReport
Калькулятор [Исхо...
TmxOutlookBarPro
Таймер и секундомер
Игра в крестики н...
Пишем программы и...
IMtale
C++ Builder в за...
39 статьи по Delphi
База для Allsubmi...
PCX
Error mod
PrevInst
CarGame [Исходник...
C++ Builder: Книг...

Топ загрузок
Приложение Клие... 100384
Delphi 7 Enterp... 83560
Converter AMR<-... 20051
GPSS World Stud... 11314
Borland C++Buil... 11245
Borland Delphi ... 8183
Turbo Pascal fo... 6987
Visual Studio 2... 4970
Калькулятор [Ис... 4419
FreeSMS v1.3.1 3516
Случайные статьи
Рассмотрим теперь ...
Результаты
Благодарности
Для простого разве...
Использование “ста...
Ускорение процедур...
Сортировка Шелла +...
Исследование свойс...
Быстрые проверки
— порядок применен...
Планирование трафи...
Группы с ограничен...
Зашифрованное сооб...
Подмена функций ст...
UNTRACE (ЗАВЕРШИТЬ...
Определение параме...
Таблицы
Virtual constructo...
Доставка суши
Тип данных char
Преимущество автом...
Но может ли квадра...
Элементы ввода для...
Анализ слов
У большей части со...
Статистика



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


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