50608


<https://processing.org/examples/bouncybubbles.html>

上記コードについて質問です。  
Ball のクラスのcollide で  
衝突の処理を行っています。  
自分から見て周りのボールと衝突するかどうかの判定からまず行っています。

質問は二つあります。  
一つ目はothers にどのようにボールの情報が格納されていますか？  
二つ目は

[code]

    void collide() {
    for (int i = id + 1; i < numBalls; i++) {
      float dx = others[i].x - x;
      float dy = others[i].y - y;
      float distance = sqrt(dx*dx + dy*dy);
      float minDist = others[i].diameter/2 + diameter/2;
      if (distance < minDist) { 
        float angle = atan2(dy, dx);
        float targetX = x + cos(angle) * minDist;
        float targetY = y + sin(angle) * minDist;
        float ax = (targetX - others[i].x) * spring;
        float ay = (targetY - others[i].y) * spring;
        vx -= ax;
        vy -= ay;
        others[i].vx += ax;
        others[i].vy += ay;
      }
    }   
    
[/code]

において、衝突の判定は、自分より番号が後のものとしかしていないように思えます。  
自分より番号が前のものとも衝突する可能性は十分あると思うのですが、  
私は何か重要な勘違いをしているのでしょうか？


CC BY-SA 4.0
2018-11-25T09:50:53.620
50607
2018-11-25T10:04:05.107
5363
question
processing
衝突するボールについて


### 1つ目の質問

> others にどのようにボールの情報が格納されていますか？

`Ball` クラスのコンストラクタは以下のようになっており、引数で指定された配列がそのまま `others` に代入されています。

[code]

    Ball(float xin, float yin, float din, int idin, Ball[] oin) {
      x = xin;
      y = yin;
      diameter = din;
      id = idin;
      others = oin;
    }
    
[/code]

そして `setup()` 部分において以下のように書かれているので、`others` にはあらかじめ用意されていた `balls`
配列が入ることになります。

[code]

    balls[i] = new Ball(random(width), random(height), random(30, 70), i, balls);
    
[/code]

### 2つ目の質問

> 衝突の判定は、自分より番号が後のものとしかしていないように思えます

確かに衝突判定は自分より後の番号のものとしかしていませんが、衝突判定時に自分と相手の速度を両方変えているのでこれで問題ありません。重複しないボール2つの組み合わせで見ると、これで全部の組み合わせを網羅していることになります。

たとえばボール 3 つのときに `draw()` 関数を 1 回実行したらどのような判定が行われることになるのか具体的に書き下してみてください。


CC BY-SA 4.0
2018-11-25T10:04:05.107
50608
2018-11-25T10:04:05.107
19110
50607
answer