日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

HDOJ(1115)多边形重心

發(fā)布時(shí)間:2025/3/13 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDOJ(1115)多边形重心 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Lifting the Stone

http://acm.hdu.edu.cn/showproblem.php?pid=1115

題目描述:輸入n個(gè)頂點(diǎn)(整數(shù)),求它們圍成的多邊形的重心。

算法:以一個(gè)點(diǎn)出發(fā),與其他非鄰點(diǎn)相連,將n邊形劃分成n-2個(gè)三角形。求每個(gè)三角形的質(zhì)點(diǎn)系重心(如:((x1+x2+x3)/3,(y1+y2+y3)/3)),再求出每個(gè)三角形的面積。相乘求和后除以多邊形面積)。

注意:we connect the points in the given order。輸入的順序,要么是順時(shí)針,要么是逆時(shí)針。

#include <iostream> #include <iomanip> #include <vector> using namespace std; struct Node //頂點(diǎn)或向量結(jié)構(gòu) {int x;int y; }; vector<Node> node; int main() {int t,n;double cross_sum,x_sum,y_sum;cin>>t;while(t--){node.clear();cross_sum=0;x_sum=y_sum=0;cin>>n;for(int i=1;i<=n;i++){Node temp; //頂點(diǎn)cin>>temp.x>>temp.y;node.push_back(temp);}Node vec1,vec2; //向量vec1.x=node[1].x-node[0].x;vec1.y=node[1].y-node[0].y;for(int i=2;i<=n-1;i++){vec2.x=node[i].x-node[0].x;vec2.y=node[i].y-node[0].y;int cross=vec1.x*vec2.y-vec2.x*vec1.y;x_sum+=(double)(node[0].x+node[i-1].x+node[i].x)*cross;y_sum+=(double)(node[0].y+node[i-1].y+node[i].y)*cross;cross_sum+=cross;vec1=vec2;}double res_x=x_sum/(3*cross_sum);double res_y=y_sum/(3*cross_sum); //最后用除法,且少用除法,減少精度丟失cout<<fixed<<setprecision(2)<<res_x<<" "<<res_y<<endl;}return 0; } View Code

做了幾道計(jì)算幾何的題目,不得不說(shuō)向量是個(gè)好東西!!!是哪位神人發(fā)明的向量,膜拜。

?

下面是別人寫(xiě)的的求多邊形重心的方法:

線垂法:

  具體方法是:用細(xì)線提起該物體,在該物體上畫(huà)細(xì)線的延長(zhǎng)線,再移位用細(xì)線提起該物體,在該物體上畫(huà)細(xì)線的延長(zhǎng)線,兩線的交叉點(diǎn)就是這一物體在這平面上的重心,        其它面同理.適用于實(shí)際測(cè)量中。

?

定理法:(本人自己命名)
  定理1: 由兩個(gè)圖形A,B合并而成的一個(gè)圖形C,則C的重心必在A的重心與B的重心連接的線段上。(注意,也適用于A B彼此分開(kāi),沒(méi)有公共點(diǎn)的情形)
  定理2: 由兩個(gè)A,B合并而成的一個(gè)圖形C,A的重心為點(diǎn)a, B的重心為點(diǎn)b, C的重心為點(diǎn)c, A的面積為Sa, B的面積為Sb,則下面條件成立:
      (1)點(diǎn)c 必在線段 ab 上
      (2) ac * Sa = bc * Sb

計(jì)算幾何中:
    三角形的重心: x = (xa+xb+xc)/3, ?y = (ya+yb+yc)/3;
    四邊形的重心:作一對(duì)角線,將它分成兩個(gè)三角形分別求出重心與面積 (x1,y1) ,s1 ; (x2, y2), s2 則該四邊形的重心為: x = (x1*s1+x2*s2)/(s1+s2), y = (y1*s1+y2*s2)/(s1+s2);
    五邊形則分為一個(gè)三角形與一個(gè)四邊形……

    任意多邊形中直接取任一點(diǎn)(一般為原點(diǎn))把多邊形分為n-2個(gè)三角形 分別求重心
      x=∑ si * xi / ∑si
      y=∑ si * yi / ∑si
      si 為每塊三角形的有向面積?(就是向量叉積/2)

轉(zhuǎn)載于:https://www.cnblogs.com/chiry/p/3505949.html

總結(jié)

以上是生活随笔為你收集整理的HDOJ(1115)多边形重心的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。