求圆心

        /// <summary>
        /// 两点弧度逆时针圆心
        /// </summary>
        /// <param name="P1">点1</param>
        /// <param name="P2">点2</param>
        /// <param name="theta">弧度</param>
        /// <returns></returns>
        private static PointF GetCentre(PointF P1, PointF P2, double theta)
        {
            double t = Math.PI * theta / 180.0;
            double sinT = Math.Sin(t);
            double cosT = Math.Cos(t);
            double temp = 0.5 / (1.0 - cosT);
            double cx = (P1.X + P2.X) * 0.5 + sinT * (P1.Y - P2.Y) * temp;
            double cy = (P1.Y + P2.Y) * 0.5 + sinT * (P2.X - P1.X) * temp;
            return new PointF((float)cx, (float)cy);
        }
        /// <summary>
        /// 二维:已知圆上三点,求圆心坐标
        /// </summary>
        /// <param name="P1">点1</param>
        /// <param name="P2">点2</param>
        /// <param name="P3">点3</param>
        /// <returns></returns>
        public static PointF GetCentre(PointF P1, PointF P2, PointF P3)
        {
            double a13 = P1.X - P3.X;
            double a13_ = P1.X + P3.X;
            double b13 = P1.Y - P3.Y;
            double b13_ = P1.Y + P3.Y;
            double a12 = P1.X - P2.X;
            double a12_ = P1.X + P2.X;
            double b12 = P1.Y - P2.Y;
            double b12_ = P1.Y + P2.Y;

            double a12b12_2 = a12 * a12_ + b12 * b12_;
            double a13b13_2 = a13 * a13_ + b13 * b13_;

            double a13b12 = 2 * a13 * b12;
            double a12b13 = 2 * a12 * b13;


            if (a12b13 - a13b12 == 0) return new PointF((P2.X + P1.X) / 2, (P2.Y + P1.Y) / 2);
            double af = a12b13 - a13b12;
            double bf = a13b12 - a12b13;
            double az = b13 * a12b12_2 - b12 * a13b13_2;
            double bz = a13 * a12b12_2 - a12 * a13b13_2;
            double a = az / af;
            double b = bz / bf;
            return new PointF((float)a, (float)b);
        }

 

posted @ 2023-09-11 14:53  奔赴山海Y  阅读(24)  评论(0)    收藏  举报