【C#】已知圆心上的三点求圆心

已知圆心上的三点:\tiny (a_1,b_1)\tiny (a_2,b_2)\tiny (a_3,b_3) ,求圆心:\tiny O(R_x,R_y)

把三点坐标圆的方程:\tiny (x-Rx)^2+(y-Ry)^2=r^2 得:

\tiny (a_1-Rx)^2+(b_1-Ry)^2=(a_2-Rx)^2+(b_2-Ry)^2 \dots \dots \dots (1)

\tiny (a_1-Rx)^2+(b_1-Ry)^2=(a_3-Rx)^2+(b_3-Ry)^2 \dots \dots \dots (2)

把 \tiny (1) 展开整理得:

\tiny a_1^2-a_2^2+b_1^2-b_2^2=(2a_1-2a_2)R_x+(2b_1-2b_2)R_y\dots \dots \dots (3)

\tiny a_1^2-a_3^2+b_1^2-b_3^2=(2a_1-2a_3)R_x+(2b_1-2b_3)R_y\dots \dots \dots (4)

令 

  • \tiny A = a_1^2-a_2^2+b_1^2-b_2^2
  • \tiny B = a_1^2-a_3^2+b_1^2-b_3^2;
  • \tiny P_1=b_1-b_3\tiny P_2=b_1-b_2,
  • \tiny Q_1=a_1-a_3\tiny Q_2=a_1-a_2

\tiny A=2Q_2R_x+2P_2R_y\dots \dots \dots (5)

\tiny B=2Q_1R_x+2P_1R_y\dots \dots \dots (6)

\tiny R_y

\tiny Q_1A=2Q_1Q_2R_x+2Q_1P_2R_y\dots \dots \dots (7)

\tiny Q_2B=2Q_1Q_2R_x+2P_1Q_2R_y\dots \dots \dots (8)

\tiny R_x

\tiny P_1A=2P_1Q_2R_x+2P_1P_2R_y\dots \dots \dots (9)

\tiny P_2B=2P_2Q_1R_x+2P_1P_2R_y\dots \dots \dots (10)

把 \tiny (7)-(8) 移项整理得:

\tiny Q_1A-Q_2B=(2P_2Q_1-2P_1Q_2)R_y\dots \dots \dots (11)

\tiny R_y = \frac{Q_1A-Q_2B}{2P_2Q_1-2P_1Q_2}\dots \dots \dots (12)

把 \tiny (9)-(10) 移项整理得:

\tiny P_1A-P_2B=(2P_1Q_2-2P_2Q_1)R_x\dots \dots \dots (13)

\tiny R_x = \frac{P_1A-P_2B}{2Q_2P_1-2Q_1P_2}\dots \dots \dots (14)

还原\tiny (12)(14)代入式子:

\tiny R_x=\frac{(b_1-b_3)(b_1^2-b_2^2+a_1^2-a_2^2)-(b_1-b_2)(b_1^2-b_3^2+a_1^2-a_3^2)}{2(b_1-b_3)(a_1-a_2)-2(b_1-b_2)(a_1-a_3)}

\tiny R_y=\frac{(a_1-a_3)(a_1^2-a_2^2+b_1^2-b_2^2)-(a_1-a_2)(a_1^2-a_3^2+b_1^2-b_3^2)}{2(a_1-a_3)(b_1-b_2)-2(a_1-a_2)(b_1-b_3)}

整理结果

\tiny R_x=\frac{(b_1-b_3)(a_1^2-a_2^2+b_1^2-b_2^2)-(b_1-b_2)(a_1^2-a_3^2+b_1^2-b_3^2)}{2(a_1-a_2)(b_1-b_3)-2(a_1-a_3)(b_1-b_2)}

\tiny R_y=-\frac{(a_1-a_3)(a_1^2-a_2^2+b_1^2-b_2^2)-(a_1-a_2)(a_1^2-a_3^2+b_1^2-b_3^2)}{2(a_1-a_2)(b_1-b_3)-2(a_1-a_3)(b_1-b_2)}

简化:

\tiny R_x=\frac{P_1A-P_2B}{C}

\tiny R_y=-\frac{Q_1A-Q_2B}{C}

其中:

  • \tiny O(R_x,R_y) 圆心坐标
  • \tiny P_1(a_1,b_1)\tiny P_2(a_2,b_2)\tiny P_3(a_3,b_3) 为不在同一直线上的坐标;
  • \tiny A = a_1^2-a_2^2+b_1^2-b_2^2
  • \tiny B = a_1^2-a_3^2+b_1^2-b_3^2;
  • \tiny C = 2(a_1-a_2)(b_1-b_3)-2(a_1-a_3)(b_1-b_2)
  • \tiny P_1=b_1-b_3\tiny P_2=b_1-b_2,
  • \tiny Q_1=a_1-a_3\tiny Q_2=a_1-a_2

C#中的运用

        /// <summary>
        /// <para>二维:已知圆上三点,求圆心坐标</para>
        /// <para>三个点不在同一直线上</para>
        /// </summary>
        /// <param name="P1">点1</param>
        /// <param name="P2">点2</param>
        /// <param name="P3">点3</param>
        /// <returns></returns>
        public 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);
        }
发布了384 篇原创文章 · 获赞 70 · 访问量 68万+

猜你喜欢

转载自blog.csdn.net/chenlu5201314/article/details/99844303