Масштабирование
Еще одним видом трансформации является масштабирование
Функция scale() позволяет масштабировать координаты окна.
Как и rotate(), она работает относительно опорной точки. Следовательно, как и в случае функции rotate(), вам нужно сместить координаты окна с помощью функции translate(), масштабировать координаты, а затем нарисовать нужную фигуру с центром в точке (0,0).
Пример 1
scale (s)
Если:
- s = 1, масштаб не меняется,
- s <1 - объекты уменьшаются,
- s> 1 - объекты увеличиваются.
scale (x, y) позволяет выполнять масштабирование отдельно по ширине и высоте
Изменение по существу заключается в изменении размеров пикселей на плоскости проекта
size(500,350); |
size(500,350); |
Пример 2 Рисуем три линии в разном масштабе системы координат.
void setup () { void draw () {background (100); |
Результат выполнения :
|
/* переместили центр системы координат в центр окна приложения*/ /* еще раз переместили систему координат вниз на 100 пикселей*/ /* Прежде чем рисовать очередную линию, выполняем масштабирование системы координат - как бы увеличиваем ее в 1.5 раза, ввиду чего линия, нарисованная ниже стала толще и больше, чем первая.*/ scale (1.5, 1.5);//Выполняем масштабирование системы координат //Еще раз перемещаем систему координат вниз на 100 писелей translate (0, 100); |
Операции трансформации в этом примере в итоге можно представить как «смещение + смещение + масштабирование + смещение +масштабирование», поэтому третья линия (отрезок) рисуется ниже, толще и больше, чем предыдущее
При необходимости возвращения к предыдущему состоянию можно сделать обратные действия.
Задание . Измените код примера 2 таким образом, чтобы третий отрезок выполнялся выше первого, но с его же степенью масштабирования.
Пример 3.
float z = 0.0;//для хранения текущих значений аргумента функции sin ( scale(sin(z) + 2)) /*очередное смещение системы координат задается положением указателя мышки*/ /*синхронное изменение значение величины масштабирования от кадра к кадру*/ |
Пример 4. Шкала Дениса Груце.
Параметрами для функции scale () являются значения, указанные в десятичных процентах. Например, масштаб вызова метода (2.0) увеличит размер фигуры на 200 процентов. Объекты всегда масштабируются от начала координат.
void draw() { translate(width/2, height/2); translate(75, 0); |
float a = 0.0; |
Состояние системы координат
Итак, задачу запоминания текущего состояния системы координат в Processing решает метод pushMatrix(). Он сохраняет текущие трансформации. После того как сохранены нужные трансформации, можно совершать новые, а когда потребуется, вернуть сохраненные трансформации с помощью метода popMatrix().
Пример 5. Сохранения трансформаций системы координат
void setup () { void draw () { /* сохраняем текущее состояние системы координат с помощью pushMatrix (); pushMatrix (); } |
|
Итог:
|
Задание . Измените код примера 5 таким образом, чтобы крестики вращались на PI/4 по отношению друг к другу.
Вывод: Система координат Processing подвижна, вы можете вращать и масштабировать ее со всеми объектами.