天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 134|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    半小时前
  • 签到天数: 20 天

    [LV.4]偶尔看看III

    115

    主题

    11

    回帖

    1393

    积分

    管理员

    积分
    1393
    QQ
    发表于 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. }
    复制代码

     

     

     

     

    计算几何-----利用叉积计算多边形的面积
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

    GMT+8, 2024-11-5 06:02 , Processed in 0.153169 second(s), 27 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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