• 向量叉乘求任意多边形面积,凹凸均可 void


    多边形面积在计算机中有一个很好的处理办法就是相量叉乘,我们知道三角形ABC的面积可以等于1/2*|AB|*|AC|*sinABC,也就是等于ABXAC的模

    若A(x1,y1),B(x2,y2),那么S=x1*y2-x2*y1,由此就可以求的

    其中点O的坐标可以任意 ,一般都取原点

    例a : S = Soab + Sobc + Socd + Soda ,4个三角形都是顺时针,面积为他们和的绝对值。

                                                                                                                                                                  例b : S =Soab+Sobc+Socd+Soda ,4个三角形中后3个是顺时针,后3个的绝对值的面积Sobcda,但是Soab为逆时针,符号与后三个相反,4个相加刚好把多余的抵消。
    c,d同理
     
    由于叉乘得到的结果有正负,即为方向,但是我们取面积,没有正负,需要取绝对值即可
     
    1 --*
    2 * 计算多边形面积(利用向量叉乘)
    3 */
    4
    5  struct Point { // 点结构体
    6   int x, y;
    7 };
    8
    9 // 点的叉乘: AB * AC
    10 int cross(const Point &A, const Point &B, const Point &C) {
    11 return (B.x - A.x) * (C.y - A.y) - (B.y - A.y) * (C.x - A.x);
    12 }
    13
    14 --*
    15 * 计算多边形面积
    16 * 参数:n个顶点, 多边形顶点坐标集合
    17 */
    18 double polygon_area(const int &n, Point p[])
    19 {
    20 double area = 0.0;
    21 int i;
    22 Point temp;
    23
    24 temp.x = temp.y = 0;//原点
    25 for (i = 0; i < n-1; ++i){
    26 area += cross(temp, p[i], p[i+1]);
    27 }
    28 area += cross(temp, p[n-1], p[0]);//首尾相连
    29 area = area/2.0; //注意要除以2
    30 return area > 0 ? area : -area; //返回非负数
    31 }
  • 相关阅读:
    求最大公约数和最小公倍数,从文件输入数据,将结果输出到另外一个文件
    在CentOS系统中安装quota来管理磁盘配额
    The implementation details of the built thermal setup
    Task set generation
    利用FPGA加速实现高性能计算
    跨域名上传图片
    这几天基本是混过来的
    jQuery插件之Cookie
    jQuery on()方法
    CActiveForm提示中文化
  • 原文地址:https://www.cnblogs.com/void/p/2018729.html
Copyright © 2020-2023  润新知