Стохастические фракталы в компьютерной графике

Автор работы: Пользователь скрыл имя, 19 Мая 2015 в 15:11, курсовая работа

Описание работы

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

Содержание работы

ВВЕДЕНИЕ 3
ГЛАВА I. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 4
Понятие «Фрактал» 4
История возникновения фракталов 5
Фрактальная размерность 8
Типы фракталов 10
1.4.1 Геометрические фракталы . 10
1.4.2 Алгебраические фракталы . 11
1.4.3 Системы итерируемых функций. 12
1.4.4 Стохастические фракталы. 14
Шероховатость 16
ГЛАВА II. ПРАКТИЧЕСКАЯ ЧАСТЬ 17
2.1 Алгоритм построения фрактала «Плазма» 17
2.2 Разработка программного кода 18
2.3. Описание работы программы 20

ЗАКЛЮЧЕНИЕ 22
СПИСОК ЛИТЕРАТУРЫ 23

Файлы: 1 файл

Курсовая.docx

— 1.64 Мб (Скачать файл)

2.3. Описание работы программы

 

 

Сначала пользователь вводит начальные оттенки четырех углов прямоугольника и значение шероховатости, чтобы программа могла построить фрактал, и нажимает кнопку «ОК». На экране появится рисунок этого фрактала (Рис. В.1).  Рекомендуется вводить значение шероховатости в пределах от 1 до 3. В программе предусмотрено ограничение на ввод значений оттенка цвета. Если пользователь задаст  число меньшее чем 0 или большее чем 255, то на экран поступит сообщение об ошибке. Ввод других символов, кроме как цифр, заблокирован (Рис. В.6).

Пользователь может сохранить изображение или очистить форму для генерации другого рисунка. Если оставить поля ввода пустыми и нажать «ОК», программа сгенерирует случайный фрактал с шероховатостью равной двум (Рис. В.2). Изначально рисуется разноцветная плазма, но можно поменять цвет и сделать её красной (Рис. В.3), зелёной (Рис.В.4) или синей (Рис. В.5), выбрав для этого соответствующей переключатель на форме.

 

 

 

 

 

 

 

 

ЗАКЛЮЧЕНИЕ

 

 

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

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

 

 

СПИСОК ЛИТЕРАТУРЫ

 

  1. Hausdorff F. Dimension und Ausseres Mass. // Mathematische Annalen. – 1919. - Vol. 79. - pp. 157-179.
  2. Божокин С.В., Паршин Д.А. Фракталы и мультифракталы. — Ижевск: НИЦ Регулярная и хаотическая динамика, 2001, 128 с.
  3. Глейк Дж. Хаос: Создание новой науки. // Пер. с англ. Н. Нахмансона — Спб: Амфора, 2001, 398 с.
  4. Кроновер Р.М. Фракталы и хаос в динамических системах. Основы теории. — М: Постмаркет, 2000, 352 с.
  5. М. И. Турбина Эти вездесущие фракталы! // Наука и техника в Якутии № 1 (12), 2007, c. 108—113.
  6. Мандельброт Б. Б. — Фракталы и хаос. Множество Мандельброта и другие чудеса. // Пер. с англ. Н. Зубченко — М. — Ижевск: НИЦ Регулярная и хаотическая динамика, 2009, 392 с.
  7. Мандельброт Б. Самоаффинные фрактальные множества, «Фракталы в физике» // Под ред. А. Пьетроноро, Э. Тозатти. М.: Мир, 1988, 672 c.
  8. Мандельброт Б. Фрактальная геометрия природы. — М.: Институт компьютерных исследований, 2002, с.
  9. Морозов А.Д. Введение в теорию фракталов—М. — Ижевск: Институт компьютерных исследований, 2002, 160 с.
  10. Рюэль Д. Случайность и хаос. // Пер. с англ. Н. Зубченко — Ижевск: НИЦ Регулярная и хаотическая динамика, 2001, 192 с.
  11. Уэстид С. Фракталы и вейвлеты для сжатия изображений в действии. – М.: Триумф, 2003, 320 с.
  12. Федер Е. Фракталы. // Пер. с англ. — М: Мир, 1991, 254 с.
  13. Шредер М. Фракталы, хаос, степенные законы. Миниатюры из бесконечного рая. — Ижевск: НИЦ Регулярная и хаотическая динамика, 2001, 528 с.

