TA的每日心情 | 开心 半小时前 |
---|
签到天数: 20 天 [LV.4]偶尔看看III
管理员
- 积分
- 1393
|
利用叉积计算多边形的面积
我们都知道计算三角形的面积时可以用两个邻边对应向量积(叉积)的绝对值的一半表示,那么同样,对于多边形,我们可以以多边形上的一个点为源点,作过该点并且过多边形其他点中的某一个的多条射线,这样就可以把该多边形变为多个三角形,然后利用叉积求面积即可。
不过要注意,对于三角形可以简单的用叉积的绝对值的一半表示,但对于多边形不可随意将它分割成的几个三角形对应的叉积的绝对值相加,要有一定顺序才可。
对于多边形,若顶点是按逆时针方向排列的则方向为最终的值为正,反之为负。这里的排列方向是指你遍历其他顶点时相对于源点的走向。- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<cstdlib>
- using namespace std;
- const int maxn = 100 + 10;
- struct Point
- {
- int 采用x, 采用y;
- Point operator-(Point b)
- {
- Point a;
- a.采用x = 采用x - b.采用x;
- a.采用y = 采用y - b.采用y;
- return a;
- }
- };
- int n;
- Point p[maxn];
- int Cross(Point a, Point b)
- {
- return a.采用x * b.采用y - a.采用y * b.采用x;
- }
- int Area(Point *p)
- {
- int ans = 0;
- for(int i = 1; i < n - 1; i++)
- ans += Cross(p[i]-p[0], p[i+1]-p[0]); //最好写成这样,清晰些,不容易出错
- return ans; //题目说的逆时针,故ans为正值,直接返回即可
- }
- int main()
- {
- // freopen("input.txt", "r", stdin);
- // freopen("output.txt", "w", stdout);
- while(cin >> n && n)
- {
- for(int i = 0; i < n; i++)
- cin >> p[i].采用x >> p[i].采用y;
- int area = Area(p);
- printf("%.1lf\n", (double)area / 2.0);
- }
- }
复制代码 |
|