Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Book2v1

.pdf
Скачиваний:
23
Добавлен:
21.03.2016
Размер:
17.8 Mб
Скачать

Итак, у нас есть точка n, которую мы принимаем за центр новой окружности с радиусом 200. По этой окружности мы рассчитываем координаты двух точек x1 и y1 и x2 и y2, которые используем для отрисовки отрезка в строке 25. Получается, что мы отрисовываем отрезок, концы которого вращаются вокруг точки, которая в свою очередь вращается вокруг центра с координатами cx и cy. В результате мы получаем изображение, представленное на Рисунке 49.

Рис. 49: Результат выполнения Листинга 41. Геометрический цветок.

Вынесем логику отрисовки линий в отдельный метод oneLineDraw(), как показано в Листинге 42. И добавим еще и изменение радиуса первой окружности, по которой вращается воображаемая точка n. Для изменения радиуса введем свойство (переменную) cRadius, которая будет зависеть от counter (см. строку 42).

91

92
counter += 0.1;
if ( counter > 2* PI ) {
oneLineDraw (x2 , y2 ); oneLineDraw (x1 , y1 );
float x1 = nx - sin ( counter ) *(150) ; float y1 = ny - cos ( counter ) *(150) ; float x2 = nx + sin ( counter ) *(150) ; float y2 = ny + cos ( counter ) *(150) ;
nx = sin ( counter1 )* cRadius + cx ; ny = cos ( counter1 )* cRadius + cy ;
1
2 float counter , counter1 , cx , cy , nx , ny ; 3 float cRadius = 20;
4
5 void setup () {
6 size (500 , 500) ;
7 smooth () ;
8 background (0) ;
9 strokeWeight (1) ; 10 cx = width /2;
11 cy = height /2;
12 }
13
14 void oneLineDraw ( float ncx , float ncy ) { 15 float x1 = ncx - sin ( counter1 ) *(100) ; 16 float y1 = ncy - cos ( counter1 ) *(100) ; 17 float x2 = ncx + sin ( counter1 ) *(100) ; 18 float y2 = ncy + cos ( counter1 ) *(100) ; 19 line (x1 , y1 , x2 , y2 );
20 }
21
22 void draw () {
23 stroke (200 , 25) ;
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Метод oneLineDraw() принимает два аргумента x и y. Эти аргументы он использует для формирования координат и отрисовки линии в строках с 15-й по 19-ю. Логика вычисления координат очень похожа на логику кода предыдущего Листинга: так же используются методы для вычисления синуса и косинуса. Координаты вычисляются, исходя из радиуса, равного 100 и счетчика counter1. Вы, конечно, можете изменить логику вичисления координат, что бы достичь нового художественного результата отрисовки.
Листинг 42: Рисуем синусоидную звезду на черном фоне

38counter = 0;

39}

40

41 counter1 += 0.01;

42 cRadius += counter /20;

43

44if ( counter1 > 2* PI ) {

45counter1 = 0;

46}

47}

Результат работы кода Листинга 42 показан на Рисунках 50 и 51 (с измененным размером центральной части).

Рис. 50: Результат выполнения Листинга 42. Синусоидная звезда на черном фоне 1.

93

Рис. 51: Результат выполнения Листинга 42. Синусоидная звезда на черном 2.

На правой части рисунка показаны первые кадры отрисовки. Рендеринг (отрисовка) происходит не сразу: каждый кадр приложение рисует одну линию, как бы вышивая белый узор на черном поле холста. Это «прорастание», постепенное формирование графики и является признаками генеративного метода получения изображений.

Изменяя параметры отрисовки, например, толщину линий, размер окружности и длину линий в методе oneLineDraw(), можно получить интересные эффекты (см. Рисунок 52).

Задание 2. Измените код Листинга 42 так, чтобы линии на холсте формировали рисунок, похожий на Рисунок 52.

94

Рис. 52: Результат задания 2. Вариации на тему звезды.

Приведем еще один пример использования тригонометрических функций. В Листинге 43 мы строим прямоугольную сетку точек. Сетка строится двумя циклами for, вложенными друг в друга (см. строки 15 и 16).

Каждый раз, когда вызывается метод draw(), циклы отрабатывают свои задачи. А именно, в 17-й и 18-й строках формируются координаты текущей точки сетки; с 20-й по 23-ю строку формируются координаты начала и конца отрезков в зависимости от значения счетчика counter.

Листинг 43: Рисуем диагональные звезды

1

 

 

2

void setup ()

{

3

size (500 ,

500) ;

4smooth () ;

5background (0) ;

6strokeWeight (1) ;

7}

8

9 float counter , nx , ny ;

10float cx = 250;

11float cy = 250;

12

13void draw () {

14stroke (200 , 5) ;

15

for ( float si =

0; si

<

6;

si +=1) {

16

for

( float ci

=

0;

ci

<

6; ci +=1) {

17

nx

=

ci *80

+

50;

 

 

 

18

ny

=

si *80

+

50;

 

 

 

95

19

20

21

22

23

24

25

26

27

28

29

30

31

32

float x1 = nx - sin ( counter ) *(50) ; float y1 = ny - cos ( counter ) *(50) ; float x2 = ny + sin ( counter ) *(50) ; float y2 = nx + cos ( counter ) *(50) ; line (x1 , y1 , x2 , y2 );

}

}

counter += 0.1;

if ( counter > 2* PI ) { counter = 0;

}

33}

