zoukankan      html  css  js  c++  java
  • 【计算几何初步:多边形中心】【HDU1115】Lifting the Stone

    一.质点系重心公式

    x=(x1*m1+x2*m2+x3*m3.....xn*mn)/M  (M=m1+m2+m3+m4...+mn)

    二.三角形重心

    可直接求得,但在多边形剖分中 各三角形的质点的质量大小不一样 质量大小等于三角形面积.

    三.多边形重心

    三角形剖分+任意点的三角形剖分+三角形重心+质点系重心公式+任意点的三角形剖分

    所以很容易知道一种很优美的计算公式(看代码)

    #include <cstdio>  
    #include <cstdlib>  
    #include <cmath>  
    #include <cstring>  
    #include <ctime>  
    #include <algorithm>  
    #include <iostream>
    #include <sstream>
    #include <string>
    #define oo 0x13131313
    #define maxn 1000000+10
    using namespace std;
    struct point{
    	double x,y;
    };
    point A[maxn];
    int N;
    double ansX,ansY;
    double Sarea;
    void input()
    {
    	ansX=0;ansY=0;Sarea=0;
    	cin>>N;
    	for(int i=1;i<=N;i++)
    	{
    		scanf("%lf%lf",&A[i].x,&A[i].y);
    	}
    }
    void init()
    {
    	freopen("a.in","r",stdin);
    	freopen("a.out","W",stdout);
    }
    void get_Sarea()
    {
    	for(int i=1;i<=N;i++)
    	{
    		int j=i+1;
    		if(j==N+1) j=1;
    		Sarea+=(A[i].x*A[j].y-A[j].x*A[i].y)*0.5;
    	}
    }
    void get_ansXansY()
    {
    	for(int i=1;i<=N;i++)
    	{
    		int j=i+1;
    		if(j==N+1) j=1;
    		double area=(A[i].x*A[j].y-A[j].x*A[i].y)*0.5;
    		ansX+=area*(A[i].x+A[j].x); //  area*(A[i].x+A[j].x+0)/3 质点的重量  
    		ansY+=area*(A[i].y+A[j].y);
    	}
    	ansX=ansX/(3*Sarea);    
    	ansY=ansY/(3*Sarea);
    }
    int main()
    {
    	int T;
    	cin>>T;
    	while(T--)
    	{
    		input();
    		get_Sarea();
    		get_ansXansY();
    		printf("%.2lf %.2lf
    ",ansX,ansY);
    	}
    	return 0;
    }
      


  • 相关阅读:
    update 更改字段
    查看 links
    oracle 统计字段空值数
    查看oracle 数据库编码个格式
    oracle 数据库DBA权限
    一文弄懂 Golang 排序
    Golang Linux、Windows、Mac 下交叉编译
    go 简单封装数学运算包
    [Vue warn]: Unknown custom element: did you register the component correctly?
    深度图怎么看行情走势
  • 原文地址:https://www.cnblogs.com/zy691357966/p/5480429.html
Copyright © 2011-2022 走看看