Исследование фракталов: ковер Серпинского

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

«ВОСТОЧНО-СИБИРСКИЙ ГОСУДАРСТВЕННЫЙ

ТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ"

ЭЛЕКТРОТЕХНИЧЕСКИЙ ФАКУЛЬТЕТ

Кафедра систем информатики

Курсовая работа

по дисциплине «Программирование на языке высокого уровня С/С++»

Тема: «Исследование фракталов: Ковер Серпинского»

Выполнил (а):

студент (ка) гр. 660−1

Хангалова.К.Э.

Руководитель:

доцент кафедры СИ

Хаптахаева Н.Б.

Улан-Удэ 2011

Аннотация

Краткое содержание проекта: Рассмотрение основных теоретических сведений о фракталах, рассмотрение способов построения фракталов, разработка алгоритма построения фрактала и реализация алгоритма в программе.

1. Теоретическая часть: Понятие фрактала, Размерность фрактала, Салфетка и ковер Серпинского и Ковер Серпинского

2. Практическая часть: Разработка алгоритма. Пояснение к алгоритмам функций.

Сроки выполнения работы по графику:

Обоснование актуальности выбора темы — 5% к 4 неделе

Поиск и выбор источников и литературы по теме — 15% к 6 неделе

Формулирование текстового изложения результатов проведенного анализа источников и литературы — 25% к 7 неделе

4. Формализация метода решения поставленной задачи — 50% к 9 неделе

5. Разработка программного обеспечения — 80% к 13 неделе

6. Оформление результатов проведенного исследования — 95% к 16 неделе

7. Защита — 100% к 18 неделе

Требования к оформлению:

1. Расчетно-пояснительная записка курсовой работы должна быть представлена в электронной и твердой электронной и твердой копиях

2. Объем РПЗ должен быть не менее 20 машинописных страниц без учета приложений

3. РПЗ оформляется по ГОСТу 7. 32−2001 и подписывается у ответств. за нормоконтроль.

Аннотация

Работа посвящена теме исследование фрактала: Ковер Серпинского. Как известно, данный фрактал является одним из классических фракталов во фрактальной геометрии.

Основная цель данной работы заключается в исследовании фрактала под названием Ковер Серпинского. Задачи курсовой работы: изучение предметной области, выбор метода построения фрактала и разработка алгоритма построения фрактала. Разработано программное обеспечение, реализующее предложенный способ.

Содержание

  • Аннотация
  • Введение
  • 1. Теоретический раздел
  • 1.1 Длина береговой линии
  • 1.2 Салфетка и ковер Серпинского
  • 2. Проектный раздел
  • 3. Программный раздел
  • 4. Экспериментальный раздел
  • Заключение
  • Список использованных источников
  • Приложения

Введение

Объектом нашего исследования являются фракталы. Необходимость появления понятия фрактал появилась сравнительно недавно, а именно около 40 лет назад. Тогда геометрические модели различных природных конструкций традиционно строились на основе сравнительно простых геометрических фигур: прямых, многоугольников, окружностей, многогранников, сфер. Однако стало очевидно, что этот классический набор, достаточный для описания элементарных структур, становится плохо применим, для таких сложных объектов, как очертание береговых линий материков, поле скоростей в турбулентном потоке жидкости, разряд молнии в воздухе, пористые материалы, форма облаков, снежинки, пламя костра, контуры дерева и т. д. В связи с этим ученые стали вводить новые геометрические понятия. И одним из таких понятий стало понятие фрактала. Введено это понятие было французским математиком польского происхождения Бенуа Мандельбротом в1975 году. И хотя в математике похожие конструкции в той или иной форме появились давно, в физике ценность подобных идей была осознана лишь в 70 годы 20 столетия. Тогда немаловажную роль в распространении идей фрактальной геометрии сыграла книга Мандельброта «Фрактальная геометрия природы». Основой новой геометрии является идея самоподобия. Она выражает собой тот факт, что иерархический принцип организации фрактальных структур не претерпевает значительных изменений при рассмотрении их через микроскоп с различным увеличением. В результате эти структуры на малых масштабах выглядят в среднем также, как и на больших. Здесь определена разница между геометрией Евклида, имеющей дело исключительно с гладкими кривыми, и бесконечно изрезанными самоподобными фрактальными кривыми. Элементы кривых у Евклида всегда самоподобны, но тривиальным образом: все кривые являются локально прямыми, а прямая всегда самоподобна. Фрактальная же кривая, в идеале, на любых, даже самых маленьких масштабах не сводится к прямой и является в общем случае геометрически нерегулярной, хаотичной. Для нее, в частности, не существует и понятия касательной в точке, так как функции, описывающие эти кривые, являются в общем случае недифференцируемыми.

