Za ovu implementaciju, smo postavili prostor u kojem ćemo simulirati sudare. Taj prostor je pravokutnog oblika te je okružen zidom. Unutar tog prostora se nalaze dvije kugle sa svojim koordinatama (položajem), masom i brzinom.
double P1[3] = {0.0, 2.0, 0.0};
double P2[3] = {4.0, 0.0, 0.0};
double V1[3] = {0.3, 0.3, 0.0};
double V2[3] = {-0.5, 0.5, 0.0};
double m1 = 1.0;
double m2 = 1.5;
Sada nam je cilj kretanje kugli, ispitivanje sudara te reakcija na sam sudar. Kretanje kugli se odvija u sljedećoj funkciji.
void kretanje(){
//povećanje za kuglu 1
P1[0] += V1[0];
P1[1] += V1[1];
//povećanje za kuglu 2
P2[0] += V2[0];
P2[1] += V2[1];
Uz to kako bi samo kretanje bilo što realnije, stavili smo da se brzine samih kugla smanjuje tbog trenja, tako da je pomnožimo s 0.99. Zato jer broj množimo sa 0.99, loptica se nikada neće prestati kretati. Pa na ovo primjeru , prvo provjeravamo da li je brzina kugle po pojedinoj komponenti (x,y) negdje u rasponu -0.08 i 0.08. Ako je tada je odmah postavljamo na nulu.
if(V1[0] < 0.08 && V1[0] > -0.08){
V1[0] = 0.0;
}else{
V1[0] *= 0.99;
}
Sada kada smo rješili kretanje kugli, moramo provjeriti da li se one sudaraju. Prvo provjeravamo da li se lopta sudarila sa zidom. To radimo tako da položaju kugle (središtu) dodamo njezin radius i provjeravamo da li dotiče zid. Primjerice, ako prva kugla po svojoj X koordinati + radius, dotiče zid koji se nalazi na pozitivnoj strani X osi tada se za prvu kuglu njezina x komponenta brzine množi sa minus jedan (-1) kako bi se po toj komponenti nastavila kretati u suprotnom smjeru. Dok se y komponenta ne mijenja. Po tom principu se ponavlja postupak za svaku kuglu i svaki zid.
void provjeraSudara(){
if( (P1[0] + r) >= (sizeX / 2)){
//printf("KUGLA 1 - Sudar u zid na pozitivnoj X\n");
V1[0] *= -1;
}
Nakon toga slijedi provjera sudara između dvije kugle. Kao što smo već objasnili, za sudar između dvije kugle provjeravamo da li je njihova udaljenost manja ili jednaka zbroju njihovih radiusa. Nakon toga se po formuli za dobivanje novih brzina pojedine kugle, računaju njihove nove brzine kojom se nastavljaju kretati sve do sljedećeg sudara.
if((pow( (P2[0] - P1[0]), 2) + pow( (P2[1] - P1[1]), 2)) < pow(2*r, 2)){
//računanje novih brzina kugli
V1temp[0] = (((m1 - m2) * V1[0]) / (m1 + m2)) + ((2 * m2 * V2[0]) / (m1 + m2));
V1temp[1] = (((m1 - m2) * V1[1]) / (m1 + m2)) + ((2 * m2 * V2[1]) / (m1 + m2));
V1temp[2] = (((m1 - m2) * V1[2]) / (m1 + m2)) + ((2 * m2 * V2[2]) / (m1 + m2));
V2[0] = (((m2 - m1) * V2[0]) / (m1 + m2)) + ((2 * m1 * V1[0]) / (m1 + m2));
V2[1] = (((m2 - m1) * V2[1]) / (m1 + m2)) + ((2 * m1 * V1[1]) / (m1 + m2));
V2[2] = (((m2 - m1) * V2[2]) / (m1 + m2)) + ((2 * m1 * V1[2]) / (m1 + m2));
//originalni V1 treba koristit za V2, pa moramo koristiti pomocnu varijablu
V1[0] = V1temp[0];
V1[1] = V1temp[1];
V1[2] = V1temp[2];
}
Iako se ova provjera radi na temelju Pitagorinog poučka, ne koristimo operaciju SQRT jer je ona podosta zahtjevna, posebice ako bi se radilo o više kugli. Ako imamo dva broja X i Y, te X > Y tada mora biti i X na kvadrat > Y na kvadrat. U ovom slučaju udaljenost kugli je kao X na kvadrat, a zbroj radijusa je Y, te sada umjesto da vadimo korijen iz X na kvadrat, brže je samo kvadrirati zbroj radijusa Y. Na kraju uspoređujemo X na kvadrat < Y na kvadrat umjesto X < Y