Processing:Примеры/Эллипсы-пружины: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
 
Нет описания правки
 
(не показаны 2 промежуточные версии 2 участников)
Строка 1: Строка 1:
{{Processing панель перехода}}
{{Processing панель перехода}}
{{Перевод от Сubewriter}}
{{Перевод от Сubewriter}}
{{Myagkij-редактор}}
{{Myagkij-редактор}}
{{Черновик}}


=Описание<ref>[https://processing.org/examples/springs.html processing.org - Springs]</ref>=
=Описание<ref>[https://processing.org/examples/springs.html processing.org - Springs]</ref>=
Строка 159: Строка 156:
}}
}}


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
int num = 3;  
int num = 3;  
Spring[] springs = new Spring[num];  
Spring[] springs = new Spring[num];  
Строка 312: Строка 309:
<references />
<references />


{{SEO
{{Навигационная таблица/Портал/Processing}}
|Заголовок статьи=Processing: Эллипсы-пружины / Онлайн справочник - wikihandbk.com
|Ключевые слова=processing,Эллипсы-пружины в processing, пример Эллипсы-пружины, пример Эллипсы-пружины в ArrayList в processing
|Описание статьи=
|Изображение статьи для Open Graph=
|Адрес страницы для schemaNewsArticle=<nowiki>http://wikihandbk.com/wiki/Processing:Примеры/Эллипсы-пружины</nowiki>
|Изображение статьи для schemaNewsArticle=<nowiki></nowiki>
|Высота изображения статьи для schemaNewsArticle=
|Ширина изображения статьи для schemaNewsArticle=
|Дата публикации для schemaNewsArticle=2018-08-03
|Автор=Мякишев Е.А.
|Издатель=myagkij
|Логотип издателя для schemaNewsArticle=<nowiki>http://wikihandbk.com/ruwiki/images/6/61/Tech_geek_logo_1x.jpg</nowiki>
|Ширина логотипа издателя для schemaNewsArticle=60
|Высота логотипа издателя для schemaNewsArticle=45
}}
{{Навигационная таблица/Справочник языка Processing}}
{{Навигационная таблица/Processing/Примеры}}

Текущая версия от 07:59, 27 августа 2023

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


Описание[1]

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

Пример

int num = 3; 
Spring[] springs = new Spring[num]; 

void setup() {
  size(640, 360);
  noStroke(); 
  springs[0] = new Spring(240, 260, 40, 0.98, 8.0, 0.1, springs, 0); 
  springs[1] = new Spring(320, 210, 120, 0.95, 9.0, 0.1, springs, 1); 
  springs[2] = new Spring(180, 170, 200, 0.90, 9.9, 0.1, springs, 2);
}

void draw() {
  background(51); 

  for (Spring spring : springs) { 
    spring.update(); 
    spring.display();
  }
}

void mousePressed() {
  for (Spring spring : springs) { 
    spring.pressed();
  }
}

void mouseReleased() {
  for (Spring spring : springs) { 
    spring.released();
  }
}

class Spring { 
  // значения экрана: 
  float xpos, ypos;
  float tempxpos, tempypos; 
  int size = 20; 
  boolean over = false; 
  boolean move = false; 

  // константы для симуляции пружины:
  float mass;       // масса 
  float k = 0.2;    // константа пружины 
  float damp;       // затухание
  float rest_posx;  // позиция покоя X 
  float rest_posy;  // позиция покоя Y 

  // переменные симуляции пружины:
  //float pos = 20.0; // позиция 
  float velx = 0.0;   // скорость по оси X
  float vely = 0.0;   // скорость по оси Y 
  float accel = 0;    // ускорение 
  float force = 0;    // сила 

  Spring[] friends;
  int me;

  // конструктор:
  Spring(float x, float y, int s, float d, float m, 
  float k_in, Spring[] others, int id) { 
    xpos = tempxpos = x; 
    ypos = tempypos = y;
    rest_posx = x;
    rest_posy = y;
    size = s;
    damp = d; 
    mass = m; 
    k = k_in;
    friends = others;
    me = id;
  } 

  void update() { 
    if (move) { 
      rest_posy = mouseY; 
      rest_posx = mouseX;
    } 

    force = -k * (tempypos - rest_posy);  // f=-ky 
    accel = force / mass;                 // задаем ускорение,
                                          // f=ma == a=f/m 
    vely = damp * (vely + accel);         // задаем скорость 
    tempypos = tempypos + vely;           // обновляем позицию 

    force = -k * (tempxpos - rest_posx);  // f=-ky 
    accel = force / mass;                 // задаем ускорение,
                                          // f=ma == a=f/m 
    velx = damp * (velx + accel);         // задаем скорость 
    tempxpos = tempxpos + velx;           // обновляем позицию 


    if ((overEvent() || move) && !otherOver() ) { 
      over = true;
    } else { 
      over = false;
    }
  } 

  // проверяем, находится ли курсор над этим эллипсом:
  boolean overEvent() {
    float disX = tempxpos - mouseX;
    float disY = tempypos - mouseY;
    if (sqrt(sq(disX) + sq(disY)) < size/2 ) {
      return true;
    } else {
      return false;
    }
  }

  // делаем так, чтобы не был активен никакой другой эллипс:
  boolean otherOver() {
    for (int i=0; i<num; i++) {
      if (i != me) {
        if (friends[i].over == true) {
          return true;
        }
      }
    }
    return false;
  }

  void display() { 
    if (over) { 
      fill(153);
    } else { 
      fill(255);
    } 
    ellipse(tempxpos, tempypos, size, size);
  } 

  void pressed() { 
    if (over) { 
      move = true;
    } else { 
      move = false;
    }
  } 

  void released() { 
    move = false; 
    rest_posx = xpos;
    rest_posy = ypos;
  }
}

См.также

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