1. 程式人生 > >HDU 1115(求質量均勻分布的多邊形重心 物理)

HDU 1115(求質量均勻分布的多邊形重心 物理)

三種 scanf code color sed turn tdi n-1 n)

題意是給一個 n 邊形,給出沿逆時針方向分布的各頂點的坐標,求出 n 邊形的重心。

求多邊形重心的情況大致上有三種:

一、多邊形的質量都分布在各頂點上,像是用輕桿連接成的多邊形框,各頂點的坐標為Xi,Yi,質量為mi,則重心坐標為:

  X = ∑( xi * mi ) / ∑ mi ;

  Y = ∑( yi * mi) / ∑ mi;

  若每個頂點的質量相等,則重心坐標為:

  X = ∑ xi / n;

  Y = ∑ yi / n;

二、多邊形的質量分布均勻,像是用密度相同的材料制成的多邊形板子,多采用將多邊形分割成 n - 2 個三角形,(個人喜歡以原點和多邊形逆時針方向上連續兩點作為每個三角形的三頂點,因為算面積使用的是向量叉乘,用原點可以減少對三角形兩邊向量的求解(直接用坐標即可),而叉乘得到的是有向面積,對結果並無影響)再求出每個三角形的重心:

  X = (x0 + x1 + x2) / 3;

  Y = (y0 + y1 + y2) / 3;

  再將各重心視作情況一處理即可

  要註意的是這種情況下並不是求三角形重心的簡單推廣,也就是說不能簡單的用不斷分割三角形求重心的方法去做

三、多邊形的質量分布不均勻,此時要用到積分的方法。

本題屬於第二種情況,所以按照第二種情況的處理方式處理即可。

技術分享圖片
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <iomanip>
 5
using namespace std; 6 7 struct point 8 { 9 double x,y; 10 }pi[1000010]; 11 double cp(point a,point b) 12 { 13 return (a.x*b.y)-(a.y*b.x); 14 } 15 point gravity(point *p, int n) 16 { 17 double area = 0; 18 point center; 19 center.x = center.y = 0; 20 for (int i = 0
; i < n-1; i++) 21 { 22 area += cp(p[i],p[i+1]); 23 center.x += cp(p[i],p[i+1]) * (p[i].x + p[i+1].x); 24 center.y += cp(p[i],p[i+1]) * (p[i].y + p[i+1].y); 25 /*此處其實是: 26 area += cp(p[i],p[i+1]) / 2; 27 center.x += (cp(p[i],p[i+1]) / 2)* ((p[i].x + p[i+1].x + 0) / 3); 28 center.y += (cp(p[i],p[i+1]) / 2)* ((p[i].y + p[i+1].y + 0) / 3); 29 但一些計算過程中的常數在實際運算時被總寫了。 30 */ 31 } 32 area += cp(p[n-1],p[0]);//area += cp(p[n-1],p[0]) / 2; 33 center.x += cp(p[n-1],p[0]) * (p[n-1].x + p[0].x);//center.x += (cp(p[n-1],p[0]) / 2) * ((p[n-1].x + p[0].x + 0) / 3); 34 center.y += cp(p[n-1],p[0]) * (p[n-1].y + p[0].y);//center.y += (cp(p[n-1],p[0]) / 2) * ((p[n-1].y + p[0].y + 0) / 3); 35 center.x /= 3*area;//center.x /= area; 36 center.y /= 3*area;//center.y /= area; 37 return center; 38 } 39 40 int main() 41 { 42 int t; 43 scanf("%d",&t); 44 while(t--) 45 { 46 int n; 47 scanf("%d",&n); 48 for(int i = 0; i < n; i++) 49 scanf("%lf %lf",&pi[i].x,&pi[i].y); 50 point out = gravity(pi,n); 51 printf("%.2f %.2f\n",out.x,out.y); 52 } 53 return 0; 54 }
View Code

  

HDU 1115(求質量均勻分布的多邊形重心 物理)