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

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

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

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;
  }
}   

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