Понедельник, 11.11.2024, 20:07
Главная | Регистрация | Вход Приветствую Вас Гость | RSS


Меню сайта


Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0


Тестування онлайн
тестування онлайн 


Социальные закладк

Масштабирование

Еще одним видом трансформации является масштабирование    

Функция 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 подвижна, вы можете вращать и масштабировать ее со всеми объектами.

 

Форма входа
Поиск
Календарь
«  Ноябрь 2024  »
ПнВтСрЧтПтСбВс
    123
45678910
11121314151617
18192021222324
252627282930
Архив записей
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz

  • Рейтинг@Mail.ru
    Copyright MyCorp © 2024
    Конструктор сайтов - uCoz