通过角度距离计算坐标
public static Point2D GetCoordinate(double angle, double distance, Point2D startPnt = null)
{
var x = Math.Cos(angle) * distance;
var y = Math.Sin(angle) * distance;
if (startPnt != null)
{
x += startPnt.X;
y += startPnt.Y;
}
return new Point2D(x, y);
}
public static double GetAngle(Point2D p1, Point2D p2)
{
var rslt = Math.Atan2(p2.Y - p1.Y, p2.X - p1.X);
return rslt;
}
public static double Distance(Point2D p1, Point2D p2)
{
if (p1 == null || p2 == null)
return null;
return (Math.Sqrt((p2.X - p1.X) * (p2.X - p1.X) + (p2.Y - p1.Y) * (p2.Y - p1.Y)));
}
public static double Distance(Point3D p1, Point3D p2)
{
double part1 = Math.Pow((p2.X - p1.X), 2);
double part2 = Math.Pow((p2.Y - p1.Y), 2);
double part3 = Math.Pow((p2.Z - p1.Z), 2);
double underRadical = part1 + part2 + part3;
var result = Math.Sqrt(underRadical);
return result;
}
public static Point2D Circumcentre(Point2D a, Point2D b, Point2D c)
{
var cx = c.X;
var cy = c.Y;
var ax = a.X - cx;
var ay = a.Y - cy;
var bx = b.X - cx;
var by = b.Y - cy;
var denom = (2 * Det(ax, ay, bx, by));
var numx = Det(ay, ax * ax + ay * ay, by, bx * bx + by * by);
var numy = Det(ax, ax * ax + ay * ay, bx, bx * bx + by * by);
var ccx = cx - numx / denom;
var ccy = cy + numy / denom;
return new Point2D(ccx, ccy);
}
private static double Det(double m00, double m01, double m10, double m11)
{
return m00 * m11 - m01 * m10;
}
public static bool IsInArc(Point2D firstPoint, Point2D secondPoint, Point2D thirdPoint, Point2D fourthPnt, Point2D newPoint, out Point2D presuntCenterPoint, out double presuntArc)
{
//var midPnt1 = GetMidPoint(firstPoint, secondPoint);
//var midPnt2 = GetMidPoint(secondPoint, thirdPoint);
//var midPnt3 = GetMidPoint(thirdPoint, fourthPnt);
//var newMidPoint = GetMidPoint(fourthPnt, newPoint);
var circoCentro = Circocentro(firstPoint, secondPoint, thirdPoint);
var newCircoCentro = Circocentro(secondPoint, thirdPoint, fourthPnt);
if (newCircoCentro != null && circoCentro != null)
{
var distance = Distance(circoCentro, newCircoCentro);
var radius = Distance(firstPoint, circoCentro);
if (radius.HasValue && distance.HasValue)
{
presuntArc = radius.Value;
presuntCenterPoint = circoCentro;
// anche questo non ok
var tolleranceProportional = radius / 5;
var rslt = Math.Abs(distance.Value) <= tolleranceProportional;
return rslt;
}
}
presuntArc = 0;
presuntCenterPoint = null;
return false;
}