package com.imps.tabletennis.tranning;
public class CollisionUtil
{
public static float dotProduct(float[] vec1,float[] vec2)
{
return
vec1[0]*vec2[0]+
vec1[1]*vec2[1];
}
public static float mould(float[] vec)
{
return (float)Math.sqrt(vec[0]*vec[0]+vec[1]*vec[1]);
}
public static float angle(float[] vec1,float[] vec2)
{
float dp=dotProduct(vec1,vec2);
float m1=mould(vec1);
float m2=mould(vec2);
float acos=dp/(m1*m2);
if(acos>1)
{
acos=1;
}
else if(acos<-1)
{
acos=-1;
}
return (float) Math.acos(acos);
}
public static float calcuDisSquare(float[] p1,float[] p2)
{
return (p1[0]-p2[0])*(p1[0]-p2[0])+(p1[1]-p2[1])*(p1[1]-p2[1]);
}
public static boolean isTwoBallsCollided(float ballaTempXY[],Ball ballb){
float BAx=ballaTempXY[0]-ballb.getX();
float BAy=ballaTempXY[1]-ballb.getY();
float mvBA=mould(new float[]{BAx,BAy});
return (mvBA<Ball.d);
}
public static boolean collisionCalculate(float ballaTempXY[],Ball balla,Ball ballb)
{
float BAx=ballaTempXY[0]-ballb.getX();
float BAy=ballaTempXY[1]-ballb.getY();
float mvBA=mould(new float[]{BAx,BAy});
if(mvBA>Ball.d){
return false;
}
float vB=(float)Math.sqrt(ballb.vx*ballb.vx+ballb.vy*ballb.vy);
float vbCollX=0;
float vbCollY=0;
float vbVerticalX=0;
float vbVerticalY=0;
if(balla.vMin<vB)
{
float bAngle=angle
(
new float[]{ballb.vx,ballb.vy},
new float[]{BAx,BAy}
);
float vbColl=vB*(float)Math.cos(bAngle);
vbCollX=(vbColl/mvBA)*BAx;
vbCollY=(vbColl/mvBA)*BAy;
vbVerticalX=ballb.vx-vbCollX;
vbVerticalY=ballb.vy-vbCollY;
}
float vA=(float)Math.sqrt(balla.vx*balla.vx+balla.vy*balla.vy);
float vaCollX=0;
float vaCollY=0;
float vaVerticalX=0;
float vaVerticalY=0;
if(balla.vMin<vA)
{
float aAngle=angle
(
new float[]{balla.vx,balla.vy},
new float[]{BAx,BAy}
);
float vaColl=vA*(float)Math.cos(aAngle);
vaCollX=(vaColl/mvBA)*BAx;
vaCollY=(vaColl/mvBA)*BAy;
vaVerticalX=balla.vx-vaCollX;
vaVerticalY=balla.vy-vaCollY;
}
balla.vx=vaVerticalX+vbCollX;
balla.vy=vaVerticalY+vbCollY;
ballb.vx=vbVerticalX+vaCollX;
ballb.vy=vbVerticalY+vaCollY;
//System.out.println("ball aaaaaaaaaaaaaaaaaaaaaaaaaaaa "+balla.vx+" ======= "+balla.vy);
//System.out.println("ball bbbbbbbbbbbbbbbbbbbbbb "+ballb.vx+" ======= "+ballb.vy);
return true;
}
}