#include <cstdio> #include <cstring> #include <vector> #include <cmath> #define PI 3.141592654 #define eps 1e-8 using namespace std; /*********************************************************************/ struct point { int x,y; point() {} point(int _x,int _y):x(_x),y(_y) {} } p[40]; double getdis(int a,int b)///两点之间的距离 { return sqrt((double)(p[b].y-p[a].y)*(p[b].y-p[a].y)+(p[b].x-p[a].x)*(p[b].x-p[a].x)); } struct rectangle { int a,b,c,d; double h,w,l; rectangle(int _a,int _b,int _c,int _d):a(_a),b(_b),c(_c),d(_d) { h=getdis(_a,_b); w=getdis(_a,_c); l=getdis(_a,_d); if(h>w) swap(h,w); if(w>l) swap(w,l); if(h>w) swap(h,w); } }; bool isRightAngle(int a,int b,int c) ///推断ab与ac是否构成直角 { if((p[b].y-p[a].y)*(p[c].y-p[a].y)==-1*(p[b].x-p[a].x)*(p[c].x-p[a].x)) return true; return false; } bool isRectangle(int a,int b,int c,int d) ///推断a,b,c,d是否构成矩形 { int rightAngle=0; if(isRightAngle(a,b,c)||isRightAngle(a,b,d)||isRightAngle(a,c,d)) rightAngle++; if(isRightAngle(b,a,c)||isRightAngle(b,a,d)||isRightAngle(b,c,d)) rightAngle++; if(isRightAngle(c,a,b)||isRightAngle(c,a,d)||isRightAngle(c,b,d)) rightAngle++; if(isRightAngle(d,a,b)||isRightAngle(d,a,c)||isRightAngle(d,b,c)) rightAngle++; if(rightAngle==4) return true; else return false; } double getAngle(int a,int b,int c)///得到ab与ac的夹角 { double x=getdis(a,b); double y=getdis(a,c); double z=getdis(b,c); double l=(x+y+z)/2; double area=sqrt(l*(l-x)*(l-y)*(l-z)); if(x*x+y*y-z*z<-eps) return (asin(2*area/(x*y))+PI/2); else return asin(2*area/(x*y)); } bool isInside(rectangle t,int p)///推断p是否在矩形t内部 { double ans=0; if(getdis(t.a,t.b)<t.l-eps) ans+=getAngle(p,t.a,t.b); if(getdis(t.a,t.c)<t.l-eps) ans+=getAngle(p,t.a,t.c); if(getdis(t.a,t.d)<t.l-eps) ans+=getAngle(p,t.a,t.d); if(getdis(t.b,t.c)<t.l-eps) ans+=getAngle(p,t.b,t.c); if(getdis(t.b,t.d)<t.l-eps) ans+=getAngle(p,t.b,t.d); if(getdis(t.c,t.d)<t.l-eps) ans+=getAngle(p,t.c,t.d); if(ans-2*PI>-eps&&ans-2*PI<eps) return true; else return false; } bool onSement(int a,int b,int c)///推断c是否在ab线段上 { if((p[c].x-p[a].x)*(p[b].y-p[a].y)==(p[b].x-p[a].x)*(p[c].y-p[a].y)&&min(p[a].x,p[b].x)<=p[c].x&&p[c].x<=max(p[a].x,p[b].x)&& min(p[a].y,p[b].y)<=p[c].y&&p[c].y<=max(p[a].y,p[b].y)) return true; else return false; } bool isInEdge(rectangle t,int q)///推断q是否在矩形边框上 { if(getdis(t.a,t.b)<t.l-eps&&onSement(t.a,t.b,q)) return true; if(getdis(t.a,t.c)<t.l-eps&&onSement(t.a,t.c,q)) return true; if(getdis(t.a,t.d)<t.l-eps&&onSement(t.a,t.d,q)) return true; if(getdis(t.b,t.c)<t.l-eps&&onSement(t.b,t.c,q)) return true; if(getdis(t.b,t.d)<t.l-eps&&onSement(t.b,t.d,q)) return true; if(getdis(t.c,t.d)<t.l-eps&&onSement(t.c,t.d,q)) return true; return false; } double getArea(rectangle t)///得到矩形的面积 { return t.h*t.w; } /************************************************************************/ vector<rectangle> vc; int n; int main() { while(scanf("%d",&n)!=EOF&&n!=0) { for(int i=0; i<n; ++i) scanf("%d%d",&p[i].x,&p[i].y); vc.clear(); for(int i=0; i<n; ++i) for(int j=i+1; j<n; ++j) for(int u=j+1; u<n; ++u) for(int v=u+1; v<n; ++v) if(isRectangle(i,j,u,v)) vc.push_back(rectangle(i,j,u,v)); double ans=0; int tsize=vc.size(); for(int i=0; i<tsize; ++i) for(int j=i+1; j<tsize; ++j) { if(isInEdge(vc[i],vc[j].a)||isInEdge(vc[i],vc[j].b)||isInEdge(vc[i],vc[j].c)||isInEdge(vc[i],vc[j].d)) continue; if(isInEdge(vc[j],vc[i].a)||isInEdge(vc[j],vc[i].b)||isInEdge(vc[j],vc[i].c)||isInEdge(vc[j],vc[i].d)) continue; if(isInside(vc[i],vc[j].a)&&isInside(vc[i],vc[j].b)&&isInside(vc[i],vc[j].c)&&isInside(vc[i],vc[j].d)){ ans=max(ans,getArea(vc[i])); continue; } if(isInside(vc[j],vc[i].a)&&isInside(vc[j],vc[i].b)&&isInside(vc[j],vc[i].c)&&isInside(vc[j],vc[i].d)){ ans=max(ans,getArea(vc[j])); continue; } if(isInside(vc[i],vc[j].a)||isInside(vc[i],vc[j].b)||isInside(vc[i],vc[j].c)||isInside(vc[i],vc[j].d)) continue; if(isInside(vc[j],vc[i].a)||isInside(vc[j],vc[i].b)||isInside(vc[j],vc[i].c)||isInside(vc[j],vc[i].d)) continue; ans=max(ans,getArea(vc[i])+getArea(vc[j])); } if(ans>=-eps&&ans<=eps) printf("imp "); else printf("%d ",(int)(ans+0.5)); } return 0; }