Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Метод_кон_раб_Компьютерная Графика_2011_заоч.doc
Скачиваний:
21
Добавлен:
07.06.2015
Размер:
6.41 Mб
Скачать

Алгоритм 1 (условный пример)

Шаг 1:

Положить p(0)=pmin+Np*dp, q(0)=qmin+Nq*dq, k=0, x(0)=y(0)=0. x и у - обнуляются при каждом обращении к 1 шагу поскольку в процессе итерирования значения х и у изменяются.

Шаг 2 (итерация):

Вычислить x(k+1) и y(k+1), используя формулы

x(k+1)=x(k)2*x(k)-y(k)2 + p,

Увеличить счетчик k на 1 (k:=k+1).

Шаг 3 (оценка):

Вычислить r=x(k)2+y(k)2.

Если r>M, то выбрать цвет k и идти на шаг 4.

Если k=M, то выбрать цвет 0 (черный) и идти на шаг 4.

r<=M, k<M. Вернуться на шаг 2.

Шаг 4:

Приписать цвет k точке экрана (p(n), q(n)) и перейти к следующей точке, начиная с шага 1.

Меняя функцию, условия выхода из цикла можно получать другие фракталы. Например, взяв вместо выражения С=a+bi выражение Z0=a+bi, а С присваивать произвольные значения мы получим множество Жюлиа, тоже красивый фрактал. Будем рассматривать последовательности комплексных чисел {Zn}. Возьмем произвольное комплексное число c. Теперь для любого комплексного числа k рассмотрим последовательность {Zn(k)}:

Z0 = k,

Zi+1= Zi2 + c

Зададим себе вопрос: сходится ли Zn к нулю или стремится к бесконечности при n стремящемся к бесконечности? Пусть J – множество всех комплексных чисел {k}, таких что {Zn(k)}стремится к 0, при n стремящемся к бесконечности. Если теперь мы возьмем все такие k и отобразим их на комплексной плоскости, то получим множество Жюлиа. Меняя c, мы получим бесконечный набор фантастических само подобных образов – множеств Жюлиа.

Алгоритм 2 (условный пример)

Шаг 0:

Выбрать параметр c=p+iq, выбрать Xmin = -1.5, Ymin = -1.5, Xmax = 1.5, Ymax = 1.5

Это означает, что p - реальная переменная, iq - воображаемая, но тоже вполне реальная переменная. Например, p = 0.32 c_img = 0.043. Эти параметры являются константой при построении одного отображения и их значения определяют рисунок. Масштабировать отображения можно меняя значения Xmax, Xmin, Ymax, Ymin.

Выбрать число M, которое считается бесконечно большим.

Этот параметр определяет максимальное число итераций

Вычислить dx=(Xmax-Xmin)/(A-1), dy=(Ymax-Ymin)/(B-1).

Для всех пар (Nx, Ny), где Nx=0,1... A-1 и Ny=0,1...B-1 выполнить следующую процедуру.

Шаг 1(первый и второй циклы):

Положить x(n)=xmin+Nx*dx, y(n)=ymin+Ny*dy, k=0. Здесь последовательно изменяются только Nx и Ny, на одно изменение Nx приходится В изменений Ny. Пиксел который будет в дальнейшем окрашиваться имеет координаты (x(n),y(n)).

Шаг 2 (третий цикл, итерация):

Вычислить x(k+1) и y(k+1), по формулам

x(k+1)=x(k)2*x(k)-y(k)2 + p,

y(k+1)=2*x(k)*y(k) + q.

Увеличить счетчик k на 1 (k:=k+1).

Шаг 3 (оценка внутри 3 цикла):

Вычислить r=x(k)2+y(k)2.

Если r>M, то идти на шаг 4.

