Processing:Примеры/Ускорение при помощи векторов

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Описание[1]

Этот скетч-пример демонстрирует основы движения при помощи векторов. В объекте Mover в виде векторов хранятся данные о позиции, скорости и ускорении. Движение управляется при помощи воздействия на величину ускорения (в данном случае – в сторону курсора мышки).

О том, как симулировать физику и движение тел при помощи векторов, можно также почитать в примере «Силы (гравитация и сопротивление жидкости) с векторами».

Пример

// объект Mover:
Mover mover;

void setup() {
  size(640,360);
  mover = new Mover(); 
}

void draw() {
  background(0);
  
  // обновляем позицию:
  mover.update();
  // показываем объект Mover:
  mover.display(); 
}




/**
 * Ускорение при помощи векторов 
 * Автор – Дэниэл Шиффман.  
 * 
 * Демонстрирует основы движения при помощи векторов.
 * Объект Mover в виде векторов хранит позицию, скорость и ускорение.
 * Управление движением осуществляется при помощи воздействия
   на ускорение (в данном случае – в сторону курсора мышки).
 */


class Mover {

  // объект Mover (шар) отслеживает позицию, скорость и ускорение:
  PVector location;
  PVector velocity;
  PVector acceleration;
  // максимальная скорость объекта Mover:
  float topspeed;

  Mover() {
    // шар начнет движение в центре экрана:
    location = new PVector(width/2,height/2);
    velocity = new PVector(0,0);
    topspeed = 5;
  }

  void update() {
    
    // рассчитываем вектор, 
    // указывающий от позиции шара в сторону курсора мышки:
    PVector mouse = new PVector(mouseX,mouseY);
    PVector acceleration = PVector.sub(mouse,location);
    // задаем длину вектора ускорения:
    acceleration.setMag(0.2);
    
    // скорость меняется при помощи добавления ускорения:
    velocity.add(acceleration);
    // ограничиваем скорость значением «topspeed»:
    velocity.limit(topspeed);
    // меняем позицию в зависимости от скорости:
    location.add(velocity);
  }

  void display() {
    stroke(255);
    strokeWeight(2);
    fill(127);
    ellipse(location.x,location.y,48,48);
  }

}

См.также

Внешние ссылки