Возможно, что наиболее убедительным аргументом в пользу изучения фракталов является их бросающаяся в глаза красота. Фракталы удивительным образом соединили логический подход и познание природных явлений.

Многие крупные достижения в области фрактальной геометрии стали возможны с появлением современных компьютеров. Компьютерные эксперименты позволили получить достаточно полное представление о разнообразных фракталах и причинах их возникновения. Часто теоретическое моделирование этих структур подчас даже опережало экспериментальные методы изучения реальных природных объектов сложной формы. [1]

Итак, с развитием фрактальной геометрии, для многих стало очевидно, что формы евклидовой геометрии сильно проигрывают большинству природных объектов из-за отсутствия нерегулярности, беспорядка и непредсказуемости.

В настоящее время можно сказать, что фрактальная геометрия обширно известна и достаточно актуальна. Все потому, что язык фрактальной геометрии применим для всей науки современного мира в целом. Например, в медицине для построения модели кровеносной системы человека или рассмотрении сложных поверхностей клеточных мембран.

Итак, основная цель нашего исследования: реализация построения фрактала Ковер Серпинского в программной среде. Для достижения цели были определены основные задачи: изучение способов построения фрактала Ковер Серпинского, определение алгоритма для реализации в программной среде и реализация построения фрактала в программной среде.

1. Теоретический раздел

Фракталами называются геометрические объекты: линии поверхности, пространственные тела, имеющие сильно изрезанную форму и обладающие свойством самоподобия. Слово фрактал произошло от слова fractus и переводится как дробный, ломаный. Самоподобие, как основная характеристика означает, что он более или менее единообразно устроен в широком диапазоне масштабов. Так, при увеличении маленькие фрагменты фрактала получаются очень похожими на большие. В идеальном случае такое самоподобие приводит к тому, что фрактальный объект оказывается инвариантным относительно растяжений, т. е. ему, как говорят, присуща дилатационная симметрия. Она предполагает неизменность основных геометрических особенностей фрактала при изменении масштаба.

Конечно, для реального природного фрактала существует некоторый минимальный масштаб длины, такой, что на расстояниях его основное свойство — самоподобие — пропадает. Кроме того, на достаточно больших масштабах длин, где — характерный геометрический размер объектов, это свойство самоподобия также нарушается. Поэтому свойства природных фракталов рассматриваются лишь на масштабах l, удовлетворяющих соотношении . Такие ограничения являются довольно естественными, потому что, когда мы приводим в качестве примера фрактала — изломанную, негладкую траекторию броуновской частицы, то мы понимаем, что образ является очевидной идеализацией. Дело в том, что на маленьких масштабах сказывается конечность времени соударения. При учете этих обстоятельств, траектория броуновской частицы становится плавной кривой.

Отметим, что свойство самоподобия характерно лишь для регулярных фракталов. Если вместо детерминированного способы построения включить в алгоритм их создания некоторый элемент случайности (как это бывает, например, во многих процессах диффузионного роста кластеров, электрическом пробое и т. д.), то возникают так называемые случайные фракталы. Основное их отличие от регулярных состоит в том, что свойства самоподобия справедливы только после соответствующего усрединения по всем статистически независимым реализациям объекта. При этом увеличенная часть фрактала не точно идентична исходному фрагменту, однако их статистические характеристики совпадают. Но изучаемый нами фрактал является одним из классических фракталов, а поэтому регулярным.

1.1 Длина береговой линии

Первоначально понятие фрактала возникло в физике в связи с задачей о нахождении береговой линии. При ее измерении по имеющейся карте местности выяснилась любопытная деталь — чем более крупномасштабная берется карта, тем более длинной оказывается эта береговая линия.

Рисунок 1 — Карта береговой линии

Пусть, например, расстояние по прямой между расположенными на береговой линии точками A и B равно R (см. рис. 1). Тогда, чтобы измерить длину береговой линии между этими точками, мы расставим по берегу жестко связанные друг с другом вешки так, что расстояние между соседними вешками составляло бы, например, l=10км. Длину береговой линии в километрах между точками A и B мы примем тогда равной чиcле вешек минус одна, помноженному на десять. Следующее измерение этой длины мы произведем подобным же образом, но расстояние между соседними вешками сделаем уже равным l=1км.

