Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Processing:Примеры/Эллипсы-пружины

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


Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


Ambox content.png Черновик


Описание[1]

Зажмите кнопкой мыши на каком-либо эллипсе, потяните его в сторону и отпустите. Когда вы отпустите мышку, эллипс начнет быстро двигаться к своей исходной позиции. Каждый эллипс ведет себя немного по-разному.

Пример

  1. int num = 3;
  2. Spring[] springs = new Spring[num];
  3.  
  4. void setup() {
  5.   size(640, 360);
  6.   noStroke();
  7.   springs[0] = new Spring(240, 260, 40, 0.98, 8.0, 0.1, springs, 0);
  8.   springs[1] = new Spring(320, 210, 120, 0.95, 9.0, 0.1, springs, 1);
  9.   springs[2] = new Spring(180, 170, 200, 0.90, 9.9, 0.1, springs, 2);
  10. }
  11.  
  12. void draw() {
  13.   background(51);
  14.  
  15.   for (Spring spring : springs) {
  16.     spring.update();
  17.     spring.display();
  18.   }
  19. }
  20.  
  21. void mousePressed() {
  22.   for (Spring spring : springs) {
  23.     spring.pressed();
  24.   }
  25. }
  26.  
  27. void mouseReleased() {
  28.   for (Spring spring : springs) {
  29.     spring.released();
  30.   }
  31. }
  32.  
  33. class Spring {
  34.   // значения экрана:
  35.   float xpos, ypos;
  36.   float tempxpos, tempypos;
  37.   int size = 20;
  38.   boolean over = false;
  39.   boolean move = false;
  40.  
  41.   // константы для симуляции пружины:
  42.   float mass;       // масса
  43.   float k = 0.2;    // константа пружины
  44.   float damp;       // затухание
  45.   float rest_posx;  // позиция покоя X
  46.   float rest_posy;  // позиция покоя Y
  47.  
  48.   // переменные симуляции пружины:
  49.   //float pos = 20.0; // позиция
  50.   float velx = 0.0;   // скорость по оси X
  51.   float vely = 0.0;   // скорость по оси Y
  52.   float accel = 0;    // ускорение
  53.   float force = 0;    // сила
  54.  
  55.   Spring[] friends;
  56.   int me;
  57.  
  58.   // конструктор:
  59.   Spring(float x, float y, int s, float d, float m,
  60.   float k_in, Spring[] others, int id) {
  61.     xpos = tempxpos = x;
  62.     ypos = tempypos = y;
  63.     rest_posx = x;
  64.     rest_posy = y;
  65.     size = s;
  66.     damp = d;
  67.     mass = m;
  68.     k = k_in;
  69.     friends = others;
  70.     me = id;
  71.   }
  72.  
  73.   void update() {
  74.     if (move) {
  75.       rest_posy = mouseY;
  76.       rest_posx = mouseX;
  77.     }
  78.  
  79.     force = -k * (tempypos - rest_posy);  // f=-ky
  80.     accel = force / mass;                 // задаем ускорение,
  81.                                           // f=ma == a=f/m
  82.     vely = damp * (vely + accel);         // задаем скорость
  83.     tempypos = tempypos + vely;           // обновляем позицию
  84.  
  85.     force = -k * (tempxpos - rest_posx);  // f=-ky
  86.     accel = force / mass;                 // задаем ускорение,
  87.                                           // f=ma == a=f/m
  88.     velx = damp * (velx + accel);         // задаем скорость
  89.     tempxpos = tempxpos + velx;           // обновляем позицию
  90.  
  91.  
  92.     if ((overEvent() || move) && !otherOver() ) {
  93.       over = true;
  94.     } else {
  95.       over = false;
  96.     }
  97.   }
  98.  
  99.   // проверяем, находится ли курсор над этим эллипсом:
  100.   boolean overEvent() {
  101.     float disX = tempxpos - mouseX;
  102.     float disY = tempypos - mouseY;
  103.     if (sqrt(sq(disX) + sq(disY)) < size/2 ) {
  104.       return true;
  105.     } else {
  106.       return false;
  107.     }
  108.   }
  109.  
  110.   // делаем так, чтобы не был активен никакой другой эллипс:
  111.   boolean otherOver() {
  112.     for (int i=0; i<num; i++) {
  113.       if (i != me) {
  114.         if (friends[i].over == true) {
  115.           return true;
  116.         }
  117.       }
  118.     }
  119.     return false;
  120.   }
  121.  
  122.   void display() {
  123.     if (over) {
  124.       fill(153);
  125.     } else {
  126.       fill(255);
  127.     }
  128.     ellipse(tempxpos, tempypos, size, size);
  129.   }
  130.  
  131.   void pressed() {
  132.     if (over) {
  133.       move = true;
  134.     } else {
  135.       move = false;
  136.     }
  137.   }
  138.  
  139.   void released() {
  140.     move = false;
  141.     rest_posx = xpos;
  142.     rest_posy = ypos;
  143.   }
  144. }

См.также

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

  1. processing.org - Springs