ПРИЛОЖЕНИЯ

ПРИЛОЖЕНИЕ А.

 

Рисунок А.1— Множество Кантора или Канторова пыль.

Рисунок А.2 — Кривая Коха.

Рисунок А.3 — Зависимость массы фрактального объекта  при изменении масштаба  длины.

 

Рисунок А.4 — Кривая Пеано.

 

Рисунок А.5 — Треугольник Серпинского.

 

Рисунок А.6 — Ломаная дракона.

 

Рисунок А.7 — Кривая Леви.

Рисунок А.8 — Множество Мандельброта.

 

 

 

Рисунок А.9 — Множество Жюлиа для z2+0,37-0,248i.

 

ПРИЛОЖЕНИЕ Б.

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

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, ExtCtrls, Buttons, ExtDlgs;

type

    Color=record

       red: Byte;

       green: Byte;

       blue: Byte;

    end;

  TForm1 = class(TForm)

    BitBtn1: TBitBtn;

    Label1: TLabel;

    Edit1: TEdit;

    Label2: TLabel;

    Label3: TLabel;

    Edit2: TEdit;

    Edit3: TEdit;

    BitBtn2: TBitBtn;

    BitBtn3: TBitBtn;

    BitBtn4: TBitBtn;

    SavePictureDialog1: TSavePictureDialog;

    Label4: TLabel;

    Edit4: TEdit;

    Image1: TImage;

    Label5: TLabel;

    Label6: TLabel;

    Label7: TLabel;

    Edit5: TEdit;

    Edit6: TEdit;

    Edit7: TEdit;

    Label8: TLabel;

    Label9: TLabel;

    Label10: TLabel;

    Edit8: TEdit;

    Edit9: TEdit;

    Edit10: TEdit;

    Label11: TLabel;

    Label12: TLabel;

    Label13: TLabel;

    Edit11: TEdit;

    Edit12: TEdit;

    Edit13: TEdit;

    Label14: TLabel;

    Label15: TLabel;

    Label16: TLabel;

    Label17: TLabel;

    RadioGroup1: TRadioGroup;

    RadioButton1: TRadioButton;

    RadioButton2: TRadioButton;

    RadioButton3: TRadioButton;

    RadioButton4: TRadioButton;

    Label18: TLabel;

    procedure Midpoint(Ax1,Ay1,Cx3,Cy3: integer);

    procedure BitBtn1Click(Sender: TObject);

    procedure BitBtn2Click(Sender: TObject);

    procedure BitBtn3Click(Sender: TObject);

    procedure BitBtn4Click(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure Border;

    procedure Edit1KeyPress(Sender: TObject; var Key: Char);

    procedure Edit2KeyPress(Sender: TObject; var Key: Char);

    procedure Edit3KeyPress(Sender: TObject; var Key: Char);

    procedure Edit5KeyPress(Sender: TObject; var Key: Char);

    procedure Edit6KeyPress(Sender: TObject; var Key: Char);

    procedure Edit7KeyPress(Sender: TObject; var Key: Char);

    procedure Edit8KeyPress(Sender: TObject; var Key: Char);

    procedure Edit9KeyPress(Sender: TObject; var Key: Char);

    procedure Edit10KeyPress(Sender: TObject; var Key: Char);

    procedure Edit11KeyPress(Sender: TObject; var Key: Char);

    procedure Edit12KeyPress(Sender: TObject; var Key: Char);

    procedure Edit13KeyPress(Sender: TObject; var Key: Char);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

  Rect: TRect;

  A: array[0..512,0..512] of Color;

  ch: Boolean;

 

implementation

{$R *.dfm}

 

procedure TForm1.FormCreate(Sender: TObject);

Begin

Border;

Rect.Left:=0;

Rect.Top:=0;

Rect.Right:=Image1.Width;

Rect.Bottom:=Image1.Height;

Image1.Canvas.Brush.Color:=clWhite;

End;

 

procedure TForm1.Border;

Begin

with Image1.Canvas do

   Begin

      MoveTo(0, 0);

      LineTo(Image1.Width-1, 0);

      LineTo(Image1.Width-1, Image1.Height-1);

      LineTo(0, Image1.Height-1);

      LineTo(0, 0);

   End;

 

End;

procedure TForm1.BitBtn1Click(Sender: TObject);

var x,y: Integer;

begin

ch:=false;

if edit1.Text='' then A[0,0].red:=Random(256)

else  if (StrToInt(edit1.Text)>=0) and (StrToInt(edit1.Text)<256)

       then A[0,0].red:=StrToInt(edit1.Text)

else ch:=true;

if edit2.Text='' then A[0,0].green:=Random(256)

else  if (StrToInt(edit2.Text)>=0) and (StrToInt(edit2.Text)<256)

then A[0,0].green:=StrToInt(edit2.Text)

else ch:=true;

if edit3.Text='' then A[0,0].blue:=Random(256)

else  if (StrToInt(edit3.Text)>=0) and (StrToInt(edit3.Text)<256)

       then A[0,0].blue:=StrToInt(edit3.Text)

        else ch:=true;

if edit5.Text='' then A[512,0].red:=Random(256)

else  if (StrToInt(edit5.Text)>=0) and (StrToInt(edit5.Text)<256)

       then A[512,0].red:=StrToInt(edit5.Text)

        else ch:=true;

if edit6.Text='' then A[512,0].green:=Random(256)

else  if (StrToInt(edit6.Text)>=0) and (StrToInt(edit6.Text)<256)

       then A[512,0].green:=StrToInt(edit6.Text)

        else ch:=true;

if edit7.Text='' then A[512,0].blue:=Random(256)

else  if (StrToInt(edit7.Text)>=0) and (StrToInt(edit7.Text)<256)

       then A[512,0].blue:=StrToInt(edit7.Text)

        else ch:=true;

if edit11.Text='' then A[512,512].red:=Random(256)

else  if (StrToInt(edit11.Text)>=0) and (StrToInt(edit11.Text)<256)

       then A[512,512].red:=StrToInt(edit11.Text)

        else ch:=true;

if edit12.Text='' then A[512,512].green:=Random(256)

else  if (StrToInt(edit12.Text)>=0) and (StrToInt(edit12.Text)<256)

       then A[512,512].green:=StrToInt(edit12.Text)

        else ch:=true;

if edit13.Text='' then A[512,512].blue:=Random(256)

else  if (StrToInt(edit13.Text)>=0) and (StrToInt(edit13.Text)<256)

       then A[512,512].blue:=StrToInt(edit13.Text)

       else ch:=true;

if edit8.Text='' then A[0,512].red:=Random(256)

else  if (StrToInt(edit8.Text)>=0) and (StrToInt(edit8.Text)<256)

       then A[0,512].red:=StrToInt(edit8.Text)

        else ch:=true;

if edit9.Text='' then A[0,512].green:=Random(256)

else  if (StrToInt(edit9.Text)>=0) and (StrToInt(edit9.Text)<256)

       then A[0,512].green:=StrToInt(edit9.Text)

        else ch:=true;

if edit10.Text='' then A[0,512].blue:=Random(256)

else  if (StrToInt(edit10.Text)>=0) and (StrToInt(edit10.Text)<256)

       then A[0,512].blue:=StrToInt(edit10.Text)

        else ch:=true;

if ch=false then

    Begin

      Midpoint(0,0,512,512);

         if RadioButton1.Checked then

         for x:=0 to 512 do

         Begin

            for y:=0 to 512 do

            Image1.Canvas.Pixels[x,y]:=rgb(A[x,y].red, 0, 0);

            Image1.update;

         End;

         if RadioButton2.Checked then

         for x:=0 to 512 do

         Begin

            for y:=0 to 512 do

            Image1.Canvas.Pixels[x,y]:=rgb(0, A[x,y].green, 0);

            Image1.update;

         End;

     if RadioButton3.Checked then

     for x:=0 to 512 do

        Begin

         for y:=0 to 512 do

           Image1.Canvas.Pixels[x,y]:=rgb(0, 0, A[x,y].blue);

           Image1.update;

        End;

    if RadioButton4.Checked then

    for x:=0 to 512 do

      Begin

         for y:=0 to 512 do

         Image1.Canvas.Pixels[x,y]:=rgb(A[x,y].red, A[x,y].green, A[x,y].blue);

         Image1.update;

      End;

  End

  Else Application.MessageBox('Ошибка! Введите значение от 0 до 255',    'Внимание!',MB_ICONWARNING+MB_OK);

end;

procedure TForm1.Midpoint(Ax1,Ay1,Cx3,Cy3: integer);

       procedure GetIntens(xa,ya,x,y,xb,yb: integer);

       var      d: integer;

                v, k: double;

       Begin

                if (A[x,y].red<>0)or(A[x,y].green<>0)or(A[x,y].blue<>0) then Exit;

                d:=Abs(xa-xb)+Abs(ya-yb);

                if Edit4.Text='' then k:=2

                else k:=StrTofloat(Edit4.Text);

                v:=(A[xa,ya].red+A[xb,yb].red)/2+(Random-0.5)*d*k;

                if v<1 then v:=1;

                if v>255 then v:=255;

                A[x,y].red:=Trunc(v);

                v:=(A[xa,ya].green+A[xb,yb].green)/2+(Random-0.5)*d*k;

                if v<1 then v:=1;

                if v>255 then v:=255;

                A[x,y].green:=Trunc(v);

                v:=(A[xa,ya].blue+A[xb,yb].blue)/2+(Random-0.5)*d*k;

                if v<1 then v:=1;

                if v>255 then v:=255;

                A[x,y].blue:=Trunc(v);

       End;

   var       x,y: Integer;

             v: double;

   Begin

    if (Cx3-Ax1<2) and (Cy3-Ay1<2) then Exit;

    x:=(Ax1+Cx3) div 2;

    y:=(Ay1+Cy3) div 2;

   GetIntens(Ax1,Ay1,x,Ay1,Cx3,Ay1);

   GetIntens(Cx3,Ay1,Cx3,y,Cx3,Cy3);

   GetIntens(Ax1,Cy3,x,Cy3,Cx3,Cy3);

   GetIntens(Ax1,Ay1,Ax1,y,Ax1,Cy3);

        if (A[x,y].red=0)and(A[x,y].green=0)and(A[x,y].blue=0)  then

Begin

v:=(A[Ax1,Ay1].red+A[Cx3,Ay1].red+A[Cx3,Cy3].red+A[Ax1,Cy3].red)/4;

A[x,y].red:=Trunc(v);

v:=(A[Ax1,Ay1].green+A[Cx3,Ay1].green+A[Cx3,Cy3].green+A[Ax1,Cy3].green)/4;

A[x,y].green:=Trunc(v);

v:=(A[Ax1,Ay1].blue+A[Cx3,Ay1].blue+A[Cx3,Cy3].blue+A[Ax1,Cy3].blue)/4;

A[x,y].blue:=Trunc(v);

End;

   Midpoint(Ax1,Ay1,x,y);

   Midpoint(x,Ay1,Cx3,y);

   Midpoint(x,y,Cx3,Cy3);

   Midpoint(Ax1,y,x,Cy3);

End;

procedure TForm1.BitBtn2Click(Sender: TObject);

begin

Form1.Close;

end;

procedure TForm1.BitBtn3Click(Sender: TObject);

var x,y: Integer;

begin

Image1.Canvas.FillRect(Rect);

Информация о работе Стохастические фракталы в компьютерной графике