Оказывается, что результаты этих измерений будут различными. При уменьшении масштаба l мы будем получать все большие значения длины. В отличие от гладкой кривой, линия морского побережья оказывается зачастую настолько изрезанной (вплоть до самых маленьких масштабов), что с уменьшением звена l величина L — длина береговой линии — не стремится к конечному пределу, а увеличивается по постепенному закону

, (1)

где D — некоторый показатель степени, который называется фрактальной размерностью береговой линии. Чем больше величина D, тем более изрезанной является эта береговая линия. Происхождение зависимости (1) интуитивно понятно: чем меньший масштаб мы используем, тем меньшие детали побережья будут учтены и дадут вклад в измеряемую длину. Наоборот, увеличивая масштаб, мы спрямляем побережье, уменьшая длину L.

Таким образом, очевидно, что для определения длины береговой линии L с помощью жесткого масштаба l (например, с помощью циркуля с фиксированным раствором), необходимо сделать N=L/l шагов, причем величина L меняется c l так, что N зависит от l по закону. В результате с уменьшением масштаба, длина береговой линии неограниченно возрастает. Это обстоятельство резко отличает фрактальную кривую от обычной гладкой кривой (типа окружности, эллипса), для которой предел длины аппроксимирующей ломаной L при стремлении к нулю длины ее звена l конечен. В результате для гладкой кривой ее фрактальная размерность D=1, т. е. совпадает с топологической.

Приведем величины фрактальных размерностей D для различных береговых линий. Например, для Британских островов D ? 1. 3, а для Норвегии D ? 1. 5. Фрактальная размерность побережья Австралии D? 1. 1. Близкими к единице оказываются и фрактальные размерности других побережий.

Выше было введено понятие о фрактальной размерности береговой линии. Дадим теперь общее определение этой величины. Пусть d — обычная Евклидова размерность пространства, в котором находится наш фрактальный объект (d=1 — линия, d=2 — плоскость, d=3 — обычное трехмерное пространство). Покроем теперь этот объект целиком d-мерными «шарами» радиуса l. Предположим, что нам потребовалось для этого не менее чем N (l) шаров. Тогда, если при достаточно малых l величина N (l) меняется по степенному закону:

, (2)

то D — называется Хаусдорфовой или фрактальной размерностью этого объекта.

1.2 Салфетка и ковер Серпинского

Регулярный фрактал, называемый салфеткой Серпинского, получается последовательным вырезанием центральных равносторонних треугольников так, как показано на рис. 2

Рисунок 2 — Построение салфетки Серпинского

В результате получается «дырявая» фигура (см. рис. 3), состоящая из бесконечного числа изолированных точек. Фрактальная размерность салфетки Серпинского подсчитывается по формуле (3)

Здесь на нулевом шаге мы имеем один равносторонний треугольник с длиной стороны, а на следующем три равносторонних треугольника со сторонами. Поэтому,, а ,. Салфетка имеет нулевую площадь, поскольку нетрудно проверить, что в процессе ее построения была исключена площадь, в точности равная площади исходного треугольника. Об этом же говорит и значение фрактальной размерности, которая меньше размерности плоскости, на которой находится этот объект.

Подсчитаем теперь периметр исключенных областей. Если сторона исходного треугольника была равна 1, то на первом шаге построения периметр центрального треугольника равен 3/2. На втором шаге к нему добавляются три новых треугольника с общим периметром, равным 9/4 и т. д. Очевидно, что на n-м шаге периметр P определяется суммой геометрической прогрессии

ковер серпинский фрактал алгоритм

Рисунок 3 — Салфетка Серпинского

С другой стороны, масштаб длины на n-м шаге равен. Поэтому формула приобретает вид, схожий с формулой (1) для длины береговой линии

где D определяется формулой (6)

Рисунок 4 — Инициирующий элемент и генератор для кривой Серпинского

Можно построить непрерывную линию, обладающую таким значением фрактальной размерности и геометрически эквивалентную салфетке Серпинского. Инициирующим элементом для такого построения берется отрезок единичной длины, который потом заменяется на конструкцию, называемую генератором, состоящую из трех отрезков длиной ½, расположенных под углом 120° друг к другу (см. рис. 4). Затем каждый из этих трех отрезков заменяется, в свою очередь, на генератор в два раза меньшего размера так, как показано на рис. 5 слева. Правая часть того же рисунка изображает следующий шаг процедуры. Контуры будущей салфетки Серпинского отчетливо проступают на следующих двух этапах (см. рис 5).

