程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 誰能告訴我為什麼sum_area輸出總是0(多邊形重心問題),sum_area重心

誰能告訴我為什麼sum_area輸出總是0(多邊形重心問題),sum_area重心

編輯:C++入門知識

誰能告訴我為什麼sum_area輸出總是0(多邊形重心問題),sum_area重心


多邊形重心問題

時間限制:3000 ms  |  內存限制:65535 KB 難度:5  
描述
在某個多邊形上,取n個點,這n個點順序給出,按照給出順序將相鄰的點用直線連接, (第一個和最後一個連接),所有線段不和其他線段相交,但是可以重合,可得到一個多邊形或一條線段或一個多邊形和一個線段的連接後的圖形; 
如果是一條線段,我們定義面積為0,重心坐標為(0,0).現在求給出的點集組成的圖形的面積和重心橫縱坐標的和;
 
輸入
第一行有一個整數0<n<11,表示有n組數據;
每組數據第一行有一個整數m<10000,表示有這個多邊形有m個頂點;
輸出
輸出每個多邊形的面積、重心橫縱坐標的和,小數點後保留三位;
樣例輸入
3
3
0 1
0 2
0 3
3
1 1
0 0
0 1
4
1 1
0 0
0 0.5
0 1
樣例輸出
0.000 0.000
0.500 1.000
0.500 1.000

#include<iostream>
#include<cmath>
#include<vector>
using namespace std;

struct Poit
{
double x;
double y;
};

double Area_3(Poit C,Poit A,Poit B);

int main()
{
int m;
cin>>m;

for(int i=0;i<m;i++)
{
int n;
cin>>n;

vector<Poit>a;
Poit G={0,0}; //G為重心
double sum_area=0; //總面積
double Gxy; //重心橫縱坐標和

for(int j=0;j<n;j++)
{
int x0,y0;
cin>>x0>>y0;
Poit p={x0,y0};
a.push_back(p);
}
for(int k=0;k<n;k++)
{
G.x=G.x+a[k].x;
G.y=G.y+a[k].y;
}

G.x=G.x/n;
G.y=G.y/n;
Gxy=G.x+G.y;

a.push_back(a[0]); //最後的和0重和;
for(int h=0;h<n;h++) //求總面積
{
sum_area=sum_area+Area_3(a[h],a[h+1],G);
}

cout<<sum_area<<" "<<Gxy<<endl;
}

return 0;

}

double Area_3(Poit C,Poit A,Poit B) //為了保證角A為銳角;B為重心;
{
double a,b,c;
double area;
a=sqrt(pow((B.x-C.x),2)+pow((B.y-C.y),2));
b=sqrt(pow((A.x-C.x),2)+pow((A.y-C.y),2));
c=sqrt(pow((A.x-B.x),2)+pow((A.y-B.y),2));

double cos_A=(pow(b,2)+pow(c,2)-pow(a,2))/(2*b*c);
double sin_A=abs(sqrt(1-pow(cos_A,2)));
area=0.5*b*c*sin_A;
return area;

}

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