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

Processing:Примеры/Скачущие шарики

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


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

Контакты:

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


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


Описание[1]

Столкновение нескольких объектов друг с другом и с границами экрана.

Пример

  1. int numBalls = 12;
  2. float spring = 0.05;
  3. float gravity = 0.03;
  4. float friction = -0.9;
  5. Ball[] balls = new Ball[numBalls];
  6.  
  7. void setup() {
  8.   size(640, 360);
  9.   for (int i = 0; i < numBalls; i++) {
  10.     balls[i] = new Ball(random(width), random(height), random(30, 70), i, balls);
  11.   }
  12.   noStroke();
  13.   fill(255, 204);
  14. }
  15.  
  16. void draw() {
  17.   background(0);
  18.   for (Ball ball : balls) {
  19.     ball.collide();
  20.     ball.move();
  21.     ball.display();  
  22.   }
  23. }
  24.  
  25. class Ball {
  26.  
  27.   float x, y;
  28.   float diameter;
  29.   float vx = 0;
  30.   float vy = 0;
  31.   int id;
  32.   Ball[] others;
  33.  
  34.   Ball(float xin, float yin, float din, int idin, Ball[] oin) {
  35.     x = xin;
  36.     y = yin;
  37.     diameter = din;
  38.     id = idin;
  39.     others = oin;
  40.   }
  41.  
  42.   void collide() {
  43.     for (int i = id + 1; i < numBalls; i++) {
  44.       float dx = others[i].x - x;
  45.       float dy = others[i].y - y;
  46.       float distance = sqrt(dx*dx + dy*dy);
  47.       float minDist = others[i].diameter/2 + diameter/2;
  48.       if (distance < minDist) {
  49.         float angle = atan2(dy, dx);
  50.         float targetX = x + cos(angle) * minDist;
  51.         float targetY = y + sin(angle) * minDist;
  52.         float ax = (targetX - others[i].x) * spring;
  53.         float ay = (targetY - others[i].y) * spring;
  54.         vx -= ax;
  55.         vy -= ay;
  56.         others[i].vx += ax;
  57.         others[i].vy += ay;
  58.       }
  59.     }  
  60.   }
  61.  
  62.   void move() {
  63.     vy += gravity;
  64.     x += vx;
  65.     y += vy;
  66.     if (x + diameter/2 > width) {
  67.       x = width - diameter/2;
  68.       vx *= friction;
  69.     }
  70.     else if (x - diameter/2 < 0) {
  71.       x = diameter/2;
  72.       vx *= friction;
  73.     }
  74.     if (y + diameter/2 > height) {
  75.       y = height - diameter/2;
  76.       vy *= friction;
  77.     }
  78.     else if (y - diameter/2 < 0) {
  79.       y = diameter/2;
  80.       vy *= friction;
  81.     }
  82.   }
  83.  
  84.   void display() {
  85.     ellipse(x, y, diameter, diameter);
  86.   }
  87. }

См.также

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

  1. processing.org - Bouncy Bubbles based on code from Keith Peters.