xxxxxxxxxx
let num = 100; //円の数
let vecLocation = []; //円の中心の位置ベクトル
let vecVelocity = []; //円の速度ベクトル
let diameter = [];
function setup() {
createCanvas(windowWidth, windowHeight); //画面を生成
frameRate(60); //フレームレート
for (let i = 0; i < num; i++) {
vecLocation[i] = createVector(random(0, width), random(0,height));
vecVelocity[i] = createVector(random(-10, 10), random(-10, 10));
diameter[i] = random(50, 100)
}
console.log("test");
}
function draw() {
background(240, 128, 128, 127); //背景を描画
//background(0);
noStroke(); //枠線なし
//fill(0, 127, 255); //塗りの色
//円の数だけくりかえす
for (let i = 0; i < num; i++) {
vecLocation[i].add(vecVelocity[i]); //円の座標を更新
fill(diameter[i]/100*255, 0, 0);
ellipse(vecLocation[i].x, vecLocation[i].y, diameter[i], diameter[i]); //指定した位置に円を描画
// 相互衝突判定 ==============================================================================
for (let j = i + 1; j < num; j++) { //重複を排除して任意の2組の関係性を判定
let temp_distance = 0;
temp_x_diff = vecLocation[i].x - vecLocation[j].x
temp_y_diff = vecLocation[i].y - vecLocation[j].y
temp_distance = Math.sqrt(Math.pow(vecLocation[i].x - vecLocation[j].x, 2) + Math.pow(vecLocation[i].y - vecLocation[j].y, 2));
//debug
//console.log("i=", i, "j=", j);
//console.log(temp_x_diff);
//console.log(temp_y_diff);
//console.log(temp_distance);
if (temp_distance <= diameter[i]/2+diameter[j]/2) {
//2つの速度の積の計算により速度の方向の一致を扱う
product_x = vecVelocity[i].x * vecVelocity[j].x
product_y = vecVelocity[i].y * vecVelocity[j].y
//速度の方向が異なる場合のみ速度を反転
if (product_x < 0) {
//vecVelocity[i].x = vecVelocity[i].x * -1;
//vecVelocity[j].x = vecVelocity[j].x * -1;
//運動量保存
//console.log("before : v1_x=", vecVelocity[i].x, "v2_x=", vecVelocity[j].x, "total_vel:",Math.abs(vecVelocity[i].x)+Math.abs(vecVelocity[j].x) );
current_vel_x_i =vecVelocity[i].x
current_vel_x_j =vecVelocity[j].x
vecVelocity[i].x = ((diameter[i] - diameter[j])*current_vel_x_i + 2*diameter[j]*current_vel_x_j)/(diameter[i]+ diameter[j]);
vecVelocity[j].x = ((diameter[j] - diameter[i])*current_vel_x_j + 2*diameter[i]*current_vel_x_i)/(diameter[i]+ diameter[j]);
//console.log("after : v1_x=", vecVelocity[i].x, "v2_x=", vecVelocity[j].x, "total_vel:",Math.abs(vecVelocity[i].x)+Math.abs(vecVelocity[j].x));
}
if (product_y < 0) {
//vecVelocity[i].y = vecVelocity[i].y * -1;
//vecVelocity[j].y = vecVelocity[j].y * -1;
//運動量保存
//console.log("before : v1_y=", vecVelocity[i].y, "v2_y=", vecVelocity[j].y, "total_vel:",Math.abs(vecVelocity[i].y)+Math.abs(vecVelocity[j].y));
current_vel_y_i =vecVelocity[i].y
current_vel_y_j =vecVelocity[j].y
vecVelocity[i].y = ((diameter[i] - diameter[j])*current_vel_y_i + 2*diameter[j]*current_vel_y_j)/(diameter[i]+ diameter[j]);
vecVelocity[j].y = ((diameter[j] - diameter[i])*current_vel_y_j + 2*diameter[i]*current_vel_y_i)/(diameter[i]+ diameter[j]);
//console.log("after : v1_y=", vecVelocity[i].y, "v2_y=", vecVelocity[j].y, "total_vel:",Math.abs(vecVelocity[i].y)+Math.abs(vecVelocity[j].y));
}
}
}
// 衝突判定 ==================================================================================
if (vecLocation[i].x < 0 || vecLocation[i].x > width) { //もし画面の左端、または右端に到達したら
vecVelocity[i].x = vecVelocity[i].x * -1; //X方向のスピードを反転
}
if (vecLocation[i].y < 0 || vecLocation[i].y > height) { //もし画面の下端、または上端に到達したら
vecVelocity[i].y = vecVelocity[i].y * -1; //Y方向のスピードを反転
}
vecVelocity[i].x = random(-10, 10)
vecVelocity[i].y = random(-10, 10)
}
}