| Вращение и перемещение нескольких объектов
источники: Оксана Пасічник Креативне програмування у Processing
Кейси Риз и Бен Фрай Учимся программировать вместе с Processing Учебное пособие
Обратите внимание!!!
Чтобы смещение одной группы фигур не влияло на позицию других фигур, нарисованных следом за ними, примените функции pushMatrix() и popMatrix():
• при запуске функции pushMatrix() происходит сохранение текущей координаты системы,
• функция popMatrix() восстанавливает сохраненную координату.
Пример 1. Вращение нескольких объектов
Шаг 1
void setup() {
size(400, 400);
background(255);
noStroke();//фигуры не будут иметь внешней границы
fill(0);
/*интерпретирует первые два параметра rect() как центральную
точку прямоугольника, а третий и четвертый – как его ширину и высоту.*/
rectMode(CENTER);
}
void draw() {
background(255);
translate(100, 100);//сдвигает координаты системы
rect(0, 0, 80, 80);
translate(300, 100);
rect(0, 0, 80, 80);
}
|
|
|
Шаг 2
.....
void draw() {
background(255);
pushMatrix(); //происходит сохранение текущей координаты системы
translate(100, 100); rect(0, 0, 80, 80);
popMatrix();//восстанавливает сохраненную координату
pushMatrix();
translate(300, 100); rect(0, 0, 80, 80);
popMatrix();
}
|
|
|
Шаг 3
...
void draw() {
background(255);
pushMatrix(); translate(100, 100);
rect(0, 0, 80, 80);
popMatrix();
pushMatrix(); translate(300, 100);
rect(0, 0, 80, 80);
popMatrix();
pushMatrix(); translate(100, 300);
rect(0, 0, 80, 80);
popMatrix();
pushMatrix(); translate(300, 300);
rect(0, 0, 80, 80);
popMatrix();
}
|
|
Шаг 4.
float r = 0;//для хранения значения угла вращения
....
void draw() {
background(255);
pushMatrix(); translate(100, 100);
rotate(r); rect(0, 0, 80, 80);
popMatrix();
pushMatrix(); translate(300, 100);
rotate(r*0.5); rect(0, 0, 80, 80);
popMatrix();
pushMatrix(); translate(100, 300);
rotate(r*2); rect(0, 0, 80, 80);
popMatrix();
pushMatrix(); translate(300, 300);
rotate(r*4); rect(0, 0, 80, 80);
popMatrix();
r = r + 0.02;
}
|
|
Пример 2 Вращение квадратов
floa r=0;//для хранения значения угла вращения
void setup() {
size(512,512);
frameRate(10);
}
void draw(){
background(255);
translate(width*0.5, height*0.5); //перемещает рисование в центр экрана
noFill();//выключить заливку
r =r + 0.01;
for (int i=0; i<20; i++) {
rotate(r);
rect(i,i,i*5,i*5); // рисования 20 квадратов с каждый раз возрастающей стороной в координатах i, i
println("r = ",r, " i = ",i);
}
}
|
|
Пример 3. Круги разных радиусов
float r = 0;
void setup() {
size(500,500);
background(10);
}
void draw() {
translate(width/2, height/2); // перемещения рисования в центр полотна
fill(255);
rotate(r); //поворот на r радиан
float z = random(5, 15); // случайный выбор радиуса окружности
ellipse(100 + r, 10, z, z); //круг в координатах 100+r, 10 (отступ постоянно увеличивается вместе с r)
r = r + 0.2; // увеличение угла поворота
}
|
|
Пример 4. Перемещение и вращение
В зависимости от того, в каком порядке вы записываете функции translate() и rotate(), результат будет различным. Следующий пример отличается от предыдущих примеров тем, что функции translate() и rotate() записаны в обратном порядке. Здесь фигура вращается относительно левого верхнего угла окна, а функция translate() задает расстояние от угла до фигуры:
float r = 0.0;
void setup() {
size(300,300);
smooth();
}
void draw() {
rotate(r);
fill(random(255),random(255),random(255));
translate(mouseX, mouseY);
rect(-5, -5, 40, 40);
r += 0.1;
}
|
|
| |