Рисунок 5 — Второй и третий шаги в построении кривой Серпинского

Эта процедура повторяется до бесконечности. Легко видеть, что каждое следующее изображение может быть получено из предыдущего путем склеивания трех уменьшенных в два раза копий, две из которых повернутся на угол 120° и — 120° относительно оригинала.

Рисунок 6 — Следующие два шага в построении кривой Серпинского

Аналогично салфетке Серпинского можно построить квадратный ковер Серпинского, который является двумерным аналогом канторовского множества исключенных средних третей.

Рисунок 7 — Построение квадратного ковра Серпинского

Рецепт его создания состоит в следующем. Вначале берется квадрат с длиной стороны, равной единице. Затем каждая из сторон квадрата делится на три равные части, а весь квадрат, соответственно, на девять одинаковых квадратиков со стороной равной 1/3. Из полученной фигуры вырезается центральный квадрат. Затем такой же процедуре вырезается квадрат. Зачем такой же процедуре подвергается каждый из 8 оставшихся квадратиков и т. д. (см. рис. 7)

Рисунок 8 — Квадратный ковер Серпинского

В результате чего получается дырявый квадратный ковер Серпинского со значением фрактальной размерности

Он также представляет собой пример идеального самоподобного фрактала. Его фрактальная размерность, однако, больше, чем у салфетки Серпинского, т. е. он является в каком-то смысле менее дырявом. [1]

2. Проектный раздел

Входные данные — в данной работе количество рекурсий, текущее значение trackBar1.

Выходные данные — построенный фрактал.

Метод решения: Построение фрактала осуществляется повторением одного и того же действия — вырезания квадрата, только с разными параметрами. Программа вместо вырезания рисует белые квадраты. Чтобы правильно построить фрактал, были определены основные параметры: это координаты точки левого верхнего угла квадрата и его ширина. Обозначения: количество повторений процедур —, текущую ширину квадрата —, координаты текущей точки -. В ходе анализа было установлено, что изменение значений координат происходит в каждом повторении процедуры по-разному, и это изменение зависит от текущей ширины квадрата. Поэтому была введена еще одна переменная —, от нее будет зависеть изменение координат точки. Следует отметить, что начальные значения параметров следующие: a=300,x=20,y=20, На каждом шаге будут производится следующие изменения параметров:

Далее происходит рисование всех квадратов с заданной шириной. Потом:

Рисование всех квадратов с заданной шириной a, происходит за счет рекурсивной функции. В ней осуществляется подсчет координат каждой точки.

Ниже приведены алгоритмы построения фрактала

Рисунок 9 — Блок-схема. Алгоритм функции trackBar1_Scroll.

Как видно на блок-схеме (см. рис. 9) сначала инициализируются переменные, затем проверяется условие текущего значения trackBar1-> Value, если условие верно контейнер pictureBox1 отчищается. Условие необходимо для очищения рисунка при значении 0. Если же условие не верно, в силу вступает алгоритм рисования фрактала. Рисуется большой квадрат шириной a, и цвет кисти становится белым. Далее, если допустим, что текущее значение trackBar1-> Value=2, то первая итерация цикла как бы разбивает исходный квадрат на 9 равных квадратов, причем центральный закрашивает, далее на второй итерации цикла с каждым из оставшихся восьми квадратов проделывается то же самое. Текущее значение trackBar1-> Value и определяет кол-во итераций цикла.

Рисунок 10 — Блок-схема. Алгоритм функции Rekursi.

Функция, представленная на блок-схеме (см. рис. 10) является рекурсивной, причем рекурсии продолжаются до тех пор, пока значение value не станет равным единице. В этом случае функция рисует квадрат с заданными параметрами. В ином случае функция изменяет координаты точек сначала по x, а потом по y, пробегая все необходимые значения и, таким образом, реализуя фрактал в программном обеспечении.

3. Программный раздел

Наименование ПП — Windows Forms Application. Обозначение: Kover

Функция trackBar1_Scroll задает основные параметры, их шаг изменения. За основные параметры были определены: текущее значение trackBar1 value, ширина квадрата a, координаты точки левого верхнего угла x и y. Параметры функция задает, чтобы передать их в основную функцию Recursi, которая определена в файле Rekursi. cpp. Эта функция выполняет пробег x, и при каждом значении x пробегает все y, рисуя при этом квадраты с заданной шириной, которая изменяется с каждым шагом. Для просмотра листинга функции trackBar1_Scroll см. Приложение А. Для просмотра листинга функции Rekursi см. Приложение B. Программа реализована в многофайловом проекте, путем создания заголовочного файла Hangal. h и файле Rekursi. cpp.

