• 几何:pick定理详解


    一、概念

      假设P的内部有I(P)个格点,边界上有B(P)个格点,则P的面积A(P)为:A(P)=I(P)+B(P)/2-1。

    二、说明

      Pick定理主要是计算格点多边形(定点全是格点的不自交图形)P的面积与其边界和内部格点数之间的关系。

      格点多边形的面积A(P)可以通过叉积计算出来,不过叉积计算出来的面积是实际面积的2倍;

      边界上的格点B(P)可以通过计算相邻两点的横坐标之差与纵坐标之差的最大公约数的和得到;

      内部的格点I(P)则通过公式得:I(P) = A(P)-B(P)/2+1计算出。

      解释:

       a.关于边界格点计算两点横纵坐标之差就是以两个点构成的边做坐标轴,组成的三角形(或者线)的两个之角标求gcd

       b.格点多边形的面积是通过将多边形固定一个点,然后在遍历每两个点,三个点构成的三角形求面积。由于叉积可以为负,所以不必担心多加的三角形或者不在多边形内部的三角形,都会减去。

    三、代码

    #include <stdio.h>
    #include <math.h>
    #include<stdlib.h>
    struct node
    {
        int x,y;
    } point[110];
    
    int gcd(int a,int b)//gcd
    {
        if(b==0)
            return a;
        return
            gcd(b,a%b);
    }
    
    int Area(node a,node b)//叉积
    {
        return a.x*b.y-a.y*b.x;
    }
    
    int main()
    {
        int T,case1=1;
        scanf("%d",&T);
        int n;
        while(T--)
        {
            int a=0,p=0,dx,dy,i;
            scanf("%d",&n);
            point[0].x=0;
            point[0].y=0;
            for(i=1; i<=n; i++)
            {
                scanf("%d%d",&point[i].x,&point[i].y);
    
                /*求每条边上的点*/
                dx=abs(point[i].x);
                dy=abs(point[i].y);
                p+=gcd(dx,dy);
    
                /*用叉积求面积*/
                point[i].x+=point[i-1].x;
                point[i].y+=point[i-1].y;
                a+=Area(point[i],point[i-1]);
    
            }
            /*最后面积要取正值*/
            a=abs(a);
    
    
            printf("Scenario #%d:
    ",case1++);
            printf("%d %d %.1f
    
    ",(a-p+2)/2,p,0.5*a);
        }
        return 0;
    }
  • 相关阅读:
    [Docker]How to run CentOS in Docker container
    【go】 golang 的文件写入和读取(Write()、WriteString(),bufio包:WriteString()、flush(), ioutil 包:WriteFile()、ReadFile())
    【go】golang网络通信超时设置
    Hbuilderx 安装App云打包失败解决
    新版ios开发证书的配置及在Xcode上的应用
    Rocket core ex_reg_xcpt_interrupt
    Rocket core IntCtrlSigs
    Rocket core ibuf vs. imem
    Linux中快速回到N级上层目录
    Rocket core decodeReg
  • 原文地址:https://www.cnblogs.com/aiguona/p/7285168.html
Copyright © 2020-2023  润新知