数学计算

通过角度距离计算坐标

 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;
        }

猜你喜欢

转载自blog.csdn.net/weixin_42339460/article/details/80733191