三维凸包裸题。

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. CSS overscroll-behavior

    overscroll-behavior新属性解决了在手机上弹出滚动的一些问题,具体内容查看网址:https://www.w3cplus.com/css/overscroll-behavior.html

  2. Linux嵌入式交叉编译环境 的搭建【转】

    转自:http://blog.csdn.net/woaixiaozhe/article/details/7395435 1. 安装标准的C开发环境,由于Linux安装默认是不安装的,所以需要先安装一下 ...

  3. Cloud Lab: 泰晓实验云台【转】

    转自:http://tinylab.org/cloud-lab/ 可快速构建的计算机课程在线实验平台 由 Wu Zhangjin 创建于 2017/10/06 评论 打赏 项目描述 泰晓实验云台 项目 ...

  4. MySQL分布式集群之MyCAT(三)rule的分析【转】

    首先写在最前面,MyCAT1.4的alpha版本已经发布了,这里面修复了不少的bug,也完善了一细节,之前两篇博客已经做了一些修改 ---------------------------------- ...

  5. static, const 和 static const 变量的初始化问题

    const 常量的在超出其作用域的时候会被释放,但是 static 静态变量在其作用域之外并没有释放,只是不能访问. static 修饰的是静态变量,静态函数.对于类来说,静态成员和静态函数是属于整个 ...

  6. Django 2.0.3安装-压缩包方式

    OS:Windows 10家庭中文版,CPU:Intel Core i5-8250U Python版本:Python 2.7,Python 3.6 Django版本:2.0.3(最新2.0.5) 解压 ...

  7. Shell脚本系列教程二: 开始Shell编程

    Shell脚本系列教程二: 开始Shell编程 2.1 如何写shell script? (1) 最常用的是使用vi或者mcedit来编写shell脚本, 但是你也可以使用任何你喜欢的编辑器; (2) ...

  8. day03作业

    ---恢复内容开始--- 1.+.-.*./.%.++.-- ①正号:②加法运算:③连接符 除法是两个数相除所得的结果,取余是除法操作的余数. ++前置表示现将一个数自加然后进行赋值,++后置表示先赋 ...

  9. web项目引入extjs小例子

    一个新的项目,前端用extjs实现!分享一下extjs开发的准备工作! 首先去下载extjs的资源包,这里我是随便在网上下载的! 打开之后 ,目录是这样的! 需要关注的几个文件夹: builds:压缩 ...

  10. C#socket编程序(一)

    在讲socket编程之前,我们先看一下最常用的一些类和方法,相信这些能让你事半功倍. 一.IP地址操作类 1.IPaddress类 a.在该类中有一个 parse()方法,能够把点分十进制IP地址 转 ...