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


京公网安备 11010502036488号