找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 146|回复: 0

计算几何-----利用叉积计算多边形的面积

[复制链接]

1

主题

0

回帖

35

积分

管理员

积分
35
发表于 2024-3-16 09:10:24 | 显示全部楼层 |阅读模式
利用叉积计算多边形的面积
我们都知道计算三角形的面积时可以用两个邻边对应向量积(叉积)的绝对值的一半表示,那么同样,对于多边形,我们可以以多边形上的一个点为源点,作过该点并且过多边形其他点中的某一个的多条射线,这样就可以把该多边形变为多个三角形,然后利用叉积求面积即可。
不过要注意,对于三角形可以简单的用叉积的绝对值的一半表示,但对于多边形不可随意将它分割成的几个三角形对应的叉积的绝对值相加,要有一定顺序才可。

对于多边形,若顶点是按逆时针方向排列的则方向为最终的值为正,反之为负。这里的排列方向是指你遍历其他顶点时相对于源点的走向。
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<cstdlib>
  6. using namespace std;
  7. const int maxn = 100 + 10;
  8. struct Point
  9. {
  10.     int 采用x, 采用y;
  11.     Point operator-(Point b)
  12.     {
  13.         Point a;
  14.         a.采用x = 采用x - b.采用x;
  15.         a.采用y = 采用y - b.采用y;
  16.         return a;
  17.     }
  18. };
  19. int n;
  20. Point p[maxn];
  21. int Cross(Point a, Point b)
  22. {
  23.     return a.采用x * b.采用y - a.采用y * b.采用x;
  24. }
  25. int Area(Point *p)
  26. {
  27.     int ans = 0;
  28.     for(int i = 1; i < n - 1; i++)
  29.         ans += Cross(p[i]-p[0], p[i+1]-p[0]);          //最好写成这样,清晰些,不容易出错
  30.     return ans;     //题目说的逆时针,故ans为正值,直接返回即可
  31. }
  32. int main()
  33. {
  34. //    freopen("input.txt", "r", stdin);
  35. //    freopen("output.txt", "w", stdout);
  36.     while(cin >> n && n)
  37.     {
  38.         for(int i = 0; i < n; i++)
  39.             cin >> p[i].采用x >> p[i].采用y;
  40.         int area = Area(p);
  41.         printf("%.1lf\n", (double)area / 2.0);
  42.     }
  43. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2025-1-1 17:13 , Processed in 0.131228 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表