run("Set Scale...", "distance=0 known=0 pixel=1 unit=pixel");

setTool("multipoint");
waitForUser("Click on Four Spots then Click OK");

if (selectionType==-1)
      exit("Selection required");
  getSelectionCoordinates(x, y);
  getPixelSize(unit, pixelWidth, pixelHeight);
  run("Clear Results");
  count = 0;
  n = x.length+2;
  lambdaL = 225.8;
if (n-2<4 || n-2>4)
      exit("ERROR!! You must Select 4 points");
 
d12 = sqrt((x[1]-x[0])*(x[1]-x[0])+(y[1]-y[0])*(y[1]-y[0]));
d13 = sqrt((x[2]-x[0])*(x[2]-x[0])+(y[2]-y[0])*(y[2]-y[0]));
d14 = sqrt((x[3]-x[0])*(x[3]-x[0])+(y[3]-y[0])*(y[3]-y[0]));
d23 = sqrt((x[2]-x[1])*(x[2]-x[1])+(y[2]-y[1])*(y[2]-y[1]));
d24 = sqrt((x[3]-x[1])*(x[3]-x[1])+(y[3]-y[1])*(y[3]-y[1]));
d34 = sqrt((x[3]-x[2])*(x[3]-x[2])+(y[3]-y[2])*(y[3]-y[2]));

distances = newArray(d12, d13, d14, d23, d24, d34);
Array.getStatistics(distances,min,max,mean,stdDev);

x1 = x[0];
x2 = x[1];
x3 = x[2];
x4 = x[3];
y1 = y[0];
y2 = y[1];
y3 = y[2];
y4 = y[3];

if (max == d12) {
	text1 = "1 and 2";
	text2 = "3 and 4";
	pair1 = newArray(x1,y1,x2,y2,d12);
	pair2 = newArray(x3,y3,x4,y4,d34);
}
else if (max==d13) {
	text1 = "1 and 3";
	text2 = "2 and 4";
	pair1 = newArray(x1,y1,x3,y3,d13);
	pair2 = newArray(x2,y2,x4,y4,d24);
}
else if (max==d14) {
	text1 = "1 and 4";
	text2 = "2 and 3";
	pair1 = newArray(x1,y1,x4,y4,d14);
	pair2 = newArray(x2,y2,x3,y3,d23);
}
else if (max==d23) {
	text1 = "2 and 3";
	text2 = "1 and 4 ";	
	pair1 = newArray(x2,y2,x3,y3,d23);
	pair2 = newArray(x1,y1,x4,y4,d14);
}
else if (max== d24) {
	text1 = "2 and 4";
	text2 = "1 and 3";
	pair1 = newArray(x2,y2,x4,y4,d24);
	pair2 = newArray(x1,y1,x3,y3,d13);
}
else {
	text1 = "3 and 4";
	text2 = "1 and 2";
	pair1 = newArray(x3,y3,x4,y4,d34);
	pair2 = newArray(x1,y1,x2,y2,d12);
}

slope1 = (pair1[3]-pair1[1])/(pair1[2]-pair1[0]);
slope2 = (pair2[3]-pair2[1])/(pair2[2]-pair2[0]); 

b1 = pair1[1] - slope1*pair1[0];
b2 = pair2[1] - slope2*pair2[0];

xintercept = (b2-b1)/(slope1-slope2);
yintercept = slope1*xintercept + b1;

g11 = sqrt((pair1[0]-xintercept)*(pair1[0]-xintercept)+(pair1[1]-yintercept)*(pair1[1]-yintercept));
g12 = sqrt((pair1[2]-xintercept)*(pair1[2]-xintercept)+(pair1[3]-yintercept)*(pair1[3]-yintercept));
g21 = sqrt((pair2[0]-xintercept)*(pair2[0]-xintercept)+(pair2[1]-yintercept)*(pair2[1]-yintercept));
g22 = sqrt((pair2[2]-xintercept)*(pair2[2]-xintercept)+(pair2[3]-yintercept)*(pair2[3]-yintercept));

g1 = (g11 + g12)/2;
g2 = (g21 + g22)/2;

cosTheta = ((pair1[0]-xintercept)*(pair2[0]-xintercept) + (pair1[1]-yintercept)*(pair2[1]-yintercept))/(g1*g2);
theta = (180*acos(cosTheta))/PI;

d1 = (lambdaL)/g1;
d2 = (lambdaL)/g2;

setResult("g",0,g1);
setResult("d",0,d1);
setResult("g",1,g2);
setResult("d",1,d2);
setResult("Angle",0,theta);
setResult("Angle",1,180-theta);
updateResults();