Book2v1
.pdfИтак, у нас есть точка n, которую мы принимаем за центр новой окружности с радиусом 200. По этой окружности мы рассчитываем координаты двух точек x1 и y1 и x2 и y2, которые используем для отрисовки отрезка в строке 25. Получается, что мы отрисовываем отрезок, концы которого вращаются вокруг точки, которая в свою очередь вращается вокруг центра с координатами cx и cy. В результате мы получаем изображение, представленное на Рисунке 49.
Рис. 49: Результат выполнения Листинга 41. Геометрический цветок.
Вынесем логику отрисовки линий в отдельный метод oneLineDraw(), как показано в Листинге 42. И добавим еще и изменение радиуса первой окружности, по которой вращается воображаемая точка n. Для изменения радиуса введем свойство (переменную) cRadius, которая будет зависеть от counter (см. строку 42).
91
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