精华内容
下载资源
问答
  • 多边形内角和与多边形的面积公式

    千次阅读 2014-11-22 10:38:00
    多边形内角计算公式与半径无关 要已知正多边形边数为N 内角和=180(N-2) ...圆的内接三角形面积公式:(3...五边形以上的就分割成等边三角形再算 内角和公式——(n-2)*180` 我们都知道已知A(x1,y1)、B(x2,y2
    正多边形内角计算公式与半径无关
    要已知正多边形边数为N 内角和=180(N-2)
    半径为R
    圆的内接三角形面积公式:(3倍根号3)除以4再乘以R方
    外切三角形面积公式:3倍根号3 R方
    外切正方形:4R方
    内接正方形:2R方
    五边形以上的就分割成等边三角形再算
    内角和公式——(n-2)*180`
    我们都知道已知A(x1,y1)、B(x2,y2)、C(x3,y3)三点的面积公式为
    |x1 x2 x3|
    S(A,B,C) = |y1 y2 y3| * 0.5 = [(x1-x3)*(y2-y3) - (x2-x3)*(y1-y3)]*0.5
    |1 1 1 |
    (当三点为逆时针时为正,顺时针则为负的)
    对多边形A1A2A3、、、An(顺或逆时针都可以),设平面上有任意的一点P,则有:
    S(A1,A2,A3,、、、,An)
    = abs(S(P,A1,A2) + S(P,A2,A3)+、、、+S(P,An,A1))
    P是可以取任意的一点,用(0,0)时就是下面的了:
    设点顺序 (x1 y1) (x2 y2) ... (xn yn)
    则面积等于
    |x1 y1| |x2 y2| |xn yn|
    0.5 * abs( | | + | | + ...... + | | )
    |x2 y2| |x3 y3| |x1 y1|
    其中
    |x1 y1|
    | |=x1*y2-y1*x2
    |x2 y2|
    因此面积公式展开为:
    |x1 y1| |x2 y2| |xn yn|
    0.5 * abs( | | + | | + ...... + | | )=0.5*abs(x1*y2-y1*x2+x2*y3-y2*x3+...+xn*y1-yn*x1)
    |x2 y2| |x3 y3| |x1 y1| 
    下面贴一个水题

    改革春风吹满地

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 19760    Accepted Submission(s): 10100


    Problem Description
    “ 改革春风吹满地,
    不会AC没关系;
    实在不行回老家,
    还有一亩三分地。
    谢谢!(乐队奏乐)”

    话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也是云里雾里,而且,还竟然来这么几句打油诗。
    好呀,老师的责任就是帮你解决问题,既然想种田,那就分你一块。
    这块田位于浙江省温州市苍南县灵溪镇林家铺子村,多边形形状的一块地,原本是linle 的,现在就准备送给你了。不过,任何事情都没有那么简单,你必须首先告诉我这块地到底有多少面积,如果回答正确才能真正得到这块地。
    发愁了吧?就是要让你知道,种地也是需要AC知识的!以后还是好好练吧...
     

    Input
    输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, y2... xn, yn),为了简化问题,这里的所有坐标都用整数表示。
    输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。
     

    Output
    对于每个测试实例,请输出对应的多边形面积,结果精确到小数点后一位小数。
    每个实例的输出占一行。
     

    Sample Input
    3 0 0 1 0 0 1 4 1 0 0 1 -1 0 0 -1 0
     

    Sample Output
    0.5 2.0
     
    代码如下:
    #include<stdio.h>
    #include<math.h>
    int main(void)
    {
        int n;
        int a[100],b[100],i,j,k;
        double s;
        while(scanf("%d",&n)!=EOF&&n)
        {
            s=0;
            i=0;
            k=n;
            while(n--)
            {
                scanf("%d%d",&a[i],&b[i]);
                i++;
            }
            a[k]=a[0];
            b[k]=b[0];
            for(i=0;i<k;i++)
                s+=(a[i]*b[i+1]-a[i+1]*b[i]);
            printf("%.1lf\n",s/2);
        }
        return 0;
    }
    这个属于计算几何的基础部分。。务必记住啊



    展开全文
  • 多边形面积公式

    千次阅读 2009-10-06 17:19:00
    ====多边形面积公式多边形内角计算公式与半径无关 要已知正多边形边数为N 内角和=180(N-2) 半径为R 圆的内接三角形面积公式:(3倍根号3)除以4再乘以R方 外切三角形面积公式:3倍根号3 R方 外切正方形:4R方 内接...

    ====多边形面积公式
    正多边形内角计算公式与半径无关
    要已知正多边形边数为N 内角和=180(N-2)

    半径为R
    圆的内接三角形面积公式:(3倍根号3)除以4再乘以R方
    外切三角形面积公式:3倍根号3 R方
    外切正方形:4R方
    内接正方形:2R方
    五边形以上的就分割成等边三角形再算
    内角和公式——(n-2)*180`
    我们都知道已知A(x1,y1)、B(x2,y2)、C(x3,y3)三点的面积公式为
                     |x1 x2 x3|
    S(A,B,C) = |y1 y2 y3| * 0.5 = [(x1-x3)*(y2-y3) - (x2-x3)*(y1-y3)]*0.5
                     |1   1   1 |
    (当三点为逆时针时为正,顺时针则为负的)

     

    对多边形A1A2A3、、、An(顺或逆时针都可以),设平面上有任意的一点P,则有:
    S(A1,A2,A3,、、、,An)
    = abs(S(P,A1,A2) + S(P,A2,A3)+、、、+S(P,An,A1))


    P是可以取任意的一点,用(0,0)时就是下面的了:


    设点顺序 (x1 y1) (x2 y2) ... (xn yn)
    则面积等于
                     |x1 y1|      |x2 y2|                |xn yn|
    0.5 * abs( |         | +  |         | + ...... +  |         | )
                     |x2 y2|      |x3 y3|                |x1 y1|


    其中
    |x1 y1|
    |         |=x1*y2-y1*x2
    |x2 y2|
    因此面积公式展开为:

                     |x1 y1|     |x2 y2|               |xn yn|
    0.5 * abs( |         | + |         | + ...... + |         | )=0.5*abs(x1*y2-y1*x2+x2*y3-y2*x3+...+xn*y1-yn*x1)
                     |x2 y2|     |x3 y3|               |x1 y1|

    展开全文
  • 多边形分割三角形容易证得上述公式 计算面积用叉积,计算边上格点数用欧几里德算法gcd(a,b) 对于线段(x1,y1)(x2,y2)线段上的格点数为gcd(x2-x1,y2-y1) 类似的一个题 用到了欧拉函数 求坐标系内的不同整数...

    POJ1265给定一个多边形 计算边上的格点 内部的格点 以及多边形的面积

    利用Pick公式 

    面积=内部格点数+边上格点数/2-1

    将多边形分割为三角形容易证得上述公式

    计算面积用叉积,计算边上格点数用欧几里德算法gcd(a,b)

    对于线段(x1,y1)(x2,y2)线段上的格点数为gcd(x2-x1,y2-y1)

    类似的一个题 用到了欧拉函数 求坐标系内的不同整数方向 POJ3090

    给出代码

    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    #include<queue>
    #include<vector>
    using namespace std;
    
    const double eps=1e-9;
    
    int cmp(double x)
    {
     if(fabs(x)<eps)return 0;
     if(x>0)return 1;
     	else return -1;
    }
    
    const double pi=acos(-1.0);
    
    inline double sqr(double x)
    {
     return x*x;
    }
    
    
    
    
    
    
    struct point
    {
     double x,y;
     point (){}
     point (double a,double b):x(a),y(b){}
     void input()
     	{
     	 scanf("%lf%lf",&x,&y);
    	}
     friend point operator +(const point &a,const point &b)
     	{
     	 return point(a.x+b.x,a.y+b.y);
    	}	
     friend point operator -(const point &a,const point &b)
     	{
     	 return point(a.x-b.x,a.y-b.y);
    	}
     friend bool operator ==(const point &a,const point &b)
     	{
     	 return cmp(a.x-b.x)==0&&cmp(a.y-b.y)==0;
    	}
     friend point operator *(const point &a,const double &b)
     	{
     	 return point(a.x*b,a.y*b);
    	}
     friend point operator*(const double &a,const point &b)
     	{
     	 return point(a*b.x,a*b.y);
    	}
     friend point operator /(const point &a,const double &b)
     	{
     	 return point(a.x/b,a.y/b);
    	}
     double norm()
     	{
     	 return sqrt(sqr(x)+sqr(y));
    	}
    };
    
    struct line
    {
     point a,b;
     line(){};
     line(point x,point y):a(x),b(y)
     {
     	
     }
    };
    double det(const point &a,const point &b)
    {
     return a.x*b.y-a.y*b.x;
    }
    
    double dot(const point &a,const point &b)
    {
     return a.x*b.x+a.y*b.y; 
    }
    
    double dist(const point &a,const point &b)
    {
     return (a-b).norm();
    }
    
    point rotate_point(const point &p,double A)
    {
     double tx=p.x,ty=p.y;
     return point(tx*cos(A)-ty*sin(A),tx*sin(A)+ty*cos(A));
    }
    
    
    
    
    bool parallel(line a,line b)
    {
     return !cmp(det(a.a-a.b,b.a-b.b));
    }
    
    bool line_joined(line a,line b,point &res)
    {
     if(parallel(a,b))return false;
     double s1=det(a.a-b.a,b.b-b.a);
     double s2=det(a.b-b.a,b.b-b.a);
     res=(s1*a.b-s2*a.a)/(s1-s2);
     return true;
    }
    
    bool pointonSegment(point p,point s,point t)
    {
     return cmp(det(p-s,t-s))==0&&cmp(dot(p-s,p-t))<=0;
    }
    
    void PointProjLine(const point p,const point s,const point t,point &cp)
    {
     double r=dot((t-s),(p-s))/dot(t-s,t-s);
     cp=s+r*(t-s);
    }
    
    
    struct polygon_convex
    {
     vector<point>P;
     polygon_convex(int Size=0)
     	{
     	 P.resize(Size);
    	}	
    };
    
    bool comp_less(const point &a,const point &b)
    {
     return cmp(a.x-b.x)<0||cmp(a.x-b.x)==0&&cmp(a.y-b.y)<0;
     
    }
    
    
    polygon_convex convex_hull(vector<point> a)
    {
     polygon_convex res(2*a.size()+5);
     sort(a.begin(),a.end(),comp_less);
     a.erase(unique(a.begin(),a.end()),a.end());//删去重复点 
     int m=0;
     for(int i=0;i<a.size();i++)
     	{
     	 while(m>1&&cmp(det(res.P[m-1]-res.P[m-2],a[i]-res.P[m-2]))<=0)--m;
     	 res.P[m++]=a[i];
    	}
     int k=m;
     for(int i=int(a.size())-2;i>=0;--i)
     	{
     	 while(m>k&&cmp(det(res.P[m-1]-res.P[m-2],a[i]-res.P[m-2]))<=0)--m;
     	 res.P[m++]=a[i];
    	}
     res.P.resize(m);
     if(a.size()>1)res.P.resize(m-1);
     return res;
    }
    
    bool is_convex(vector<point> &a)
    {
     for(int i=0;i<a.size();i++)
     	{
     	 int i1=(i+1)%int(a.size());
     	 int i2=(i+2)%int(a.size());
     	 int i3=(i+3)%int(a.size());
     	 if((cmp(det(a[i1]-a[i],a[i2]-a[i1]))*cmp(det(a[i2]-a[i1],a[i3]-a[i2])))<0)
    	  	return false;
    	}
     return true;
    }
    int containO(const polygon_convex &a,const point &b)
    {
     int n=a.P.size();
     point g=(a.P[0]+a.P[n/3]+a.P[2*n/3])/3.0;
     int l=0,r=n;
     while(l+1<r)
     	{
     	 int mid=(l+r)/2;
     	 if(cmp(det(a.P[l]-g,a.P[mid]-g))>0)
     	 	{
     	 	 if(cmp(det(a.P[l]-g,b-g))>=0&&cmp(det(a.P[mid]-g,b-g))<0)r=mid;
     	 	 	else l=mid;
    		}else
    			{
    			 if(cmp(det(a.P[l]-g,b-g))<0&&cmp(det(a.P[mid]-g,b-g))>=0)l=mid;
     	 	 		else r=mid;	
    			}
    	} 
     r%=n;
     int z=cmp(det(a.P[r]-b,a.P[l]-b))-1;
     if(z==-2)return 1;
     return z;	
    }
    
    bool circle_in_polygon(point cp,double r,polygon_convex &pol)
    {
    
     polygon_convex pp=convex_hull(pol.P);
     if(containO(pp,cp)!=1)return false;
     for(int i=0;i<pol.P.size();i++)
     	{
     	 int j;
     	 if(i<pol.P.size()-1)j=i+1;
     	 	else j=0;
     	 point prol;
     	 PointProjLine(cp,pol.P[i],pol.P[j],prol);
     	 double dis;
     	 if(pointonSegment(prol,pol.P[i],pol.P[j]))dis=dist(prol,cp);
     	 	else dis=min(dist(cp,pol.P[i]),dist(pol.P[j],cp));
     	 if(cmp(dis-r)==-1)return false;
    	}
     return true;
    }
    
    const int maxn=1e+6;
    
    point po[maxn+10];
    
    double area(point a[],int n)
    {
     double sum=0;
     a[n]=a[0];
     for(int i=0;i<n;i++)
     	sum+=det(a[i+1],a[i]);
     	return sum/2.;
    }
    
    int Point_in(point a[],int n,point t)
    {
     int num=0,i,d1,d2,k;
     a[n]=a[0];
     for(int i=0;i<n;i++)
     	{
     	 if(pointonSegment(t,a[i],a[i+1]))return 2;
     	 k=cmp(det(a[i+1]-a[i],t-a[i]));
     	 d1=cmp(a[i].y-t.y);
     	 d2=cmp(a[i+1].y-t.y);
     	 if(k>0&&d1<=0&&d2>0)num++;
     	 if(k<0&&d2<=0&&d1>0)num--;
    	}
     return num!=0;
    }
    
    point pp[100];
    int GCD(int a,int b)//Euclid 
    {
     return b==0?a:GCD(b,a%b);
    }
    int Border_point_num(point a[],int n)
    {
     int num=0;
     a[n]=a[0];
     for(int i=0;i<n;i++)
     	 num+=GCD(abs(int(a[i+1].x-a[i].x)),abs(int(a[i+1].y-a[i].y)));
     return num;
    }
    
    int Inside_point_num(point a[],int n)
    {
     return int(-area(a,n))+1-Border_point_num(a,n)/2;
    }
    
    int main()
    {freopen("t.txt","r",stdin);
     int T;
     scanf("%d",&T);
     for(int ii=1;ii<=T;ii++)
     	{if(ii>1)printf("\n");printf("Scenario #%d:\n",ii);
     	 int n;
     	 scanf("%d",&n);
     	 pp[0].input();
     	 for(int i=1;i<n;i++)
     	 	{
     	 	 pp[i].input();
     	 	 pp[i]=pp[i]+pp[i-1];
    		}
    	 printf("%d %d %.1lf\n",Inside_point_num(pp,n),Border_point_num(pp,n),-area(pp,n));
    	}
     return 0;
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
     
    

      

     

    转载于:https://www.cnblogs.com/heisenberg-/p/6688600.html

    展开全文
  • 多边形的面积

    2019-09-20 17:50:04
    这是一道典型的求一个凸多边形面积的题,对于求解凸多边形面积,通常的思路就是将该多边形分割成多个可解的简单多边形,例如三角形或者矩形。 对于连续和非连续的分布,分别可以采用积分法和三角形点分割的方式进行...

    1553421-20181213164219082-645120495.png

    这是一道典型的求一个凸多边形面积的题,对于求解凸多边形面积,通常的思路就是将该多边形分割成多个可解的简单多边形,例如三角形或者矩形。
    对于连续和非连续的分布,分别可以采用积分法和三角形点分割的方式进行求解。
    对于本题,易知是多个非连续的点集合,而且点的排序方式为逆时针,这是一个非常关键的假设,根据该假设我们可以把该多边形一次分割成多个相邻的不重叠三角形,再利用三角形面积公式递归求解

    1553421-20181213164237609-976360204.png

    上图是分割的一个示例图,通过一次分割,可将原凸七边形分割成5个相邻的三角形,接下来我们引入通过三顶点坐标求解三角形面积的公式:
    若已知一个三角形的三个顶点坐标分别为: (x1,y1)(x2,y2)(x3,y3) 则该三角形的面积可以表示为:

    1553421-20181213164329014-1434772249.png

    #include<stdio.h>
    int main()
    {
        int n,i;
        double s,f[100][2]; 
        while(~scanf("%d",&n)&&n)
        {
            double s=0.0;
             for(i=0;i<n;i++)
             {
                scanf("%lf %lf",&f[i][0],&f[i][1]);     
             }
             for(i=2;i<n;i++)
             {
                s=s+((f[i-1][0]-f[0][0])*(f[i][1]-f[0][1])-(f[i][0]-f[0][0])*(f[i-1][1]-f[0][1]));
             }
             s=s/2.0;
             printf("%.1lf\n",s);
        }
        return 0;
    }

    转载于:https://www.cnblogs.com/tianming1/p/10114923.html

    展开全文
  • 多边形内角计算公式与半径无关  要已知正多边形边数为N 内角和=180(N-2)  ...五边形以上的就分割成等边三角形再算  内角和公式——(n-2)*180`  我们都知道已知A(x1,y1)、B(x2,y2)、C(x3,y3)
  • 计算多边形面积

    千次阅读 2019-08-11 02:52:06
    对于规则多边形,矩形、梯形、平行四边形、三角形(根据三边长度,利用公式计算),可以通过公式计算其面积,而对于一般意义的多边形(单一多边形、不包含“洞”),怎么计算面积呢,先想到是分割三角形,但是程序...
  • 通过多边形各顶点坐标可以求得各边长,再采用海伦公式,计算分割后的小三角形的面积。 海伦公式如下: 假设在平面内,有一个三角形,边长分别为a、b、c,三角形的面积S可由以下公式求得: S=sqrt(p(p-a)(p...
  • 方法:利用向量叉积求三角形面积的方法,把多边形分割成若干个三角形,然后求和得到多边形面积,计算时需要注意,给定的点的顺序必须是逆时针或者顺时针。 逆时针的方向是叉积的正方向,顺时针是叉积的负方向。 ...
  • 思路 分治算法中的最优子结构 对输入的n个顶点来说,只用得到这n个顶点中的三个顶点,使其构成的三角形周长之和最小,其他的就啥也不用管,进行下...分割的情况1:分成了一个三角形和一个多边形 分割的情况2:分成...
  • 这是一道典型的求一个凸多边形面积的题,对于求解凸多边形面积,通常的思路就是将该多边形分割成多个可解的简单多边形,例如三角形或者矩形。 对于连续和非连续的分布,分别可以采用积分法和三角形点分割的方式...
  • hdu2036 求多边形面积

    2013-08-03 11:37:04
    可以选其任意一顶点与其他的顶点连线,把多边形分割成很多的小三角形。在计算几何中我们知道,三角形面积可以用其边向量的叉乘来求,向量的叉乘即是它们坐标的行列式。将这个行列式展开就可以得到以三角行顶点坐标为...
  • 根据各顶点坐标求多边形面积

    千次阅读 2015-01-20 13:44:38
    1:可将多边形分割成多个三角形(如果不是按逆时针或顺时针给定顺序的定点需要进行排序),利用海伦公式,求得面积,但不适用于凹多边形,例如 HDU 2036. 海伦公式如下:已知三角形各边a,b,c S=sqrt(p(p-a)(p-b)...
  • 2:可将多边形分割成多个三角形(如果不是按逆时针或顺时针给定顺序的定点需要进行排序),利用海伦公式,求得面积,但不适用于凹多边形,例如 HDU 2036. 海伦公式如下:已知三角形各边a,b,c S=sqrt(p(p-a)(p-b)...
  • 任意多边形的面积计算

    万次阅读 多人点赞 2016-04-12 09:56:48
    任意给出一个三角形ΔABC,设其顶点坐标分别为A(x1, y1),B(x2, y2),C(x3, y3),那么根据线性代数的知识,Δ...我们知道任意的多边形都可以分割成多个三角形,根据以上三角形面积公式就可以求出任意多边形的面
  • 那么多边形重心就是若干个三角形的重心带权求中心,可以用质点质心公式。 #include <cstdio> #include <iostream> #include <algorithm> #include <vector> #include <cstring>...
  • 题目大意: 让你输入一个n边形的n个点的坐标,要你求这个... 用叉积的思想把多边形分割成多个小三角形,就可以搞定啦。 贴公式:C=sigma(Ai * Ci) / A (i=1…N) Ci=Centroid(△ O Pi Pi+1) = (O + ↑Pi +↑P...
  • 给予一个多边形,对其进行三角分割后最大的那个三角形的面积最小值为多少。 像这种肯定是中的一种,贪心么没什么直观的规律用不了,搜索的话虽然多边形的点少(3 嘛,用DP的时候直接就想成dp[L][R]代表从第L个顶点...
  • 数学_简述积分原理

    千次阅读 2018-12-20 18:55:03
    积分的实际上就是求面积,像正方形、长方形等都有其求面积公式,一些正多边形也可以拆分成几个三角形和矩形的和,但是对于一些不规则的面积求解就存在难度,但实际上也是可以通过分割的方法无限逼近的。 1、用无限...
  • 6.2 博弈 SG函数 局势分割 141 7.数据结构 142 7.1 TRIE 142 7.2 线段树 147 7.3 并查集 151 7.4 树状数组 152 7.5 点树 154 7.6 STL 156 7.7 离散化 157 8.图论 158 8.0 2-SAT 158 8.2 寻找Euler回路 163 8.3 拓扑...
  • c语言经典案例

    2014-10-30 08:06:57
    实例253 文件分割 382 实例254 文件加密 384 实例255 自毁程序 386 实例256 明码序列号保护 388 实例257 非明码序列号保护 389 实例258 恺撒加密 391 实例259 RSA加密 394 实例260 获取当前磁盘空间信息 396 实例261...

空空如也

空空如也

1 2
收藏数 21
精华内容 8
关键字:

多边形分割三角形公式