Probuje napisac grę w kręgle i od dluzszego czasu utknalem w jednym miejscu. Nie moge zrobic zderzenia ukosnego doskonale sprezystego kulek. Oto jeden z moich pomyslow w ktorym kulki raz odbijaja sie prawidlowo a innym razem nie, czasami zas znikaja.
Moj kod:
void collideBall (double *x, double *y, double *Vx, double *Vy)
{
double alfa1=0, alfa2, alfa3, d=40; //alfa2-kat miedzy wypadkowa predkosci a pozioma
for (int i=1;i<16;i++) //alfa3-kat miedzyskladowa w strone odbijanej kulki
{ //alfa1 kat miedzy skladowa w kierunku odbijanej kulki a wypadkowa predkoscia
for (int j=0; j<i;j++)
{
if (sqrt((pow(x[i]-x[j],2)+pow(y[i]-y[j],2)))<=40.0) //x[i] oraz y[i] wspolrzedne kulek
{ //Vx[i] i Vy[i] predkosci skladowe
double V=sqrt(Vx[i]*Vx[i]+Vy[i]*Vy[i]);
alfa2=atan(fabs(Vy[i]/Vx[i]));
alfa3=atan(fabs(x[i]-x[j])/fabs(y[i]-y[j]));
if ((alfa2>=0)&&(alfa2<=1.57)) alfa1=1.57-alfa2-alfa3;
if ((alfa2<0)||(alfa2>1.57)) alfa1=1.57-alfa3;
if (Vx[i]>0)
{
Vx[i]-=V*cos(alfa1)*cos(alfa1+alfa2);
Vx[j]+=V*cos(alfa1)*cos(alfa1+alfa2);
}
else
{
Vx[i]+=V*cos(alfa1)*cos(alfa1+alfa2);
Vx[j]-=V*cos(alfa1)*cos(alfa1+alfa2);
}
if (Vy[i]<0)
{
Vy[i]+=V*cos(alfa1)*sin(alfa1+alfa2);
Vy[j]-=V*cos(alfa1)*sin(alfa1+alfa2);
}
else
{
Vy[i]-=V*cos(alfa1)*sin(alfa1+alfa2);
Vy[j]+=V*cos(alfa1)*sin(alfa1+alfa2);
}
printf ("%lf\n %lf\n %lf\n", alfa1, alfa2, alfa3);
}
}
}
}