首页 > 其他 > 详细

Luogu P1183 多边形的面积 「解题报告」&&「用向量积计算多边形面积」笔记

时间:2019-08-25 02:28:45      阅读:123      评论:0      收藏:0      [点我收藏+]

P1183 多边形的面积


Luogu

题意


给出一多边形的\(n\)个顶点,求它的面积。多边形的边都是垂直或平行于坐标轴的。

解析


向量积

\(\vec{a}\cdot\vec{b}\) 可以解释为以 \(a\)\(b\) 为邻边的平行四边形面积
\[ \vec{a}\cdot\vec{b}=|\vec{a}|\cdot|\vec{b}|\cdot\sin\theta \]
因为本题中 \(\theta=90^\circ\) 所以 \(\sin\theta=1\)

求三角形ABC的面积,根据向量积的意义,得到:\(S=|\vec{AB}\times\vec{AC}|/2\)

于是

求多边形面积的方法就是用剖分来做的,把多边形分成若干个三角形,求每个三角形的面积。

以顶点逆时针排列为例剖分:

技术分享图片
技术分享图片

对于三角形 \(P_1P_aP_b\) 其面积的正负取决于它是右手系还是左手系(注意是逆时针顶点

左手系,负面积
技术分享图片
右手系,正面积
技术分享图片

剖分的顶点默认\((0,0)\),于是可以得出计算多边形面积的公式
\[ S=[\sum^{n-1}_1{(\vec{PP_i}\times\vec{PP_{i+1}})+(\vec{PP_n}\times\vec{PP_1})}]\div2 \\\quad\:\:\:\:=[\sum_1^{n-1}{(x_iy_{i+1}-x_{i+1}y_i)+(x_ny_1-x_1y_n)}]\div2 \]

代码


#include<iostream>
using namespace std;
int n;
double ans;
struct node
{
    int x;int y;
}dot[101];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>dot[i].x>>dot[i].y;
    for(int i=1;i<=n;i++)
        ans+=(dot[i].x*dot[i+1].y-dot[i+1].x*dot[i].y);
    ans+=(dot[n].x*dot[1].y-dot[1].x*dot[n].y);
    cout<<ans/2<<endl;
    return 0;
}

Luogu P1183 多边形的面积 「解题报告」&&「用向量积计算多边形面积」笔记

原文:https://www.cnblogs.com/JHTBlog/p/11406427.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!