POJ 1329 Circle Through Three Points (三角形外心)
程序员文章站
2022-04-01 12:42:46
...
http://poj.org/problem?id=1329
题意:给出三个点的坐标,求经过这三个点的圆的方程的标准式及一般式。
蛮智障的一个题,输出各种空格正负号格式,三角形外心套板子就行了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const double eps=1e-8;
const double PI=acos(-1.0);
int sgn(double x)
{
if(fabs(x)>eps) return 0;
if(x<0) return -1;
if(x>0) return 1;
}
struct Point
{
double x,y;
Point(){}
Point(double _x,double _y)
{
x=_x;y=_y;
}
//向量减法
Point operator -(const Point &b)const
{
return Point(x-b.x,y-b.y);
}
//向量叉积
double operator ^(const Point &b)const
{
return x*b.y-y*b.x;
}
//向量点积
double operator *(const Point &b)const
{
return x*b.x+y*b.y;
}
//绕原点旋转角度B(弧度制),后x,y的变化
void transXY(double B)
{
double tx=x,ty=y;
x=tx*cos(B)-ty*sin(B);
y=tx*sin(B)+ty*cos(B);
}
};
double dist(Point a,Point b)
{
return sqrt((a-b)*(a-b));
}
Point waixin(Point a,Point b,Point c)
{
double a1=b.x-a.x,b1=b.y-a.y,c1=(a1*a1+b1*b1)/2;
double a2=c.x-a.x,b2=c.y-a.y,c2=(a2*a2+b2*b2)/2;
double d=a1*b2-a2*b1;
return Point(a.x+(c1*b2-c2*b1)/d,a.y+(a1*c2-a2*c1)/d);
}
int main()
{
double x1,y1,x2,y2,x3,y3;
while(scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3)!=EOF)
{
Point p=waixin(Point(x1,y1),Point(x2,y2),Point(x3,y3));
double r=dist(Point(x1,y1),p);
printf("(x ");
if(p.x>0) printf("- %.3lf)^2 + (y ",p.x);
else printf("+ %.3lf)^2 + (y ",fabs(p.x));
if(p.y>0) printf("- %.3lf)^2 = ",p.y);
else printf("+ %.3lf)^2 = ",fabs(p.y));
printf("%.3lf^2\n",r);
printf("x^2 + y^2 ");
if(p.x>0) printf("- %.3lfx ",2*p.x);
else printf("+ %.3lfx ",2*fabs(p.x));
if(p.y>0) printf("- %.3lfy ",2*p.y);
else printf("+ %.3lfy ",2*fabs(p.y));
if(p.x*p.x+p.y*p.y-r*r<0) printf("- %.3lf = 0\n\n",fabs(p.x*p.x+p.y*p.y-r*r));
else printf("+ %.3lf = 0\n\n",p.x*p.x+p.y*p.y-r*r);
}
return 0;
}