Врезультате выполнения кода Листинга 43 мы получаем изображение, показанное на Рисунке 53.

Рис. 53: Результат выполнения Листинга 43. Диагональные звезды на черном фоне.

96

Задание 3. Измените код Листинга 43: после 18-й строки вставьте отрисовку точки сетки (т.е. необходимо отрисовывать точки с координатами nx и ny).

На примере кода Листинга 44 можно увидеть использование переключателя . В строке 27 переключатель меняет свой знак. От знака этого переключателя зависит формирование координат и . Логическое условие в строке 17 обеспечивает исполнение строк или 18 – 20, или 22 – 24. Таким образом при каждом вызове метода draw() отрисовыется или светлый отрезок, или темный.

Листинг 44: Синусоидный орнамент из крупных отрезков

1

 

 

2

void setup ()

{

3

size (500 ,

500) ;

4smooth () ;

5background (0) ;

6strokeWeight (50) ;

7}

8

9 float counter , counter1 , nx , ny ;

10float cx = 250;

11float cy = 250;

12float cRadius = 10;

13int switcher = 1;

14

 

 

 

15

void draw () {

 

 

16

 

 

 

17

if ( switcher > 0) {

 

 

18

nx = cos ( counter1 )* cRadius

+

cx ;

19

ny = sin ( counter1 )* cRadius

+

cy ;

20stroke (0 , 50) ;

21} else {

22

nx

=

sin ( counter1 )* cRadius

+

cx ;

23

ny

=

cos ( counter1 )* cRadius

+

cy ;

24stroke (250 , 50) ;

25}

26

 

 

 

 

 

27

switcher

*= -1;

 

28

 

 

 

 

 

29

float x1 = nx - sin ( counter ) *(20) ;

30

float y1

=

ny

-

cos ( counter ) *(20) ;

31

float x2

=

nx

+

sin ( counter ) *(20) ;

32

float y2

=

ny

+

cos ( counter ) *(20) ;

97

33

34 line (x1 , y1 , x2 , y2 );

35

36 counter += 0.1;

37 if ( counter > 2* PI ) {

38counter = 0;

39}

40

41 counter1 += 0.01;

42

43 cRadius += counter /50;

44

45if ( counter1 > 2* PI ) {

46counter1 = 0;

47}

48}

Результат работы кода Листинга 44 показан на рисунке 54. Этот пример показывает возможности перерисовки изображения, что в конечном итоге формирует интересное художественное решение.

Рис. 54: Результат выполнения Листинга 44. Синусоидный орнамент из крупных отрезков.

98

Изменяя толщину линий в строке 6, как показано в коде Листинга 45, можно добиться абсолютно другого художественного результата. Наше приложение начинает плести узор линий, накладывая их друг на друга, дополняя друг друга, а не перерисовывая, как в предыдущем случае.

Листинг 45: Тонкие линии по спирали

1

 

 

2

void setup ()

{

3

size (500 ,

500) ;

4smooth () ;

5 background (120) ;

6strokeWeight (1) ;

7}

8

9 float counter , counter1 , nx , ny ;

10float cx = 250;

11float cy = 250;

12float cRadius = 10;

13

 

 

 

 

 

14

int

switcher

= 1;

 

 

15

 

 

 

 

 

16

 

 

 

 

 

17

void

draw ()

{

 

 

18

 

 

 

 

 

19

if ( switcher > 0) {

 

 

20

 

nx = cos ( counter1 )* cRadius

+

cx ;

21

 

ny = sin ( counter1 )* cRadius

+

cy ;

22stroke (0 , 50) ;

23} else {

24

nx

=

sin ( counter1 )* cRadius

+

cx ;

25

ny

=

cos ( counter1 )* cRadius

+

cy ;

26stroke (250 , 50) ;

27}

28

 

 

29

switcher

*= -1;

30

 

 

31

 

 

32

float x1 = nx - sin ( counter ) *(30) ;

33

float y1

= ny - cos ( counter ) *(30) ;

34

float x2

= nx + sin ( counter ) *(30) ;

35

float y2

= ny + cos ( counter ) *(30) ;

36

 

 

37line (x1 , y1 , x2 , y2 );

38counter += 0.1;

39 if ( counter > 2* PI ) {

40counter = 0;

41}

42

99

43 counter1 += 0.01;

44

45 cRadius += counter /50;

46

47if ( counter1 > 2* PI ) {

48counter1 = 0;

49}

50}

Результат работы кода Листинга 45 показан на Рисунке 55.

Рис. 55: Результат выполнения Листинга 45. Тонкие линии по спирали.

Традиционным примером работы с тригонометрическими функциями считается отрисовка спирали. Вариации на эту тему представлены в коде Листинга 46. Переменная cRadius с каждым вызовом метода draw() меняет свое значение. Это приращение реализовано в строке

100

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]