zoukankan      html  css  js  c++  java
  • 几何: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;
    }
  • 相关阅读:
    tensorFlow(二)线性回归
    tensorFlow(一)相关重要函数理解
    Java NIO学习笔记-通道&缓冲区
    Code Plus插件开发笔记
    Java NIO框架Netty demo
    前端React开发入门笔记
    Tomcat性能优化
    Spring Boot整合Dubbo框架demo
    Spring Boot入门实例
    简单的RPC原型与实现原理
  • 原文地址:https://www.cnblogs.com/aiguona/p/7285168.html
Copyright © 2011-2022 走看看