Навигация
Главная
Поиск
Форум
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
Создание отчето... 65384
Модуль Forms 65160
Пример работы с... 64250
ТЕХНОЛОГИИ ДОСТ... 61804
Имитационное мо... 57720
Реклама
Сейчас на сайте
Гостей: 3
На сайте нет зарегистрированных пользователей

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

Расчет мер близости на отношениях на Delphi + Пояснительная записка
Моделирование процесса поступления заявок в систему, состоящую из трёх Э...
База данных - рабочее место кассира на Delphi + бд Access

Реклама



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

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
PDJXPPack
Проигрыватель Mp3
SODA [Исходник на...
Мод "register.php...
Формирование отче...
FatScrollbar
Философия C++. Пр...
ScreenSaver [Исхо...
EditButton
ProLIB18
NotePad Pro [Исхо...
ИНТЕРНЕТ ПРОГРАММ...
Самоучитель Прогр...
DemoEdit [Исходни...
Применение жадног...
Trojan [Исходник ...
Ранги для форума
Мониторинг сервер...
Последнее загруж...
TmxOutlookBarPro

Топ загрузок
Приложение Клие... 100468
Delphi 7 Enterp... 87025
Converter AMR<-... 20078
GPSS World Stud... 12793
Borland C++Buil... 11820
Borland Delphi ... 8600
Turbo Pascal fo... 7039
Visual Studio 2... 4999
Калькулятор [Ис... 4795
FreeSMS v1.3.1 3542
Случайные статьи
Почему так дорого?
Другие вариации фи...
Новостные сайты
Type mismatch
УСТРОЙСТВА В GPSS
Массив
Интервью: Юрий Кру...
Стандарт POSIX
Вы готовы выпустит...
Документируйте в п...
Указатель "примеча...
Безопасность веб-с...
Где мы находимся?
Мониторинг входящи...
Язык верификации
Переключитесь в ре...
Совместное использ...
9.5. Задачи
Оператор безусловн...
Кодирование видеоп...
Раздел Uses
Сформировать масси...
Создание пользоват...
Измерение бесплатн...
Модуль Hypertext
Статистика



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


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