public class TowerCraneLocate
{
public static Point[] GetCoordinate(int L1, int L2)
{
if (L1 < L2)
{
return null;
}
else if (L1 == L2)
{
Point[] points = new Point[2];
points[0].X = L2;
points[0].Y = 0;
points[1].X = -L2;
points[1].Y = 0;
return points;
}
else if (L2 == 0)
{
Point[] points = new Point[2];
points[0].X = 0;
points[0].Y = L1;
points[1].X = 0;
points[1].Y = -L1;
return points;
}
else
{
Point[] points = new Point[4];
int L3 = (int)Math.Round(Math.Sqrt(L1 * L1 - L2 * L2), 0);
points[0].X = L2;
points[0].Y = L3;
points[1].X = -L2;
points[1].Y = L3;
points[2].X = L2;
points[2].Y = -L3;
points[3].X = -L2;
points[3].Y = -L3;
return points;
}
}
public static Point[] GetCoordinate(Point pointA, int lA, Point pointB, int lB)
{
int dX = pointA.X - pointB.X;
int dY = pointA.Y - pointB.Y;
int lAB = (int)Math.Round(Math.Sqrt(dX * dX + dY * dY), 0);
//如果两点重合
if ((pointA.X == pointB.X) && (pointA.Y == pointB.Y))
{
return null;
}
//如果距离错误
if ((lA + lB) < lAB)
{
return null;
}
//如果点在直线上
if ((lA + lB) == lAB || Math.Abs(lA - lB) == lAB)
{
Point[] points = new Point[1];
int ex = lA * dX / lAB;
int ey = lA * dY / lAB;
if ((lB - lA) == lAB)
{
points[0].X = pointA.X + ex;
points[0].Y = pointA.Y + ey;
}
else
{
points[0].X = pointA.X - ex;
points[0].Y = pointA.Y - ey;
}
return points;
}
else
{
pointB.X -= pointA.X;
pointB.Y -= pointA.Y;
double cita1;
if (pointB.X == 0)
{
if (pointB.Y > 0)
cita1 = 90;
else
cita1 = 270;
}
else if (pointB.Y == 0)
{
if (pointB.X > 0)
cita1 = 0;
else
cita1 = 180;
}
else
{
cita1 = Math.Atan(dY / (dX + 0.00001)) * 180 / Math.PI;
if (pointB.X < 0)
cita1 += 180;
}
double cita2 = Math.Acos((lAB * lAB + lA * lA - lB * lB) / (2 * lAB * lA * 0.99999)) * 180 / Math.PI;
double x1 = Math.Cos((cita1 + cita2) * Math.PI / 180) * lA;
double y1 = Math.Sin((cita1 + cita2) * Math.PI / 180) * lA;
double x2 = Math.Cos((cita1 - cita2) * Math.PI / 180) * lA;
double y2 = Math.Sin((cita1 - cita2) * Math.PI / 180) * lA;
Point[] points = new Point[2];
points[0].X = (int)Math.Round(x1,0) + pointA.X;
points[0].Y = (int)Math.Round(y1,0) + pointA.Y;
points[1].X = (int)Math.Round(x2,0) + pointA.X;
points[1].Y = (int)Math.Round(y2,0) + pointA.Y;
return points;
}
}
}
{
public static Point[] GetCoordinate(int L1, int L2)
{
if (L1 < L2)
{
return null;
}
else if (L1 == L2)
{
Point[] points = new Point[2];
points[0].X = L2;
points[0].Y = 0;
points[1].X = -L2;
points[1].Y = 0;
return points;
}
else if (L2 == 0)
{
Point[] points = new Point[2];
points[0].X = 0;
points[0].Y = L1;
points[1].X = 0;
points[1].Y = -L1;
return points;
}
else
{
Point[] points = new Point[4];
int L3 = (int)Math.Round(Math.Sqrt(L1 * L1 - L2 * L2), 0);
points[0].X = L2;
points[0].Y = L3;
points[1].X = -L2;
points[1].Y = L3;
points[2].X = L2;
points[2].Y = -L3;
points[3].X = -L2;
points[3].Y = -L3;
return points;
}
}
public static Point[] GetCoordinate(Point pointA, int lA, Point pointB, int lB)
{
int dX = pointA.X - pointB.X;
int dY = pointA.Y - pointB.Y;
int lAB = (int)Math.Round(Math.Sqrt(dX * dX + dY * dY), 0);
//如果两点重合
if ((pointA.X == pointB.X) && (pointA.Y == pointB.Y))
{
return null;
}
//如果距离错误
if ((lA + lB) < lAB)
{
return null;
}
//如果点在直线上
if ((lA + lB) == lAB || Math.Abs(lA - lB) == lAB)
{
Point[] points = new Point[1];
int ex = lA * dX / lAB;
int ey = lA * dY / lAB;
if ((lB - lA) == lAB)
{
points[0].X = pointA.X + ex;
points[0].Y = pointA.Y + ey;
}
else
{
points[0].X = pointA.X - ex;
points[0].Y = pointA.Y - ey;
}
return points;
}
else
{
pointB.X -= pointA.X;
pointB.Y -= pointA.Y;
double cita1;
if (pointB.X == 0)
{
if (pointB.Y > 0)
cita1 = 90;
else
cita1 = 270;
}
else if (pointB.Y == 0)
{
if (pointB.X > 0)
cita1 = 0;
else
cita1 = 180;
}
else
{
cita1 = Math.Atan(dY / (dX + 0.00001)) * 180 / Math.PI;
if (pointB.X < 0)
cita1 += 180;
}
double cita2 = Math.Acos((lAB * lAB + lA * lA - lB * lB) / (2 * lAB * lA * 0.99999)) * 180 / Math.PI;
double x1 = Math.Cos((cita1 + cita2) * Math.PI / 180) * lA;
double y1 = Math.Sin((cita1 + cita2) * Math.PI / 180) * lA;
double x2 = Math.Cos((cita1 - cita2) * Math.PI / 180) * lA;
double y2 = Math.Sin((cita1 - cita2) * Math.PI / 180) * lA;
Point[] points = new Point[2];
points[0].X = (int)Math.Round(x1,0) + pointA.X;
points[0].Y = (int)Math.Round(y1,0) + pointA.Y;
points[1].X = (int)Math.Round(x2,0) + pointA.X;
points[1].Y = (int)Math.Round(y2,0) + pointA.Y;
return points;
}
}
}