Если k=K, то выбрать цвет 0 (черный) и идти на шаг 4. В этой строке что-то не так, опечатка наверное, дело в том, что количество цветов К может равняться 2, 16, 255 и т.д. и прерывать цикл с М>К нет смысла. В целом это условие касается только алгоритма раскрашивания. Строка получает законный и концептуальный вид прерывания итерации при достижении допустимого максимума если к=М, или полностью:

Если k=M то выбрать цвет 0 (черный) и идти на шаг 4.

Если r<=M и k<M. Вернуться на шаг 2.Здесь тоже была опечатка типа (Если r<=М, k<К)

Шаг 4:

Приписать цвет k точке экрана (x(n), y(n)) и перейти к следующей точке, начиная с шага 1.

В 1915 году польский математик Вацлав Серпинский придумал занимательный объект, известный как решето Серпинского. Этот треугольник один из самых ранних известных примеров фракталов. Существует несколько способов построения этого фрактала. Один из них представляет следующий процесс. Берётся сплошной равносторонний треугольник, на первом шаге из центра удаляется перевёрнутый треугольник. На втором шаге удаляется три перевёрнутых треугольника из трёх оставшихся треугольников. Продолжая этот процесс, на -ом шаге удаляем перевёрнутых треугольников из центров оставшихся треугольников. Конца этому процессу не будет, и в треугольнике не останется живого места, но и на части он не распадётся - получится объект состоящий из одних только дырок. Это и есть треугольник Серпинского. Треугольник Серпинского также называют салфеткой Серпинского.

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

Рассмотрим алгоритм построения. Для его построения из центра треугольника мысленно вырежем кусок треугольной формы, который своими вершинами будет упираться в середины сторон исходного треугольника. Повторим эту же процедуру для трех образовавшихся треугольников (за исключением центрального) и так до бесконечности. Если мы теперь возьмем любой из образовавшихся треугольников и увеличим его - получим точную копию целого. В данном случае мы имеем дело с полным самоподобием. Другими словами рисуется равносторонний треугольник. Каждая сторона делится пополам и соединяется линиями. Центральный треугольник отбрасываем. А из получившихся трех маленьких треугольников снова находим середины. И так далее.

Прописываем событие Button1Click. В процедуре мы прорисовываем первый, самый большой треугольник. Далее мы вызываем рекурсивную процедуру. Процедура находит середины сторон каждого треугольника и соединяет их линиями, которые собой образуют новый треугольник.

Пример реализации:

{begin

mx := 320;

my := 479;

rad := my;

Randomize;

x := 0.0;

y := 0.0;

for k := 1 to iter do

begin

p := Random;

t := x;

if p >= 1/3 then

begin

x := 0.50 * x + 0.00 * y + 0.0;

y := 0.00 * t + 0.50 * y + 0.5;

end

else

if p >= 2/3 then

begin

x := 0.50 * x + 0.00 * y - 0.25;

y := 0.00 * t + 0.50 * y + 0.0;

end

else

begin

x := 0.50 * x + 0.00 * y + 0.25;

y := 0.00 * t + 0.50 * y + 0.0;

end;

PutPixel(mx + Round(rad * x), my - Round(rad * y), 2);

end;

end;}

Результат:

Пример реализации:

{procedure serp(x1, y1, x2, y2: real; n: integer);

var

x1n, y1n, x2n, y2n: real;

begin

if n > 0 then begin

x1n:= 2*x1/3+x2 / 3;

x2n:= x1/3+2*x2 / 3;

y1n:= 2*y1/3+y2 / 3;

y2n:= y1/3+2*y2 / 3;

rectangle(round(x1n),round(y1n),round(x2n),round(y2n));

serp(x1, y1, x1n, y1n, n-1);

serp(x1n, y1, x2n, y1n, n-1);

serp(x2n, y1, x2, y1n, n-1);

serp(x1, y1n, x1n, y2n, n-1);

serp(x2n, y1n, x2, y2n, n-1);

serp(x1, y2n, x1n, y2, n-1);

serp(x1n, y2n, x2n, y2, n-1);

serp(x2n, y2n, x2, y2, n-1);

end;

end;}

