Prob_Solve 板


LINE

有人寫過這一題嗎?有什麼陷阱嗎? 這題是找 convex polygon 的質心 我用的方法是先做一次 Graham Scan 然後 v0v1v2, v0v2v3, v0v3v4, ..., v0vn-1vn 對每一個三角形,計算其面積,再加權至它的重心 最後 sum 起來再 Normalize 總面積即得此 convex polygon 的質心 不過 WA 了好幾次,不曉得是不是還有其他的陷阱? 謝謝各位。 -- 另,附我的程式碼如下: -- #include <stdio.h> #include <stdlib.h> #include <math.h> #define STDIN stdin #define MAX_V 102 /* 定義點的資料型態 */ typedef struct { int x,y; } t_point; /* 定義線的資料型態 */ typedef struct { t_point p1,p2; } t_line; /* 定義多邊形的資料型態 */ typedef struct { int n; t_point p[MAX_V]; } t_poly; t_point start_point; /* 檢查從p0到p1至p2是 counterclockwise(1) or clockwise(-1) */ int ccw(t_point p0, t_point p1, t_point p2) { return ( (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y) ); } /* 依逆時針方向將點排序 */ int sort_by_theta( const void *a, const void *b ) { int dx1,dy1,d1,adxy1,dx2,dy2,d2,adxy2; t_point p0,p1,p2; p0 = start_point; p1 = *(t_point *)a; p2 = *(t_point *)b; dx1=p1.x-p0.x; dy1=p1.y-p0.y; adxy1=abs(dx1)+abs(dy1); d1=dy1; dx2=p2.x-p0.x; dy2=p2.y-p0.y; adxy2=abs(dx2)+abs(dy2); d2=dy2; if (dx1<0) d1=2*adxy1-dy1; else if (dy1<0) d1=4*adxy1+dy1; if (dx2<0) d2=2*adxy2-dy2; else if (dy2<0) d2=4*adxy2+dy2; return (d1*adxy2-d2*adxy1); } /* Graham Scan */ int graham_scan(t_point p[], int n) { int i, M, min; t_point temp; for (min=0, i=1; i<n; i++) if (p[i].y < p[min].y) min=i; for (i=0; i<n; i++) if ( p[i].y == p[min].y && p[i].x < p[min].x ) min = i; temp = p[0]; p[0] = p[min]; p[min] = temp; start_point = p[0]; qsort((void *)&p[1], n-1, sizeof(t_point), sort_by_theta); for (M=2, i=3; i<n; i++) { while ( M > 0 ) { if (ccw(p[M-1],p[M],p[i])<=0) M--; else break; } M++; temp = p[M]; p[M] = p[i]; p[i] = temp; } return M+1; } /* 傳回某一多邊形之面積,除以 2.0 不做,因為最後會 Normalize 掉 */ double area(t_poly poly) { int i,A=0; poly.p[poly.n] = poly.p[0]; for (i=1;i<=poly.n;i++) A += poly.p[i-1].x*poly.p[i].y - poly.p[i].x*poly.p[i-1].y; return (double)A; } /* 計算某三角形之重心,除以 3.0 挪至 cal_center 再做 */ void cal_tri_center( t_poly pl, double *center_x, double *center_y ) { *center_x = ((double)(pl.p[0].x + pl.p[1].x + pl.p[2].x)); *center_y = ((double)(pl.p[0].y + pl.p[1].y + pl.p[2].y)); } /* 計算某多邊形之重心 */ void cal_center( t_poly pl, double *center_x, double *center_y ) { int i; double x, y, t_x, t_y, tri_area, total_area; t_poly tri_poly; x = y = total_area = 0.0; tri_poly.n = 3; tri_poly.p[0] = pl.p[0]; for(i=1; i<=pl.n-2; i++) { tri_poly.p[1] = pl.p[i]; tri_poly.p[2] = pl.p[i+1]; cal_tri_center( tri_poly, &t_x, &t_y); tri_area = area(tri_poly); x += tri_area*t_x; y += tri_area*t_y; total_area += tri_area; } *center_x = x / (total_area*(double)3.0); *center_y = y / (total_area*(double)3.0); } int main(void) { int i; t_poly poly; double center_x, center_y; while ( fscanf(STDIN,"%d",&(poly.n)) != EOF ) { if (poly.n < 3) break; for(i=0; i<poly.n; i++) fscanf(STDIN, "%d%d", &(poly.p[i].x), &(poly.p[i].y)); poly.n = graham_scan(poly.p, poly.n); cal_center(poly, &center_x, &center_y); printf("%.3lf %.3lf\n", center_x, center_y); } } --



※ 發信站: 批踢踢實業坊(ptt.csie.ntu.edu.tw)
◆ From: 211.74.25.112
1F:推 slimbody15:s 03/05 01:44







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP