hdu 1115 计算多边形重心
生活随笔
收集整理的這篇文章主要介紹了
hdu 1115 计算多边形重心
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
三角形的重心公式是 x=(x1+x2+x3)/3 ?y=(y1+y2+y3)/3;
錯誤的推廣公式是“質點系重心公式”,即如果認為多邊形的質量僅分布在其頂點上,且均勻分布,則這個公式是對的。 l但是,現在多邊形的質量是均勻分布在其內部區域上的,也就是說,是與面積有關的!
求解方法 l剖分成N個三角形,分別求出其重心和面積,這時可以想象,原來質量均勻分布在內部區域上,而現在質量僅僅分布在這N個重心點上(等假變換),這時候就可以利用剛才的質點系重心公式了。 l不過,要稍微改一改,改成加權平均數,因為質量不是均勻分布的,每個質點代表其所在三角形,其質量就是該三角形的面積(有向面積!),——這就是權!
lC=sigma(Ai * Ci) / A???? (i=1…N)
本題目要注意精度的問題,除法無疑是最壞精度的所以盡量把除法運算放到最后。
#include<cstring> #include<cstdio> #include<iostream> using namespace std; struct point {double x,y; }p[1000005]; int main() {int t;scanf("%d",&t);while(t--){int n,i;scanf("%d",&n);for(i=0;i<n;i++) scanf("%lf %lf",&p[i].x,&p[i].y);p[n].x=p[0].x;p[n].y=p[0].y;double ansarea=0,ansx=0,ansy=0;for(i=0;i<n;i++){double temparea;temparea=(p[i].x*p[i+1].y-p[i].y*p[i+1].x);double tempx=((p[i].x+p[i+1].x+0)*1.0);double tempy=((p[i].y+p[i+1].y+0)*1.0);ansx+=tempx*temparea;ansy+=tempy*temparea;ansarea+=temparea;}printf("%.2lf %.2lf\n",ansx/ansarea/3.0,ansy/ansarea/3.0);} }
錯誤的推廣公式是“質點系重心公式”,即如果認為多邊形的質量僅分布在其頂點上,且均勻分布,則這個公式是對的。 l但是,現在多邊形的質量是均勻分布在其內部區域上的,也就是說,是與面積有關的!
求解方法 l剖分成N個三角形,分別求出其重心和面積,這時可以想象,原來質量均勻分布在內部區域上,而現在質量僅僅分布在這N個重心點上(等假變換),這時候就可以利用剛才的質點系重心公式了。 l不過,要稍微改一改,改成加權平均數,因為質量不是均勻分布的,每個質點代表其所在三角形,其質量就是該三角形的面積(有向面積!),——這就是權!
lC=sigma(Ai * Ci) / A???? (i=1…N)
本題目要注意精度的問題,除法無疑是最壞精度的所以盡量把除法運算放到最后。
#include<cstring> #include<cstdio> #include<iostream> using namespace std; struct point {double x,y; }p[1000005]; int main() {int t;scanf("%d",&t);while(t--){int n,i;scanf("%d",&n);for(i=0;i<n;i++) scanf("%lf %lf",&p[i].x,&p[i].y);p[n].x=p[0].x;p[n].y=p[0].y;double ansarea=0,ansx=0,ansy=0;for(i=0;i<n;i++){double temparea;temparea=(p[i].x*p[i+1].y-p[i].y*p[i+1].x);double tempx=((p[i].x+p[i+1].x+0)*1.0);double tempy=((p[i].y+p[i+1].y+0)*1.0);ansx+=tempx*temparea;ansy+=tempy*temparea;ansarea+=temparea;}printf("%.2lf %.2lf\n",ansx/ansarea/3.0,ansy/ansarea/3.0);} }
總結
以上是生活随笔為你收集整理的hdu 1115 计算多边形重心的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu 3812 Sea Sky 深搜+
- 下一篇: hdu 2036 计算多边形面积