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

Processing:Примеры/Пружина

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


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

Контакты:

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


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


Описание[1]

Нажмите на серый прямоугольник («шапку» пружины), потяните его вниз/вверх и отпустите. В результате графические объекты на экране начнут вести себя как пружина.

Пример

  1. // константы для отрисовки «шапки» пружины:
  2. int springHeight = 32;  // высота
  3. int left;               // левый край
  4. int right;              // правый край
  5. int max = 200;          // максимальное значение по оси Y
  6. int min = 100;          // минимальное значение по оси Y
  7. boolean over = false;   // курсор над «шапкой»?
  8. boolean move = false;   // курсор над «шапкой» и нажата кнопка мыши?
  9.  
  10. // константы для симуляции пружины:
  11. float M = 0.8;   // масса
  12. float K = 0.2;   // константа пружины
  13. float D = 0.92;  // коэффициент затухания
  14. float R = 150;   // положение покоя
  15.  
  16. // переменные для симуляции пружины:
  17. float ps = R;    // позиция
  18. float vs = 0.0;  // скорость
  19. float as = 0;    // ускорение
  20. float f = 0;     // сила
  21.  
  22.  
  23. void setup() {
  24.   size(640, 360);
  25.   rectMode(CORNERS);
  26.   noStroke();
  27.   left = width/2 - 100;
  28.   right = width/2 + 100;
  29. }
  30.  
  31. void draw() {
  32.   background(102);
  33.   updateSpring();
  34.   drawSpring();
  35. }
  36.  
  37. void drawSpring() {
  38.  
  39.   // рисуем базовый элемент:
  40.   fill(0.2);
  41.   float baseWidth = 0.5 * ps + -8;
  42.   rect(width/2 - baseWidth, ps + springHeight, width/2 + baseWidth, height);
  43.  
  44.   // задаем цвет и рисуем «шапку»:
  45.   if(over || move) {
  46.     fill(255);
  47.   } else {
  48.     fill(204);
  49.   }
  50.   rect(left, ps, right, ps + springHeight);
  51. }
  52.  
  53.  
  54. void updateSpring() {
  55.   // обновляем позицию пружины:
  56.   if(!move) {
  57.     f = -K * (ps - R);    // f=-ky
  58.     as = f / M;           // задаем ускорение, f=ma == a=f/m
  59.     vs = D * (vs + as);   // задаем скорость
  60.     ps = ps + vs;         // обновляем позицию
  61.   }
  62.   if(abs(vs) < 0.1) {
  63.     vs = 0.0;
  64.   }
  65.  
  66.   // проверяем, находится ли курсор над «шапкой» пружины:
  67.   if(mouseX > left && mouseX < right && mouseY > ps && mouseY < ps + springHeight) {
  68.     over = true;
  69.   } else {
  70.     over = false;
  71.   }
  72.  
  73.   // задаем позицию «шапки»
  74.   // и ограничиваем диапазон значений для ее позиции:
  75.   if(move) {
  76.     ps = mouseY - springHeight/2;
  77.     ps = constrain(ps, min, max);
  78.   }
  79. }
  80.  
  81. void mousePressed() {
  82.   if(over) {
  83.     move = true;
  84.   }
  85. }
  86.  
  87. void mouseReleased() {
  88.   move = false;
  89. }

См.также

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

  1. processing.org - Spring