三维凸包裸题。

1、通过volume计算有向体积,判断点与面的位置关系。

2、噪声

 /**************************************************************
Problem: 1209
User: idy002
Language: C++
Result: Accepted
Time:20 ms
Memory:1864 kb
****************************************************************/ #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#define eps 1e-10
#define N 1000
using namespace std; struct Vector {
double x, y, z;
void read() {
scanf( "%lf%lf%lf", &x, &y, &z );
}
Vector(){}
Vector( double x, double y, double z ):x(x),y(y),z(z){}
Vector operator+( const Vector &b ) const { return Vector(x+b.x,y+b.y,z+b.z); }
Vector operator-( const Vector &b ) const { return Vector(x-b.x,y-b.y,z-b.z); }
Vector operator*( double b ) const { return Vector(x*b,y*b,z*b); }
Vector operator/( double b ) const { return Vector(x/b,y/b,z/b); }
double operator&( const Vector &b ) const { return x*b.x+y*b.y+z*b.z; }
Vector operator^( const Vector &b ) const { return Vector(y*b.z-z*b.y,z*b.x-x*b.z,x*b.y-y*b.x); }
double len() { return sqrt(x*x+y*y+z*z); }
};
typedef Vector Point;
struct Face {
int p[];
Face(){}
Face( int a, int b, int c ) {
p[]=a, p[]=b, p[]=c;
}
};
typedef vector<Face> Convex; int n;
Point pts[N];
bool vis[N][N]; double rand01() {
return (double) rand()/RAND_MAX;
}
double randeps() {
return (rand01()-0.5)*eps;
}
void noise() {
for( int i=; i<n; i++ ) {
pts[i].x += randeps();
pts[i].y += randeps();
pts[i].z += randeps();
}
}
double volume( int p, int a, int b, int c ) {
return (pts[a]-pts[p])&((pts[b]-pts[a])^(pts[c]-pts[a]))/6.0;
}
bool cansee( Face &f, int p ) {
return volume(p,f.p[],f.p[],f.p[]) < 0.0;
}
Convex convex() {
static Point back[N];
for( int i=; i<n; i++ )
back[i] = pts[i];
noise(); int nt[] = { , , };
if( n<= ) return Convex(); Convex cur;
cur.push_back( Face(,,) );
cur.push_back( Face(,,) );
for( int i=; i<n; i++ ) {
Convex nxt;
for( int t=; t<cur.size(); t++ ) {
Face &f = cur[t];
bool see = cansee( f, i );
if( !see ) nxt.push_back(f);
for( int j=; j<; j++ )
vis[f.p[j]][f.p[nt[j]]] = see;
}
for( int t=; t<cur.size(); t++ ) {
Face &f = cur[t];
for( int j=; j<; j++ ) {
int a=f.p[j], b=f.p[nt[j]];
if( (vis[a][b]^vis[b][a]) && vis[a][b] )
nxt.push_back( Face(a,b,i) );
}
}
cur = nxt;
}
for( int i=; i<n; i++ )
pts[i] = back[i];
return cur;
}
void print( Convex &cvx ) {
fprintf( stderr, "%d\n", cvx.size() );
for( int t=; t<cvx.size(); t++ ) {
printf( "(%.0lf,%.0lf,%.0lf) (%.0lf,%.0lf,%.0lf) (%.0lf,%.0lf,%.0lf)\n",
pts[cvx[t].p[]].x, pts[cvx[t].p[]].y, pts[cvx[t].p[]].z,
pts[cvx[t].p[]].x, pts[cvx[t].p[]].y, pts[cvx[t].p[]].z,
pts[cvx[t].p[]].x, pts[cvx[t].p[]].y, pts[cvx[t].p[]].z );
}
}
double area( int a, int b, int c ) {
return ((pts[a]-pts[b])^(pts[a]-pts[c])).len() / 2.0;
} int main() {
scanf( "%d", &n );
for( int i=; i<n; i++ )
pts[i].read();
Convex cvx = convex(); // print( cvx ); double ans = 0.0;
for( int i=; i<cvx.size(); i++ )
ans += area( cvx[i].p[], cvx[i].p[], cvx[i].p[] );
printf( "%.6lf\n", ans );
}

bzoj 1209的更多相关文章

  1. bzoj 1209: [HNOI2004]最佳包裹 三维凸包

    1209: [HNOI2004]最佳包裹 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 160  Solved: 58[Submit][Status] ...

  2. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  3. Ural 1209. 1, 10, 100, 1000... 一道有趣的题

    1209. 1, 10, 100, 1000... Time limit: 1.0 secondMemory limit: 64 MB Let's consider an infinite seque ...

  4. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  5. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  6. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  7. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  8. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

  9. 【清华集训】楼房重建 BZOJ 2957

    Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...

随机推荐

  1. imperva 默认策略添加例外

    创建违规访问 检查违规的告警类型 假如客户的这个目录下真的有这个文件,而且客户非常明确这是一个正常且安全的东西怎么办?我该如何的将它添加到例外? 添加例外的步骤: 再次构造违规的请求: 默认策略添加例 ...

  2. Linux(Centos )的网络内核参数优化来提高服务器并发处理能力【转】

    简介 提高服务器性能有很多方法,比如划分图片服务器,主从数据库服务器,和网站服务器在服务器.但是硬件资源额定有限的情况下,最大的压榨服务器的性能,提高服务器的并发处理能力,是很多运维技术人员思考的问题 ...

  3. Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等

    http://blog.csdn.net/h7870181/article/details/8653865 以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后 ...

  4. Gradle设置代理

    在本地仓库路径下(如果没有修改的话默认C:\Users\用户名\.gradle),或者项目下,新建一个文件gradle.properties systemProp.http.proxyHost=网址 ...

  5. 在Eclipse使用Gradle

    1.Gradle安装 1.Grandle官网下载Gradle,地址:http://www.gradle.org/downloads 2.设置环境变量,需要设置如下2个环境变量 2.1添加GRADLE_ ...

  6. keras LSTM中间的dropout

    TM有三个 model.add(LSTM(100, dropout=0.2, recurrent_dropout=0.2)) 第一个dropout是x和hidden之间的dropout,第二个是hid ...

  7. Java字符串拼接效率对比

    1.来自:http://blog.csdn.net/Zen99T/article/details/51255418 2.来自:http://blog.csdn.net/kimsoft/article/ ...

  8. 【转】Python验证码识别处理实例

    原文出处: 林炳文(@林炳文Evankaka) 一.准备工作与代码实例 1.PIL.pytesser.tesseract (1)安装PIL:下载地址:http://www.pythonware.com ...

  9. Linux 命令find、grep

    本文就向大家介绍find.grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们.本文结构如下: find命令 find命令的一般形式 find命令的常用选项及实例 find与xar ...

  10. How to tell your iPhone application that location services are required | The Agile Warrior

    div{padding-bottom:10px}.b_vPanel>div:last-child{padding:0}.banner a{color:#1020d0} --> Below ...