本人小白,第一次写题解,欢迎大家批评指正。

题目分析

三角形外心

根据题意,需要找到三点距离相等的点,数学上即外心,亦称外圆圆心。输入的三个点不共线,这个条件能保证外心的存在。外心示意图,如图中点O所示
三角形外心示意图

中垂线表达式

计算三角形两边中垂线交点是外心的常用求解方法。首先我们需要中垂线的直线方程表达出来,这里涉及到的是高中知识,直线方程如下,

表示通过点,且法向量为(A,B)的直线。根据这个方法,我们获得两条中垂线直线方程,假设为

交点求解

中垂线交点即外心,我们需要求解上述得到的二元一次线性方程组。将其整理为标准的线性方程组形式的形式。线性方程组的求解有很多迭代啊,矩阵分解等等方法,但这里仅为二阶,直接用即可。对于2x2的矩阵


,其逆可表示为,

代码

最后附上本人拙劣的代码,仅供参考。

#include <bits/stdc++.h>

using namespace std;

class Solution
{
    public:
        vector<int> x;
        vector<int> y;
        void read()
        {
            x = vector<int>(3);
            y = vector<int>(3);
            for(int i=0; i<3; i++)
                cin>>x[i]>>y[i];
        }

        void process()
        {
            double M[2][2];
            double b[2];
            double A=x[2]-x[0];
            double B=y[2]-y[0];
            double cx = (x[2]+x[0])/2.0;
            double cy = (y[2]+y[0])/2.0;
            M[0][0]=A;
            M[0][1] = B;
            b[0] = A*cx+B*cy;

            A=x[1]-x[0];
            B=y[1]-y[0];
            cx = (x[1]+x[0])/2.0;
            cy = (y[1]+y[0])/2.0;
            M[1][0] = A;
            M[1][1] = B;
            b[1] = A*cx+B*cy;

            double detM = M[0][0]*M[1][1]-M[1][0]*M[0][1];
            double xx = (M[1][1]*b[0]-M[0][1]*b[1])/detM;
            double yy = (-M[1][0]*b[0]+M[0][0]*b[1])/detM;
            printf("%.3f %.3f\n",xx,yy);
        }
};

int main()
{
    Solution s;
    s.read();
    s.process();
    return 0;
}