| Система координат. Вращение и перемещение
источник: П.А.Орлов ПРОГРАММИРОВАНИЕ
ДЛЯ ДИЗАЙНЕРОВ
Учебное пособие
Вращение
Функция rotate() вращает систему координат окна. Для нее требуется один параметр - угол (в радианах). Вращение происходит относительно точки (0,0).
- По умолчанию команда rotate осуществляет поворот на указанный угол в радианах. Для преобразования из числа градусов в радианы используется команда radians(z)
- Изменение заключается в изменении направлений координатных осей.
Пример 1. Вращение вокруг заданной точки
int xc, yc; // Вращение вокруг заданной точки int xc, yc;
size(400, 400);
noFill();
xc = width/4; // 100 пикселей
yc = height/4; //100 пикселей
translate(xc, yc);
stroke(255, 0,0);
ellipse(xc, yc, 100, 200);
rotate(PI/4);
stroke(0, 255,0);
ellipse(xc, yc, 100, 200);
итог:

|

|
Пример 2 Перемещение и вращение фигуры произвольной формы вокруг заданной точки почасовой стрелке.
int xc, yc; // Вращение вокруг заданной точки int xc, yc;
float k=0; //для хранения значения угла поворота системы координат
size(300, 300);
noFill();
xc = 80;
yc = 80;
/*функция translate() переместит начало системы координат в точку(80, 80),
относительно первоначальной системы координат*/
translate(xc, yc);
for(int i = 0; i < 4; i += 1) {
stroke(random(255), 0,0);
beginShape();
vertex(0,0); vertex(15,20);
vertex(0,40); vertex(-15,20);
vertex(0,0);
endShape(CLOSE);
k=k+PI/2;
rotate(k);// вращение системы координат
}
Пример 2. Вращение вокруг заданной точки почасовой и против часовой стрелки.
-
Вращение происходит относительно начала системы координат.
-
Если вы передаете отрицательные числа функции rotate(), то вращение будет происходить против часовой стрелки.
size(300,300);
fill(255,0,0);
rect(0,0,40,80);
translate(150,50);
rotate(radians(15));//rotate(PI/12);
fill(0,255,0);
rect(0,0,40,80);
|
 |
size(300,300);
fill(255,0,0);
rect(0,0,40,80);
translate(150,50);
rotate(radians(-60));//rotate(PI/3);
fill(0,255,0);
rect(0,0,40,80);
|
 |
Схема соотношения между градусной и радианной мерой значения угла
Значения 4 углов в радианах используются настолько часто, что в Processing им присвоены имена:
- PI - 180,
- QUARTER_PI - 45,
- НALF_PI - 90,
- TWO_PI - 360.
|
 |
Для того, чтобы запрограммировать вращение некоторой фигуры относительно ее центральной точки:
- сначала используйте функцию translate(), чтобы расположить фигуру там, где вы хотите,
- затем вызовите функцию rotate() и нарисуйте нужную фигуру с центром в точке (0,0):
Трансформации с системой координат суммируются, общая трансформация системы координат может быть представлена как «смещение + вращение + вращение и так далее...».
Пример 3 . В коде проекта представлена логика перемещения и вращения системы координат Processing.
Вариант1 
void setup () {
size (600, 600);
noLoop (); //вызов этой функции означает, что наш холст будет обрисовываться один раз на экране
}
void draw () {
background (100);// закрасит фон окна приложения в серый цвет
smooth (); //установка параметров контура
strokeWeight (40);// установка толщины кисти (контура фигуры или параметров контура)
/* передаем два аргумента, два значения половины ширины и половину высоты окна, функция translate() переместит начало системы координат в эту точку, в нашем примере – в точку(300,300) по первоначальной системе координат*/
translate(width/2, height /2);
/*Все вызовы, связанные с координатами, которые будут сделаны после перемещения системы координат в новую точку, будут пересчитаны Processing в рамках нового положения системы координат*/
//рисуем первую светлую линию
stroke (210);//цвет контура
line (0 ,0 ,150 ,30);
rotate(PI/4);// Вращение системы координат: 180/4 = 45 градусов
/*Трансформации с системой координат суммируются, т.е. в нашем примере к следующей строке общая трансформация системы координат может быть представлена как «смещение + вращение».*/
stroke (175);
line (0 ,0 ,150 ,30);
rotate(PI/4);/*Теперь общая трансформация системы координат представляет собой «смещение + вращение + вращение», и т. д.*/
stroke (140);
line (0 ,0 ,150 ,30);
rotate(PI/4);
stroke (105);
line (0 ,0 ,150 ,30);
rotate(PI/4);
stroke (70);
line (0 ,0 ,150 ,30);
rotate(PI/4);
stroke (35);
line (0 ,0 ,150 ,30);
rotate(PI/4);
stroke (0);
line (0 ,0 ,150 ,30);
}
|
Вариант2 
int z=245;//для хранения текущего значения цвета контура(линии)
float k=0;//для хранения значения угла поворота системы координат
size (600, 600);
background (100);// закрасит фон окна приложения в серый цвет
smooth (); //сглаживаем края контура фигуры
strokeWeight (40);// толщина кисти (контура фигуры)
/* передаем два аргумента, два значения половины ширины и половину высоты окна приложения, функция translate() переместит начало системы координат в эту точку, в нашем примере – в точку(300,300) по первоначальной системе координат*/
translate(width/2, height /2);
for(int i = 0; i < 7; i += 1) {
stroke (z);
line (0 ,0 ,150 ,0);
z=z-35;
k=k+PI/4;
rotate(k);// вращение системы координат
}
|
 |
Задание . Измените код проекта таким образом, чтобы вращение системы координат происходило против часовой стрелки.
| |