1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 #include <cmath> 7 #include <vector> 8 #include <deque> 9 10 using namespace std; 11 12 #define print(x) cout<<x<<endl 13 #define input(x) cin>>x 14 15 const double inf=1e100; 16 const double eps=1e-10; 17 18 inline int zero(double x) 19 { 20 if(x<-eps) return -1; 21 else if(fabs(x)<eps) return 0; 22 else return 1; 23 } 24 25 struct point 26 { 27 double x,y; 28 point(){} 29 point(double i_x,double i_y) 30 { 31 x=i_x;y=i_y; 32 } 33 friend bool operator == (const point& pa,const point& pb) 34 { 35 return (!zero(pa.x-pb.x)) && (!zero(pa.y-pb.y)); 36 } 37 }; 38 39 struct segment 40 { 41 point p1,p2; 42 segment(){} 43 segment(const point& i_p1,const point& i_p2) 44 { 45 p1=i_p1;p2=i_p2; 46 } 47 }; 48 49 struct line 50 { 51 double a,b,c; 52 line(){} 53 line(double i_a,double i_b,double i_c) 54 { 55 a=i_a;b=i_b;c=i_c; 56 } 57 }; 58 59 inline double xmult(point sp,point ep,point op) 60 { 61 return ((sp.x-op.x)*(ep.y-op.y)-(sp.y-op.y)*(ep.x-op.x)); 62 } 63 64 line makeline(point p1,point p2) 65 { 66 line res; 67 int sig=1; 68 res.a=p2.y-p1.y; 69 if(zero(res.a)<0) 70 { 71 sig=-1; 72 res.a=sig*res.a; 73 } 74 res.b=sig*(p1.x-p2.x); 75 res.c=sig*(p1.y*p2.x-p2.y*p1.x); 76 return res; 77 } 78 79 line makeline(segment s) 80 { 81 return makeline(s.p1,s.p2); 82 } 83 84 bool lineIntersect(line l1,line l2,point &p) 85 { 86 double d=l1.a*l2.b-l2.a*l1.b; 87 if(fabs(d)<eps) return false; 88 else 89 { 90 p.x = (l2.c*l1.b-l1.c*l2.b)/d; 91 p.y = (l2.a*l1.c-l1.a*l2.c)/d; 92 return true; 93 } 94 } 95 96 bool segIntersect(segment s1,segment s2,point &p) 97 { 98 if( (max(s1.p1.x,s1.p2.x)>=min(s2.p1.x,s2.p2.x)) && 99 (max(s1.p1.y,s1.p2.y)>=min(s2.p1.y,s2.p2.y)) && 100 (max(s2.p1.x,s2.p2.x)>=min(s1.p1.x,s1.p2.x)) && 101 (max(s2.p1.y,s2.p2.y)>=min(s1.p1.y,s1.p2.y)) && 102 !zero(xmult(s1.p1,s2.p1,s2.p2) * xmult(s1.p2,s2.p1,s2.p2)) && 103 !zero(xmult(s2.p1,s1.p1,s1.p2) * xmult(s2.p2,s1.p1,s1.p2))) 104 { 105 lineIntersect(makeline(s1),makeline(s2),p); 106 return true; 107 } 108 else return false; 109 } 110 111 struct polygen 112 { 113 deque<point> pvec; 114 115 //如果是顺时针序,则clockwise=true 116 //否则是将其设为false 117 void push_point(const point& i_p,bool clockwise=true) 118 { 119 if(clockwise) pvec.push_back(i_p); 120 else pvec.push_front(i_p); 121 } 122 123 void KernelCut(segment s) 124 { 125 deque<point> core; 126 int sz=(int)pvec.size(); 127 for(int i=0;i<sz;i++) 128 { 129 if(zero(xmult(pvec[i],s.p2,s.p1))>=0) 130 { 131 core.push_back(pvec[i]); 132 } 133 else 134 { 135 point cp; 136 if(zero(xmult(pvec[i],s.p2,s.p1) * xmult(pvec[(i-1+sz)%sz],s.p2,s.p1))<0) 137 { 138 line l1=makeline(s); 139 line l2=makeline(pvec[i],pvec[(i-1+sz)%sz]); 140 lineIntersect(l1,l2,cp); 141 core.push_back(cp); 142 } 143 144 if(zero(xmult(pvec[i],s.p2,s.p1) * xmult(pvec[(i+1)%sz],s.p2,s.p1))<0) 145 { 146 line l1=makeline(s); 147 line l2=makeline(pvec[i],pvec[(i+1)%sz]); 148 lineIntersect(l1,l2,cp); 149 core.push_back(cp); 150 } 151 } 152 } 153 pvec=core; 154 } 155 156 void getKernel() 157 { 158 deque<point> backup; 159 backup=pvec; 160 int sz=backup.size(); 161 for(int i=0;i<sz;i++) 162 { 163 KernelCut(segment(backup[i],backup[(i+1)%sz])); 164 } 165 } 166 }; 167 168 int main() 169 { 170 int n; 171 double a,b; 172 while(input(n) && n) 173 { 174 polygen poly; 175 for(int i=0;i<n;i++) 176 { 177 input(a>>b); 178 poly.push_point(point(a,b),false); 179 } 180 poly.getKernel(); 181 if(poly.pvec.size()>0) print(1); 182 else print(0); 183 } 184 return 0; 185 }