#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\n");
else
printf("%d\n",(int)(ans+0.5));
}
return 0;
}
和矩形相关的操作
最新推荐文章于 2022-05-17 10:38:36 发布