本人小白,第一次写题解,欢迎大家批评指正。
题目分析
三角形外心
根据题意,需要找到三点距离相等的点,数学上即外心,亦称外圆圆心。输入的三个点不共线,这个条件能保证外心的存在。外心示意图,如图中点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; }