程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu1115(多邊形重心算法)

hdu1115(多邊形重心算法)

編輯:C++入門知識

hdu1115(多邊形重心算法)


題目意思:

給出一個n邊形的n個頂點,求出這個n邊形的重心坐標。

 

 

題目分析:

/**

 

*①質量集中在頂點上
* n個頂點坐標為(xi,yi),質量為mi,則重心
* X = ∑( xi×mi ) / ∑mi
* Y = ∑( yi×mi ) / ∑mi
* 特殊地,若每個點的質量相同,則
* X = ∑xi / n
* Y = ∑yi / n
*②質量分布均勻
* 特殊地,質量均勻的三角形重心:
* X = ( x0 + x1 + x2 ) / 3
* Y = ( y0 + y1 + y2 ) / 3
*③三角形面積公式:S = ( (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1) ) / 2 ;
*做題步驟:1、將多邊形分割成n-2個三角形,根據③公式求每個三角形面積。
* 2、根據②求每個三角形重心。
* 3、根據①求得多邊形重心。
**/

現在依據此算法給出兩種代碼,一種是將n個點,以其中一個點為標准,分成n-2個三角形,再進行求重心。

另一種是以原點為依據分成n+1個三角形,再進行求重心。

 

AC代碼:

第一種代碼:

#include
#include
#include
using namespace std;
struct Point{
double x,y;
};
double Area(Point p1,Point p2,Point p3){//叉乘求三角形面積
return ((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))/2;
}
int main()
{
int n,t;
scanf(%d,&t);
while(t--){
scanf(%d,&n);
Point p1,p2,p3;
double gx,gy,sumarea;
gx=gy=sumarea=0;
scanf(%lf%lf%lf%lf,&p1.x,&p1.y,&p2.x,&p2.y);
for(int i=2;i scanf(%lf%lf,&p3.x,&p3.y);
double area=Area(p1,p2,p3);//單個三角的面積
gx+=(p1.x+p2.x+p3.x)*area;//重心乘以其權值(面積),因為每一個都要除以3,所醫院放在最後
gy+=(p1.y+p2.y+p3.y)*area;
sumarea+=area;//計算所有權值
p2=p3;//替換p2,計算下一個三角形
}
gx=gx/sumarea/3;//求的多邊形重心
gy=gy/sumarea/3;
printf(%.2lf %.2lf ,gx,gy);
}
return 0;
}

第二種代碼:

#include
#include
#include
using namespace std;
struct Point{
double x,y;
}p[10005];
double Area(Point p1,Point p2,Point p3){//叉乘求三角形面積
return ((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))/2.0;
}
int main()
{
int n,t;
Point p0;
p0.x=p0.y=0.0;
scanf(%d,&t);
while(t--){
scanf(%d,&n);
double gx,gy,sumarea,area;
gx=gy=sumarea=0;
for(int i = 0; i < n; ++i)
scanf(%lf%lf, &p[i].x, &p[i].y);
for(int i=1;i<=n;i++){
area=Area(p0,p[i%n],p[i-1]);//與原點單個三角的面積
gx+=(p[i%n].x+p[i-1].x)*area;//重心乘以其權值(面積),因為每一個都要除以3,所醫院放在最後
gy+=(p[i%n].y+p[i-1].y)*area;
sumarea+=area;//計算所有權值
}
gx=gx/(sumarea*3);//求的多邊形重心
gy=gy/(sumarea*3);
printf(%.2lf %.2lf ,gx,gy);
}
return 0;
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved