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灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP