簡單實現相同小球的相互簡單撞擊(對側擊進行簡化),並實現邊界限制,恆定阻力。
int index=0,jndex=0;
int collision;
float [] pointx={256,512,768,1024,1280,256,512,768};
float [] pointy={456,345,18,1280-480,1024-480,768-480,512-480,256,1280-480};
PVector [] v={new PVector (100,100),new PVector (110,-110),new PVector (-120,-120),new PVector (-140,130),new PVector (140,0),new PVector (0,150),new PVector (-160,0),new PVector (0,-170)};
float t=0.09;
void setup(){
size(1280,800);
stroke(2);
smooth();
}
void draw(){
background(500);
//fill(520);
fill(#FFFFE0);
for(index=0;index<8;index++)
ellipse(pointx[index],pointy[index],20.0,20.0);
//noStroke();
for(index=0;index<8;index++)
{
v[index].x*=0.999;
v[index].y*=0.999;
}
noStroke();
for(index=0;index<8;index++)
{
if(pointx[index]<=20||pointx[index]>=1280) {v[index].x=-v[index].x; if(pointx[index]<=20) pointx[index]=30; else pointx[index]=1270; }
if(pointy[index]<=20||pointy[index]>=800) {v[index].y=-v[index].y; if(pointy[index]<=20) pointy[index]=30 ; else pointy[index]=790;}
}
for(index=0;index<8;index++)
{
pointx[index]+=v[index].x*t;
pointy[index]+=v[index].y*t;
}
for(index=0;index<8;index++)
{
for(jndex=index+1;jndex<8;jndex++)
{
float dist=sqrt((pointx[index]-pointx[jndex])*(pointx[index]-pointx[jndex])+(pointy[index]-pointy[jndex])*(pointy[index]-pointy[jndex]));
if (dist<30.0)
{ fill(#FF0000);
ellipse(pointx[index],pointy[index],10,10);
ellipse(pointx[jndex],pointy[jndex],10,10);
PVector temp=new PVector(1,1);
temp=v[index];
v[index]=v[jndex];
v[jndex]=temp;
collision++;
}
text("c o l l i s i o n : "+collision,20,20);
}
}
}
草稿版,大概看出寫的過程與相關的debug,以實現情況的轉化。
反省:沒有將小球對象化,不能脫離c的束縛。