Результат:

Задание 2. Ознакомиться с методами геометрических преобразований графических объектов. Написать программу позволяющую:

1) Построить простейшие геометрические объекты согласно варианта из табл 2. (координаты объекта задать произвольно).

2) Выполнить аффинные преобразования:

а) параллельный перенос;

b) поворот вокруг осей OX, OY на угол α;

c) масштабирование;

Исходную и преобразованную фигуру ввести на экран разными цветами (по желанию).

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

Таблица 2 – Задания

Номер варианта

Вид объекта

Угол поворота, α

Константы

переноса

Константы

масштабирования

α

β

λ

μ

1

квадрат

Pi/4

50

-50

2

0.5

2

прямоугольник

-Pi/4

0

100

2

0.5

3

Треугольник

Pi/2

100

100

1

2

4

окружность

Pi

150

-50

0.5

1

5

квадрат

-Pi

-150

50

2

1

6

треугольник

-Pi/2

50

50

0.5

2

7

прямоугольник

Pi

150

0

1

2

8

окружность

Pi/4

-100

0

2

1

9

квадрат

-Pi/4

-50

-100

0.5

2

10

прямоугольник

Pi/2

0

-100

1

0.5

11

треугольник

-Pi

100

-150

2

2

12

окружность

-Pi/2

50

-150

0.5

0.5

13

квадрат

Pi/6

-150

-50

0.5

3

14

прямоугольник

-Pi/6

-100

100

2

3

15

треугольник

Pi/6

50

100

1

3

16

окружность

Pi/4

50

-50

2

0.5

17

квадрат

-Pi/4

0

100

2

0.5

18

прямоугольник

Pi/2

100

100

1

2

19

треугольник

Pi

150

-50

0.5

1

20

окружность

-Pi

-150

50

2

1

21

квадрат

-Pi/2

50

50

0.5

2

22

прямоугольник

Pi

150

0

1

2

23

треугольник

Pi/4

-100

0

2

1

24

окружность

-Pi/4

-50

-100

0.5

2

25

квадрат

Pi/2

0

-70

2

0.5

26

квадрат

Pi/4

30

-50

2

1,5

27

прямоугольник

-Pi/4

60

50

2

2

28

Треугольник

Pi/2

40

40

1,5

2

29

окружность

Pi

15

-5

0.5

1,5

30

квадрат

-Pi

-115

130

2,5

1,5

31

треугольник

-Pi/2

75

75

0.5

2

32

прямоугольник

Pi

145

160

1

2

33

окружность

Pi/4

-120

160

1

1

34

квадрат

-Pi/4

-55

-95

0.5

2

35

прямоугольник

Pi/2

-145

-140

1

0.5

36

треугольник

-Pi

110

-115

2

2

37

окружность

-Pi/2

120

-120

0.5

0.5

38

квадрат

Pi/6

-115

-130

2

3

39

прямоугольник

-Pi/6

-110

-115

2

3

40

треугольник

Pi/6

-115

-115

1

3

41

окружность

Pi/4

75

-75

2

2

42

квадрат

-Pi/4

0

130

2

0.5

43

прямоугольник

Pi/2

120

130

1

2

44

треугольник

Pi

115

-50

0.5

1

45

окружность

-Pi

-115

150

2

1

46

квадрат

-Pi/2

95

50

0.5

2

47

прямоугольник

Pi

150

65

1

2

48

треугольник

Pi/4

-100

0

2

1

49

окружность

-Pi/4

-70

-110

0.5

2

50

квадрат

Pi/2

70

-100

1

0.5

51

квадрат

-Pi

-150

90

2

1

52

треугольник

-Pi/2

85

80

0.5

2

53

прямоугольник

Pi

150

80

1

2

54

окружность

Pi/4

-100

60

2

1

55

квадрат

-Pi/4

-70

-100

0.5

2