Автор работы: Пользователь скрыл имя, 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
2.3. Описание работы программы
Сначала пользователь вводит начальные оттенки четырех углов прямоугольника и значение шероховатости, чтобы программа могла построить фрактал, и нажимает кнопку «ОК». На экране появится рисунок этого фрактала (Рис. В.1). Рекомендуется вводить значение шероховатости в пределах от 1 до 3. В программе предусмотрено ограничение на ввод значений оттенка цвета. Если пользователь задаст число меньшее чем 0 или большее чем 255, то на экран поступит сообщение об ошибке. Ввод других символов, кроме как цифр, заблокирован (Рис. В.6).
Пользователь может сохранить изображение или очистить форму для генерации другого рисунка. Если оставить поля ввода пустыми и нажать «ОК», программа сгенерирует случайный фрактал с шероховатостью равной двум (Рис. В.2). Изначально рисуется разноцветная плазма, но можно поменять цвет и сделать её красной (Рис. В.3), зелёной (Рис.В.4) или синей (Рис. В.5), выбрав для этого соответствующей переключатель на форме.
ЗАКЛЮЧЕНИЕ
Открытие фракталов произвело революцию не только в геометрии, но и в физике, химии, биологии, медицине. Фрактальные алгоритмы нашли применение и в информационных технологиях, например, для сжатия данных. В механике и физике фракталы используются благодаря уникальному свойству повторять очертания многих объектов природы, это особенно ценно в исследовании плазмы, турбулентные потоках и др. физических процессах.
Роль фракталов в компьютерной графике сегодня, несомненно, велика. Они приходят на помощь, например, когда требуется с помощью нескольких коэффициентов задать линии и поверхности очень сложной формы. С точки зрения компьютерной графики, стохастические фракталы незаменимы при генерации искусственных облаков, гор, поверхности моря и других природных ландшафтов. Фактически найден способ легкого представления сложных неевклидовых объектов, образы которых весьма похожи на природные. Поэтому фрактальные модели сегодня широко применяют в компьютерных играх, создавая в них обстановку, которую уже трудно отличить от реальности.
СПИСОК ЛИТЕРАТУРЫ
ПРИЛОЖЕНИЯ
ПРИЛОЖЕНИЕ А.
Рисунок А.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:=
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.
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.
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.
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.
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(
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.
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(
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(
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(
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.
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(
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(
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]:
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]:
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]:=
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]:=
Image1.update;
End;
End
Else Application.MessageBox('
end;
procedure TForm1.Midpoint(Ax1,Ay1,Cx3,
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].
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)
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].
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].
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,
GetIntens(Cx3,Ay1,Cx3,y,Cx3,
GetIntens(Ax1,Cy3,x,Cy3,Cx3,
GetIntens(Ax1,Ay1,Ax1,y,Ax1,
if (A[x,y].red=0)and(A[x,y].
Begin
v:=(A[Ax1,Ay1].red+A[Cx3,Ay1].
A[x,y].red:=Trunc(v);
v:=(A[Ax1,Ay1].green+A[Cx3,
A[x,y].green:=Trunc(v);
v:=(A[Ax1,Ay1].blue+A[Cx3,Ay1]
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);
Информация о работе Стохастические фракталы в компьютерной графике