// Load variables
double[] dir1 = dir;
double[] dir2 = canvas.agents.get(a).getDir();
double[] pos2 = canvas.agents.get(a).getPos();
double kn1[] = { pos1[0] - pos2[0], pos1[1] - pos2[1], pos1[2] - pos2[2] };
// Normalize values to calculate direction
canvas.normalize(dir1, 1);
canvas.normalize(kn1, 100);
// Calculating direction
dir1[0] *= -1;
dir1[1] *= -1;
dir1[2] *= -1;
double ta1 = Math.sqrt(Math.pow(dir1[0] - kn1[0], 2) + Math.pow(dir1[1] - kn1[1], 2) + Math.pow(dir1[2] - kn1[2], 2));
double tb1 = Math.sqrt(Math.pow(dir1[0], 2) + Math.pow(dir1[1], 2) + Math.pow(dir1[2], 2));
double tc1 = Math.sqrt(Math.pow(kn1[0], 2) + Math.pow(kn1[1], 2) + Math.pow(kn1[2], 2));
double alpha1;
if (tb1 == 0 || tc1 == 0) // Direction/Speed = 0
alpha1 = 0;
else
alpha1 = Math.acos((tb1 * tb1 + tc1 * tc1 - ta1 * ta1) / 2 / tb1 / tc1) * 180 / Math.PI;
double t2b1 = tb1*Math.sin(90-alpha1);
canvas.normalize(kn1, t2b1);
dir1[0] = 2*kn1[0]-dir1[0];
dir1[1] = 2*kn1[1]-dir1[1];
dir1[2] = 2*kn1[2]-dir1[2];
canvas.normalize(dir1, 1);
dir = dir1;