凸包和重心求法
来源:互联网 发布:mac see sheer和chili 编辑:程序博客网 时间:2024/05/16 05:02
/*==================================================*\
| Graham 求凸包 O(N * logN)
| CALL: nr = graham(pnt, int n, res); res[]为凸包点集;
\*==================================================*/
struct point { double x, y; };
bool mult(point sp, point ep, point op){
return (sp.x - op.x) * (ep.y - op.y)
>= (ep.x - op.x) * (sp.y - op.y);
}
bool operator < (const point &l, const point &r){
return l.y < r.y || (l.y == r.y && l.x < r.x);
}
int graham(point pnt[], int n, point res[]){
int i, len, k = 0, top = 1;
sort(pnt, pnt + n);
if (n == 0) return 0; res[0] = pnt[0];
if (n == 1) return 1; res[1] = pnt[1];
if (n == 2) return 2; res[2] = pnt[2];
for (i = 2; i < n; i++) {
while (top && mult(pnt[i], res[top], res[top-1]))
top--;
res[++top] = pnt[i];
}
len = top; res[++top] = pnt[n - 2];
for (i = n - 3; i >= 0; i--) {
while (top!=len && mult(pnt[i], res[top],
res[top-1])) top--;
res[++top] = pnt[i];
}
return top; // 返回凸包中点的个数
}
/*==================================================*\
| 求多边形重心
| INIT: pnt[]已按顺时针(或逆时针)排好序;
| CALL: res = bcenter(pnt, n);
\*==================================================*/
point bcenter(point pnt[], int n){
point p, s;
double tp, area = 0, tpx = 0, tpy = 0;
p.x = pnt[0].x; p.y = pnt[0].y;
for (int i = 1; i <= n; ++i) { // point: 0 ~ n-1
s.x = pnt[(i == n) ? 0 : i].x;
s.y = pnt[(i == n) ? 0 : i].y;
tp = (p.x * s.y - s.x * p.y); area += tp / 2;
tpx += (p.x + s.x) * tp; tpy += (p.y + s.y) * tp;
p.x = s.x; p.y = s.y;
}
s.x = tpx / (6 * area); s.y = tpy / (6 * area);
return s;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/nbu_james/archive/2010/11/07/5993259.aspx
- 凸包和重心求法
- uvalive4838(凸包+重心)
- 凸包求法
- 凸包求法
- 多边形重心求法
- 凸包+多边形重心模板
- HDU 3685 (凸包 重心)
- Asteroids (三维凸包+重心)
- 树的重心求法POJ3107
- hdu4273Rescue三维凸包的重心
- HDU 3685 Rotational Painting(凸包+重心)
- HDU 3685 (凸包重心)
- HDU 4273(计算几何+凸包重心)
- 凸包边上的点求法
- 树的重心求法+POJ 1655
- 三维集合之三维凸包,和求密度均匀的凸多面体的重心
- POJ 3862 Asteroids(两个三维凸包的重心到表面最短距离和)
- 凸包求法 POJ 1113 Wall 凸包
- [转载]Lucene.Net 按类别统计搜索结果数
- USB无线网卡在LT2440上的移植教程
- symbian的SQL语句
- 调试日志的使用
- 别对我撒谎:破解八种说谎手势
- 凸包和重心求法
- 清华校长送给毕业生的五句话
- symbian使用HookLogger检测内存泄漏
- Symbian C++描述符
- “创新工厂”最大的问题
- 获取IMEI串号
- 设计模式之观察者模式
- Symbian 学习笔记之一命名规范与数据类型
- 带字库12864显示矩形波 单片机