4. Экспериментальный раздел

Разработанная программа решает поставленную задачу и достигает цель нашей курсовой работы.

Рисунок 11 — Первый шаг построения.

На рисунке видно, что если разделить черный квадрат на девять маленьких квадратов и закрасить центральный белым цветом, у нас получается первый шаг построения фрактала.

Рисунок 12 — Второй шаг построения

Далее, у остальных восьми квадратов таким же образом зарисовываются центральные части и получается второй шаг построения фрактала. Таким образом, если дойти до четвертого шага получается следующее (см. рис. 13).

Рисунок 13 — Четвертый шаг построения.

Заключение

В ходе данной работы были достигнута основная цель и решены поставленные задачи. Основные задачи курсовой работы:

изучение способов построения фрактала Ковер Серпинского;

определение алгоритма для реализации в программной среде;

реализация построения фрактала в программной среде.

Список использованных источников

1. Божокин С. В. Паршин Д.А. Фракталы и мультифракталы. — Ижевск: НИЦ: «Регулярная и хаостическая динамика», 2001. — 128с.

2. Федер Е. Фракталы: Пер. с англ/ Данилов Ю. А, Шукуров А. — Москва «Мир», 1991. — 254с.

3. Кроновер Р. М. Фракталы и хаос в динамических системах. Основы теории. — М.: Постмаркет, 2000. — 352с.

Приложения

Приложение А

Листинг программы

#pragma once

#include «Hangal. h»

