已知三点求圆心坐标:(关注自媒体 Grand Theft Algorithm,回复01送算法大礼包)
#include <bits/stdc++.h>
using namespace std;
//常数
double const pai = 3.1415926535897932384626;
//坐标点结构
struct point
{
double x; //横坐标
double y; //纵坐标
};
//直线方程结构
struct line
{
double k; //斜率
double b; //截距
};
//求两点距离
double dist(point p1,point p2)
{
double ret=0;
ret=sqrt((p1.x-p2.x)*(p1.x-p2.x)+ (p1.y-p2.y)*(p1.y-p2.y));
return ret;
}
/*
已知两点,求连线中点坐标
---------------------------------
两点(x1,y1),(x2,y2)的连线中点坐标
((x1+x2)/2,(y1+y2)/2)
*/
point midpoint(point p1, point p2)
{
point ret;
ret.x = (p1.x + p2.x )/2;
ret.y = (p1.y + p2.y )/2;
return ret;
}
/*
已知两点,求连线方程
-------------------------------------
两点(x1,y1),(x2,y2)的连线方程表示成Y=ax+b
a=(y1-y2)/(x1-x2)
b= y2 - x2*a
或者
b= y1- x1*a
-------------------------------------
*/
line line2p(point p1,point p2)
{
line ret;
if ((p1.x==p2.x) && (p1.y = p2.y))
{
ret.k = 0;
ret.b = 0;
}
else
{
ret.k = (p1.y - p2.y)/ (p1.x -p2.x);
ret.b = p1.y - p1.x * ret.k ;
}
return ret;
}
point crosspoint(line l1,line l2)
{
point ret;
ret.x = (l2.b-l1.b ) / (l1.k - l2.k);
ret.y = (l1.k*l2.b-l2.k*l1.b)/(l1.k-l2.k);
return ret;
}
line linepoint(point p,double k,double n) //过某点直线方程
{
line ret;
ret.k = tan(atan(k)+n);
ret.b = p.y - ret.k * p.x ;
return ret;
}
point p1,p2,p3;
point m1,m2,m3;
line l1,l2,l3;
line lm1,lm2,lm3;
point circlep;
double circler,dis2,dis3;
int main()
{
cin>>p1.x>>p1.y;
cin>>p2.x>>p2.y;
cin>>p3.x>>p3.y;
m1=midpoint(p1,p2);
m2=midpoint(p2,p3);
l1=line2p(p1,p2);
l2=line2p(p2,p3);
lm1=linepoint(m1,l1.k,pai/2);
lm2=linepoint(m2,l2.k,pai/2);
circlep=crosspoint(lm1,lm2);
printf("%.3lf %.3lf", circlep.x, circlep.y);
return 0;
}