也未经过题目测试。。。。
//AB X AC
double cross(Point A,Point B,Point C)
{
return (B-A)^(C-A);
}
//AB*AC
double dot(Point A,Point B,Point C)
{
return (B-A)*(C-A);
}
//最小矩形面积覆盖
// A 必须是凸包 (而且是逆时针顺序)
double min_rectangle_cover(polygon A)
{
//特判A.n<3的情况
if(A.n<3) return 0.0;
A.p[A.n]=A.p[0];
double ans=-1;
int r=1,p=1,q;
for(int i=0;i<A.n;i++)
{
//卡出离边 A.p[i] - A.p[i+1] 最远的点
while(sgn(cross(A.p[i],A.p[i+1],A.p[r+1])-cross(A.p[i],A.p[i+1],A.p[r]))>=0)
r=(r+1)%A.n;
//卡出 A.p[i] - A.p[i+1] 方向上正向 n 最远的点
while(sgn(dot(A.p[i],A.p[i+1],A.p[p+1])-dot(A.p[i],A.p[i+1],A.p[p]))>=0)
p=(p+1)%A.n;
if(i==0) q=p;
//卡出 A.p[i] - A.p[i+1] 方向上负向最远的点
while(sgn(dot(A.p[i],A.p[i+1],A.p[q+1])-dot(A.p[i],A.p[i+1],A.p[q]))<=0)
q=(q+1)%A.n;
double d=(A.p[i]-A.p[i+1]).len2();
double tmp=cross(A.p[i],A.p[i+1],A.p[r])*(dot(A.p[i],A.p[i+1],A.p[p])-dot(A.p[i],A.p[i+1],A.p[q]))/d;
if(ans<0||ans>tmp) ans=tmp;
}
return ans;
}
//直线切凸多边形
//多边形是逆时针的,在 q1q2 的左侧
vector<Point> convex_cut_line(const vector<Point> &ps,Point q1,Point q2)
{
vector<Point>qs;
int n=ps.size();
for(int i=0;i<n;i++)
{
Point p1=ps[i],p2=ps[(i+1)%n];
int d1=sgn((q2-q1)^(p1-q1)),d2=sgn((q2-q1)^(p2-q1));
if(d1>=0) qs.push_back(p1);
if(d1*d2<0)
qs.push_back(Line(p1,p2).cross_point(Line(q1,q2)));
}
return qs;
}