namespace Hangalova {

using namespace System;

using namespace System: ComponentModel;

using namespace System: Collections;

using namespace System: Windows: Forms;

using namespace System: Data;

using namespace System: Drawing;

// / < summary>

// / Сводка для Form1

// /

// / Внимание! При изменении имени этого класса необходимо также изменить

// / свойство имени файла ресурсов («Resource File Name») для средства компиляции управляемого ресурса,

// / связанного со всеми файлами с расширением. resx, от которых зависит данный класс. В противном случае,

// / конструкторы не смогут правильно работать с локализованными

// / ресурсами, сопоставленными данной форме.

// / < /summary>

public ref class Form1: public System: Windows: Forms: Form

{

public:

Form1 (void)

{

InitializeComponent ();

//

// TODO: добавьте код конструктора

//

}

protected:

// / < summary>

// / Освободить все используемые ресурсы.

// / < /summary>

~Form1 ()

{

if (components)

{

delete components;

}

}

private: System: Windows: Forms: PictureBox^ pictureBox1;

protected:

private: System: Windows: Forms: TrackBar^ trackBar1;

private: System: Windows: Forms: Label^ label1;

private: System: Windows: Forms: Button^ button1;

private: System: Windows: Forms: Button^ button2;

private:

// / < summary>

// / Требуется переменная конструктора.

// / < /summary>

System: ComponentModel: Container ^components;

#pragma region Windows Form Designer generated code

// / < summary>

// / Обязательный метод для поддержки конструктора — не изменяйте

// / содержимое данного метода при помощи редактора кода.

// / < /summary>

void InitializeComponent (void)

{

this-> pictureBox1 = (gcnew System: Windows: Forms: PictureBox ());

this-> trackBar1 = (gcnew System: Windows: Forms: TrackBar ());

this-> label1 = (gcnew System: Windows: Forms: Label ());

this-> button1 = (gcnew System: Windows: Forms: Button ());

this-> button2 = (gcnew System: Windows: Forms: Button ());

(cli: safe_cast< System: ComponentModel: ISupportInitialize^ > (this-> pictureBox1)) — > BeginInit ();

(cli: safe_cast< System: ComponentModel: ISupportInitialize^ > (this-> trackBar1)) — > BeginInit ();

this-> SuspendLayout ();

//

// pictureBox1

//

this-> pictureBox1->BackColor = System: Drawing: SystemColors: ActiveCaptionText;

this-> pictureBox1->Location = System: Drawing: Point (10, 11);

this-> pictureBox1->Name = L"pictureBox1″;

this-> pictureBox1->Size = System: Drawing: Size (400, 400);

this-> pictureBox1->TabIndex = 0;

this-> pictureBox1->TabStop = false;

//

// trackBar1

//

this-> trackBar1->Location = System: Drawing: Point (458, 44);

this-> trackBar1->Maximum = 4;

this-> trackBar1->Name = L"trackBar1″;

this-> trackBar1->Orientation = System: Windows: Forms: Orientation: Vertical;

this-> trackBar1->Size = System: Drawing: Size (45, 126);

this-> trackBar1->TabIndex = 1;

this-> trackBar1->Scroll += gcnew System: EventHandler (this, & Form1: trackBar1_Scroll);

//

// label1

//

this-> label1->AutoSize = true;

this-> label1->Location = System: Drawing: Point (455, 11);

this-> label1->Name = L"label1″;

this-> label1->Size = System: Drawing: Size (162, 13);

this-> label1->TabIndex = 2;

this-> label1->Text = L"Количество шагов построения";

//

// button1

//

this-> button1->Location = System: Drawing: Point (458, 224);

this-> button1->Name = L"button1″;

this-> button1->Size = System: Drawing: Size (144, 46);

this-> button1->TabIndex = 3;

this-> button1->Text = L"Увеличить";

this-> button1->UseVisualStyleBackColor = true;

this-> button1->Click += gcnew System: EventHandler (this, & Form1: button1_Click);

//

// button2

//

this-> button2->Location = System: Drawing: Point (458, 294);

this-> button2->Name = L"button2″;

this-> button2->Size = System: Drawing: Size (144, 46);

this-> button2->TabIndex = 4;

this-> button2->Text = L"Уменьшить";

this-> button2->UseVisualStyleBackColor = true;

this-> button2->Click += gcnew System: EventHandler (this, & Form1: button2_Click);

//

// Form1

//

this-> AutoScaleDimensions = System: Drawing: SizeF (6, 13);

this-> AutoScaleMode = System: Windows: Forms: AutoScaleMode: Font;

this-> ClientSize = System: Drawing: Size (656, 448);

this-> Controls->Add (this-> button2);

this-> Controls->Add (this-> button1);

this-> Controls->Add (this-> label1);

this-> Controls->Add (this-> trackBar1);

this-> Controls->Add (this-> pictureBox1);

this-> Name = L"Form1″;

this-> Text = L"Form1″;

(cli: safe_cast< System: ComponentModel: ISupportInitialize^ > (this-> pictureBox1)) — > EndInit ();

(cli: safe_cast< System: ComponentModel: ISupportInitialize^ > (this-> trackBar1)) — > EndInit ();

this-> ResumeLayout (false);

this-> PerformLayout ();

}

#pragma endregion

private: System: Double Maschtab_x;

private: System: Double Maschtab_y;

private: System: Void trackBar1_Scroll (System: Object^ sender, System: EventArgs^ e) {

float Mx=400,My=Mx, x=20,y=20;

double a, m=0;

int B, i, b;

a=300;

System: Drawing: Graphics^ formGraphics=pictureBox1-> CreateGraphics ();

System: Drawing: SolidBrush^ MyBrush;

if ((this-> trackBar1->Value) ==0)

formGraphics-> Clear (System: Drawing: Color: White);

else

{

MyBrush=gcnew SolidBrush (System: Drawing: Color: Black);

formGraphics-> FillRectangle (MyBrush, x, y, a, a);

MyBrush=gcnew SolidBrush (System: Drawing: Color: White);

for (i=1; i<= (this-> trackBar1->Value); i++)

{

a=a/3;

x=x+a;

y=y+a;

b=Rekursi (this-> trackBar1->Value, a, m, x, y, MyBrush, formGraphics);

x=20;

y=20;

m=a;

}

}

}

};

}

Приложение B

Листинг функции Rekursi

#include < stdafx. h>

int Rekursi (int value, double a, double m, float x, float y, System: Drawing: SolidBrush^ brush, System: Drawing: Graphics^ form)

{

int p, k, Mx=320,My=Mx;

if (value==1)

{

form-> FillRectangle (brush, x, y, a, a);

p=0;

return p;

}

else

{

for (int j=x; j< =Mx; j=j+m)

{

for (k=y; k< =My; k=k+m)

{

if (m==0)

{

p=Rekursi (1,a, m, j, k, brush, form);

break;

}

p=p+Rekursi (value-1,a, m, j, k, brush, form);

}

if (m==0)

break;

}

}

}

ПоказатьСвернуть
Заполнить форму текущей работой