多边形面积求和

ACM中计算几何是常考的一个题型,这里总结一下比较常见的多边形面积求和问题:

三角形的面积公式:
S=0.5*AB*AC

这里以原点(0,0)为三角形的一个顶点。
向量叉乘:a*b=x1y2-x2y1
S= (x1y2-x2y1)/2

多边形就是多个三角形相加,因为是向量叉乘,因此自身带有正负号,因此同样适用于凹多边形(减去了多出来的部分)。

因此,多边形的面积计算方法就是SumEare+=S;

下面道例题来说一下:

牛客练习赛36,多边性面积+前缀和(否则超时)

https://ac.nowcoder.com/acm/contest/328/F

AC:

const int MAXN=1e5+10;
const int INF32=0x3f3f3f3f;
const ll INF64=0x3f3f3f3f3f3f3f3f;
const ll mod=1e9+7;
const double PI=acos(-1.0);
 
//三角形的面积公式:
//S=0.5*AB*AC
//向量叉乘:a*b=x1y2-x2y1
//S= (x1y2-x2y1)/2
double x[MAXN],y[MAXN],Seare[MAXN];
double x_,y_;//这里是选取的一个点作为参数。
double getS(int i,int j)
{
    return ((x[i]-x_)*(y[j]-y_)-(x[j]-x_)*(y[i]-y_))/2.0;
}
 
int main()
{
    int n,q;
    cin>>n>>q;
    for(int i=1;i<=n;++i)
        cin>>x[i]>>y[i];
    x_=x[1];y_=y[1];
    for(int i=1;i<n;++i)
        Seare[i]=Seare[i-1]+getS(i,i+1);
    double sum=Seare[n-1];
    double ans=0;
    while(q--)
    {
        int a,b;
        double res=0;
        cin>>a>>b;
        if(a>b)
            swap(a,b);
        if(a+1==b)
            continue;
        res=Seare[b-1]-Seare[a-1];
        res-=getS(a,b);
        ans=max(ans,min(res,sum-res));
        //cout<<res<<" "<<ans<<endl;
    }
    cout<<ans<<endl;
}

猜你喜欢

转载自blog.csdn.net/qq_40482358/article/details/86537550
今日推荐