| Масштабирование
Еще одним видом трансформации является масштабирование
Функция scale() позволяет масштабировать координаты окна.
Как и rotate(), она работает относительно опорной точки. Следовательно, как и в случае функции rotate(), вам нужно сместить координаты окна с помощью функции translate(), масштабировать координаты, а затем нарисовать нужную фигуру с центром в точке (0,0).
Пример 1
scale (s)
Если:
- s = 1, масштаб не меняется,
- s <1 - объекты уменьшаются,
- s> 1 - объекты увеличиваются.
scale (x, y) позволяет выполнять масштабирование отдельно по ширине и высоте
Изменение по существу заключается в изменении размеров пикселей на плоскости проекта
size(500,350);
background(255);
fill(255,0,0);
rect(50,50,80,80);
translate (100,80);
fill(0,255,0);
rect(50,50,80,80);
|
size(500,350);
background(255);
fill(255,0,0);
rect(50,50,80,80);
translate (100,80);
fill(0,255,0);
scale (2);
rect(50,50,80,80);
|
|
Пример 2 Рисуем три линии в разном масштабе системы координат.
void setup () {
size (600, 600);
noLoop ();
}
void draw () {background (100);
smooth ();
strokeWeight (50);
stroke (200);
|
Результат выполнения :
|
/* переместили центр системы координат в центр окна приложения*/
translate(width/2, height /2 - 100);
line ( -100 ,0 ,100 ,0);// рисуем линию
/* еще раз переместили систему координат вниз на 100 пикселей*/
translate (0, 100);
/* Прежде чем рисовать очередную линию, выполняем масштабирование системы координат - как бы увеличиваем ее в 1.5 раза, ввиду чего линия, нарисованная ниже стала толще и больше, чем первая.*/
scale (1.5, 1.5);//Выполняем масштабирование системы координат
line ( -100 ,0 ,100 ,0);//Линия стала толще и больше в сравнении с первой
//Еще раз перемещаем систему координат вниз на 100 писелей
translate (0, 100);
scale (1.5, 1.5);//Выполняем масштабирование системы координат
line ( -100 ,0 ,100 ,0);
}
|
Операции трансформации в этом примере в итоге можно представить как «смещение + смещение + масштабирование + смещение +масштабирование», поэтому третья линия (отрезок) рисуется ниже, толще и больше, чем предыдущее
При необходимости возвращения к предыдущему состоянию можно сделать обратные действия.
Задание . Измените код примера 2 таким образом, чтобы третий отрезок выполнялся выше первого, но с его же степенью масштабирования.
Пример 3.
float z = 0.0;//для хранения текущих значений аргумента функции sin ( scale(sin(z) + 2))
void setup() {
size(300, 300);
smooth();//сглаженные края фигуры
}
void draw() {
frameRate(3);
/*очередное смещение системы координат задается положением указателя мышки*/
translate(mouseX, mouseY);
/*синхронное изменение значение величины масштабирования от кадра к кадру*/
scale(sin(z) + 2);
fill(random(255),random(255),random(255));
rect(-15, -15, 30, 30);
z += 0.1;
}
|
|
Пример 4. Шкала Дениса Груце.
Параметрами для функции scale () являются значения, указанные в десятичных процентах. Например, масштаб вызова метода (2.0) увеличит размер фигуры на 200 процентов. Объекты всегда масштабируются от начала координат.
void draw() {
background(102);
a = a + 0.04;
s = cos(a)*2;
translate(width/2, height/2);
scale(s);
fill(51);
rect(0, 0, 50, 50);
translate(75, 0);
fill(255);
scale(s);
rect(0, 0, 50, 50);
}
|
float a = 0.0;
float s = 0.0;
void setup() {
size(640, 360);
noStroke(); rectMode(CENTER);
frameRate(30);
}
|
Состояние системы координат
Итак, задачу запоминания текущего состояния системы координат в Processing решает метод pushMatrix(). Он сохраняет текущие трансформации. После того как сохранены нужные трансформации, можно совершать новые, а когда потребуется, вернуть сохраненные трансформации с помощью метода popMatrix().
Пример 5. Сохранения трансформаций системы координат
void setup () {
size (600, 600);noLoop ();
}
void draw () {
background (20);
smooth ();
noStroke ();
/* сохраняем текущее состояние системы координат с помощью
вызова функции pushMatrix() */
pushMatrix ();
translate (100, 0); //сдвигаем начало координат в точку (х=100, у=0)
rotate(PI/4); // поворот осей системы координат по часовой стрелке на 45 градусов
fill(180);
rect (0,50, 150, 50); rect (50,0, 50, 150);
popMatrix (); //возвращаем систему координат в исходное состояние
pushMatrix ();
translate (220, 110);
rotate(PI/6);// поворот осей системы координат по часовой стрелке на 30 градусов
scale (2);
fill(220);
rect (0,50, 150, 50); rect (50,0, 50, 150);
popMatrix ();
pushMatrix ();
translate (520, 350);
rotate(PI/3);// поворот осей системы координат по часовой стрелке на 60 градусов
scale (1.4);
fill(80);
rect (0,50, 150, 50); rect (50,0, 50, 150);
popMatrix ();
}
|
|
Итог:
|
Задание . Измените код примера 5 таким образом, чтобы крестики вращались на PI/4 по отношению друг к другу.
Вывод: Система координат Processing подвижна, вы можете вращать и масштабировать ее со всеми объектами.
| |