[AIZU ONLINE JUDGE] 计算几何 CGL_3_A(多边形面积)

Area

For a given polygon g, computes the area of the polygon.

g is represented by a sequence of points p1, p2,..., pn where line segments connecting pi and pi+1 (1 ≤ i ≤ n−1) are sides of g. The line segment connecting pn and p1 is also a side of the polygon.

Note that the polygon is not necessarily convex.

Input

The input consists of coordinates of the points p1,..., pn in the following format:

n
x1 y1 
x2 y2
:
xn yn

The first integer n is the number of points. The coordinate of a point pi is given by two integers xi and yi. The coordinates of points are given in the order of counter-clockwise visit of them.

Output

Print the area of the polygon in a line. The area should be printed with one digit to the right of the decimal point.

Constraints

  • 3 ≤ n ≤ 100
  • -10000 ≤ xiyi ≤ 10000
  • No point will occur more than once.
  • Two sides can intersect only at a common endpoint.

Sample Input 1

3
0 0
2 2
-1 1

Sample Output 1

2.0

Sample Input 2

4
0 0
1 1
1 2
0 2

Sample Output 2

1.5

题目大意:求多边形的面积

真真正正的模板题

算法思路:

利用叉乘的意义是求解两向量围成的三角形的有向面积的两倍,一个多边形(无论是凸多边形还是凹多边形)都可以拆解成若干有向三角形面积的和,由于求解的是三角形面积的两倍,所以最后要 /2;

#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>

using namespace std;

const int N = 110;
const double eps = 1e-10;

struct Point
{
	double x, y;

	Point(double x = 0, double y = 0) : x(x), y(y) { }

	Point operator -(const Point& t) { return Point(x - t.x, y - t.y); }
};

typedef Point Vector;

Point p[N];

double cross(Point A, Point B)
{
	return A.x * B.y - A.y * B.x;
}

//求一个多边形的面积 
double polygon_area(Point p[], int n)
{
	double s = 0;
	for (int i = 1; i + 1 < n; i++)
		s += cross(p[i] - p[0], p[i + 1] - p[i]);
	return s / 2;
}

int n;

int main()
{
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> p[i].x >> p[i].y;
	
	printf("%.1lf\n", polygon_area(p, n));

	return 0;
}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值