首页 > 代码库 > codevs:1249 多边形的面积(多边形面积计算模板)

codevs:1249 多边形的面积(多边形面积计算模板)

题目描述 Description

给出一个简单多边形(没有缺口),它的边要么是垂直的,要么是水平的。要求计算多边形的面积。

多边形被放置在一个X-Y的卡笛尔平面上,它所有的边都平行于两条坐标轴之一。然后按逆时针方向给出各顶点的坐标值。所有的坐标值都是整数(因此多边形的面积也为整数)。

输入描述 Input Description

输入文件第一行给出多边形的顶点数n(n≤100)。接下来的几行每行给出多边形一个顶点的坐标值X和Y(都为整数并且用空格隔开)。顶点按逆时针方向逐个给出。并且多边形的每一个顶点的坐标值-200≤x,y≤200。多边形最后是靠从最后一个顶点到第一个顶点画一条边来封闭的。

输出描述 Output Description

输出文件仅有一行包含一个整数,表示多边形的面积。

样例输入 Sample Input

10

0 0

4 0

4 1

3 1

3 3

2 3

2 2

1 2

1 3

0 3

样例输出 Sample Output

9

Solve:

模板题,求一个非凸多边形的面积

Code:

技术分享
 1 #include <bits/stdc++.h> 2 using namespace std; 3 struct Node 4 { 5     int x , y; 6     Node(int _x = 0 , int _y = 0):x(_x) , y(_y){} 7  8 }; 9 10 int operator ^ (Node a , Node b)11 {12     return a.x * b.y - a.y * b.x;13 }14 Node operator - (Node a , Node b)15 {16     return Node(a.x - b.x , a.y - b.y);17 }18 int n;19 vector<Node> data;20 21 int PolyonArea()22 {23     int ret = 0;24     for(int i = 1 ; i < n - 1 ; ++i)25         ret += (data[i] - data[0]) ^ (data[i + 1] - data[0]);26     return ret;27 }28 int main()29 {30     scanf("%d" , &n);31     for(int i = 1 ; i <= n ; ++i)32     {33         Node a;34         scanf("%d%d" , &a.x , &a.y);35         data.push_back(a);36     }37     int sum = 0;38     sum = PolyonArea() / 2;39 40     printf("%d" , sum);41 }
View Code

 

codevs:1249 多边形的面积(多边形面积计算模板)