SGU 227. The art to the broad masses!

来源:互联网 发布:手机游戏 知乎 编辑:程序博客网 时间:2024/06/06 08:57

Link To The Problem


Solution : 圆交、点在弧上的判断

PS: SGU 的数据真真有点恶心,一开始完全没有意识到还有重合的情况啊。。


Code:

// SGU 227 The art to thr broad masses// Solution :圆交、点在弧上的判断、// 两弧相交的结果是,一个点、两个点、一段弧、没有//#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>using namespace std;#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)#define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)#define oo 1e6#define eps 1e-8#define nMax 1010//{ #define pb push_back#define dbg(x) cerr << __LINE__ << ": " << #x << " = " << x << endl#define F first#define S second#define bug puts("OOOOh.....");#define zero(x) (((x)>0?(x):-(x))<eps)#define LL long long#define DB double #define sf scanf#define pf printf#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)double const pi = acos(-1.0);double const inf = 1e9;double inline sqr(double x) { return x*x; }int dcmp(double x){    if(fabs(x)<=eps) return 0;    return x>0?1:-1;}//}// Describe of the 2_K Geomtry// First Part : Point and Line// Second Part Cicle// Third Part Polygan// First Part:// ****************************** Point and Line *******************************\\//  {  class point {public:    double x,y;    point (double x=0,double y=0):x(x),y(y) {}    void make(double _x,double _y) {x=_x;y=_y;}    void read() { scanf("%lf%lf",&x,&y); }    void out() { printf("%.3lf %.3lf\n",x+eps,y+eps);}    double len() { return sqrt(x*x+y*y); }    point friend operator - (point const& u,point const& v) { return point(u.x-v.x,u.y-v.y); }    point friend operator + (point const& u,point const& v) { return point(u.x+v.x,u.y+v.y); }    double friend operator * (point const& u,point const& v){ return u.x*v.y-u.y*v.x; }    double friend operator ^ (point const& u,point const& v) { return u.x*v.x+u.y*v.y; }    point friend operator * (point const& u,double const& k) { return point(u.x*k,u.y*k); }point friend operator / (point const& u,double const& k) { return point(u.x/k,u.y/k); }friend bool operator < (point const& u,point const& v){if(dcmp(v.x-u.x)==0) return dcmp(u.y-v.y)<0;return dcmp(u.x-v.x)<0;}friend bool operator != (point const& u,point const& v){return dcmp(u.x-v.x) || dcmp(u.y-v.y);}point rotate(double s) {return point(x*cos(s) + y*sin(s),\-x*sin(s) + y*cos(s));}};typedef point Vector;typedef class line{public:    point a,b;    line() {}    line (point a,point b):a(a),b(b){}    void make(point u,point v) {a=u;b=v;}    void read() { a.read(),b.read(); }}segment;double det(point u,point v) {return u.x*v.y - u.y*v.x;}double dot(point u,point v) {return u.x*v.x + u.y*v.y;}// Weather P is On the Segment (uv) int dot_on_seg(point p,point u,point v){return dcmp(det(p-u,v-p))==0 && dcmp(dot(p-u,p-v)) <= 0; // '>=' means P is u or v}// The distance from point p to line ldouble PToLine(point p,line l) {return fabs((p-l.a)*(l.a-l.b))/(l.a-l.b).len();}// The ProJect Of Point(p) To Line(l)point PointProjectLine(point p,line l) {double t = dot(l.b-l.a,p-l.a)/dot(l.b-l.a,l.b-l.a);return l.a + (l.b-l.a)*t;}// Weather line u parallel line vint parallel(line u,line v) {return dcmp(det(u.a-u.b,v.a-v.b))==0;}// The Intersection Point Of Line u and Line vpoint intersection(line u,line v) {point ret = u.a;double t = det(u.a-v.a,v.a-v.b)/det(u.a-u.b,v.a-v.b);return ret + (u.b-u.a)*t;}//}// ****************************** First Part end ********************************\\// Second Part:// ********************************* Circle *************************************\\// {struct Circle {point O;double r;Circle() {};Circle(point O,double r):O(O),r(r){};};//}// ****************************** Second Part End *******************************\\// Third Part :// ********************************* Polygan *************************************\\// {int ConvexHull(vector<point>& p){int n=p.size();int m=0;vector<point> q;q.resize(2*n+5);rep(i,n) {while(m>1 && dcmp((q[m-1]-q[m-2])*(p[i]-q[m-2])) <= 0) m--;q[m++] = p[i];}int k = m;for(int i=n-2;i>=0;i--) {while(m>k && dcmp((q[m-1]-q[m-2])*(p[i]-q[m-2])) <= 0) m--;q[m++] = p[i];}q.resize(m) ;if(m>1) q.resize(m-1);// p = q;    // 是否修改原来的多边形return q.size();}// 三角形重心point Center(point a,point b,point c){return (a+b+c)/3.0;}// Centroid of Polyganpoint Centroid(vector<point> p){point O(0,0),ret(0,0);int n = p.size();p.pb(p[0]);double area = 0.0;rep(i,n) {ret = ret + Center(O,p[i],p[i+1])*dot(p[i]-O,p[i+1]-O);area += dot(p[i]-O,p[i+1]-O);}if(dcmp(area)==0) {pf("There maybe something wrong\n");return p[0];}return ret / area;}struct Polygan{vector<point> g;Polygan() {};Polygan(vector<point> g):g(g){};Polygan(point p[],int n) {g.clear();rep(i,n) g.pb(p[i]); };int convex() { return ConvexHull(g); }point center() { return Centroid(g);  } // 多边形的重心};//}// ******************************* Third Part End ********************************\\// Solution Part//中垂线line MidAtiLine(point u,point v) {point p = (u+v)/2.0;point n = (u-p);n = n.rotate(pi/2.0);n = n + p;return line(p,n);}struct Art{point a,b,c;void read() {a.read(),b.read(),c.read();}};Circle make(Art s) {Circle ret;line u = MidAtiLine(s.a,s.c), v = MidAtiLine(s.b,s.c);ret.O = intersection(u,v);ret.r = (ret.O-s.a).len();return ret;}int PointInArt(point p,Art s) {return dcmp((p-s.a)*(s.b-p))*dcmp((s.c-s.a)*(s.b-s.c)) >= 0;}int PointInArt_ex(point p,Art s) {return dcmp((p-s.a)*(s.b-p))*dcmp((s.c-s.a)*(s.b-s.c)) > 0;}int intersection(Circle u,Circle v) {double d = (u.O-v.O).len();if(dcmp(d-fabs(u.r-v.r))<0) return 0;if(dcmp(d-u.r-v.r)      >0) return 0;return 1;}int n;Art s[nMax];Circle c[nMax];vector<point> v,ans;int main() {#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);#endifwhile(~sf("%d",&n)){rep(i,n) {s[i].read();c[i]=make(s[i]);}v.clear();int infinity = 0;rep(i,n) for(int j=i+1;j<n;j++){point n = (c[i].O-c[j].O);double d = n.len();if(dcmp(d)==0 && dcmp(c[i].r-c[j].r)==0){if(PointInArt_ex(s[i].a,s[j])) { infinity = 1;break;}if(PointInArt_ex(s[i].b,s[j])) { infinity = 1;break;}if(PointInArt_ex(s[i].c,s[j])) { infinity = 1;break;}if(PointInArt_ex(s[j].a,s[i])) { infinity = 1;break;}if(PointInArt_ex(s[j].b,s[i])) { infinity = 1;break;}if(PointInArt_ex(s[j].c,s[i])) { infinity = 1;break;}}if(dcmp(d)==0 && dcmp(c[i].r-c[j].r)==0) {if(PointInArt(s[i].a,s[j])) { v.pb(s[i].a); }if(PointInArt(s[i].b,s[j])) { v.pb(s[i].b);}if(PointInArt(s[j].a,s[i])) { v.pb(s[j].a);}if(PointInArt(s[j].b,s[i])) { v.pb(s[j].b);}}if(dcmp(d)==0) continue;if(intersection(c[i],c[j])==0) continue;double alfa = acos((sqr(d)+sqr(c[j].r)-sqr(c[i].r))/2.0/d/c[j].r);n = n * ( c[j].r / d);point p = n.rotate(alfa) + c[j].O;if(PointInArt(p,s[i]) && PointInArt(p,s[j])) v.pb(p);p = n.rotate(-alfa) + c[j].O;if(PointInArt(p,s[i]) && PointInArt(p,s[j])) v.pb(p);}if(infinity) {pf("Infinity\n");continue;}sort(v.begin(),v.end());if(v.size()==0) continue;ans.clear();point p = v[0];ans.pb(p);for(int i=0;i<v.size();i++) {if(v[i]!=p) {p = v[i];ans.pb(v[i]);}}pf("%d\n",(int)ans.size());for(int i=0;i<ans.size();i++) {ans[i].out() ;}}return 0;}