题目描述

题解:

显然凸多面体投下来一定是个凸多边形。

对于$30$分,直接投到$x-y$平面上即可。

对于$100$分,考虑搞出平面的一般式方程$ax+by+cz+d=0$。

给出平面上三个点$A,B,C$,那么求$(B-A)$^$(C-A)$,得到向量$(a,b,c)$,

然后随便带一个点把$d$求出来即可。

接下来把所有凸多边形顶点投影到平面上,接下来向$x-y$投影。

$x-y$平面上算出的面积与所求面积成比例。

比值即为$S(A,B,C)/S(A_0,B_0,C_0)$,计算三角形面积用海伦公式即可。

没卡我精度好爽。

代码:

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const double eps = 1e-;
double A,B,C,D;
struct SPoint
{
double x,y,z;
SPoint(){}
SPoint(double x,double y,double z):x(x),y(y),z(z){}
SPoint operator - (const SPoint&a)const{return SPoint(x-a.x,y-a.y,z-a.z);}
SPoint operator ^ (const SPoint&a)const{return SPoint(y*a.z-z*a.y,z*a.x-x*a.z,x*a.y-y*a.x);}
void read(){scanf("%lf%lf%lf",&x,&y,&z);}
}a,b,c,a0,b0,c0;
struct Point
{
double x,y;
Point(){}
Point(double x,double y):x(x),y(y){}
bool operator < (const Point&a)const{return x!=a.x?x+eps<a.x:y+eps<a.y;}
Point operator - (const Point&a)const{return Point(x-a.x,y-a.y);}
double operator ^ (const Point&a)const{return x*a.y-y*a.x;}
}p[],v1[],v2[];
void init()
{
a.read(),b.read(),c.read();
a0=a,b0=b,c0=c;
a0.z=b0.z=c0.z=;
SPoint tmp = (b-a)^(c-a);
A=tmp.x,B=tmp.y,C=tmp.z;
D=-1.0*(A*a.x+B*a.y+C*a.z);
}
int n,t1,t2;
double xx,yy,zz;
void mov(double&x,double&y,double&z)
{
double dx = xx-x,dy = yy-y,dz = zz-z;
double k = -1.0*(A*x+B*y+C*z+D)/(A*dx+B*dy+C*dz);
x = x+k*dx;
y = y+k*dy;
z = z+k*dz;
}
double S(double a,double b,double c)
{
double P = (a+b+c)/2.0;
return sqrt(P*(P-a)*(P-b)*(P-c));
}
double sq(double x){return x*x;}
double L(SPoint a,SPoint b)
{
return sqrt(sq(a.x-b.x)+sq(a.y-b.y)+sq(a.z-b.z));
}
double K()
{
return S(L(a,b),L(a,c),L(b,c))/S(L(a0,b0),L(a0,c0),L(b0,c0));
}
int main()
{
init();
scanf("%lf%lf%lf",&xx,&yy,&zz);
scanf("%d",&n);
double x,y,z;
for(int i=;i<=n;i++)
{
scanf("%lf%lf%lf",&x,&y,&z);
mov(x,y,z);
p[i]=Point(x,y);
}
sort(p+,p++n);
for(int i=;i<=n;i++)
{
while(t1>&&((v1[t1]-v1[t1-])^(p[i]-v1[t1]))>=)t1--;
v1[++t1]=p[i];
while(t2>&&((v2[t2]-v2[t2-])^(p[i]-v2[t2]))<=)t2--;
v2[++t2]=p[i];
}
double ans = ;
for(int i=;i<=t1;i++)ans-=((v1[i-]-v1[])^(v1[i]-v1[i-]));
for(int i=;i<=t2;i++)ans+=((v2[i-]-v2[])^(v2[i]-v2[i-]));
printf("%.2lf\n",K()*ans/2.0);
return ;
}

loj6063 Shadow的更多相关文章

  1. 【shadow dom入UI】web components思想如何应用于实际项目

    回顾 经过昨天的优化处理([前端优化之拆分CSS]前端三剑客的分分合合),我们在UI一块做了几个关键动作: ① CSS入UI ② CSS作为组件的一个节点而存在,并且会被“格式化”,即选择器带id前缀 ...

  2. iOS 2D绘图 (Quartz2D)之阴影和渐变(shadow,Gradient)

    原博地址:http://blog.csdn.net/hello_hwc/article/details/49507881 Shadow Shadow(阴影) 的目的是为了使UI更有立体感,如图 sha ...

  3. CSS3 笔记三(Shadow/Text/Web Fonts)

    CSS3 Shadow Effects text-shadow box-shadow 1> text-shadow The text-shadow property adds shadow to ...

  4. Tutorial - Deferred Rendering Shadow Mapping 转

    http://www.codinglabs.net/tutorial_opengl_deferred_rendering_shadow_mapping.aspx Tutorial - Deferred ...

  5. linux用户和组管理,/etc/passwd 、/etc/shadow和/etc/group 文件内容解释

    与用户相关的系统配置文件主要有/etc/passwd 和/etc/shadow,其中/etc/shadow是用户资讯的加密文件,比如用户的密码口令的加密保存等: /etc/passwd 和/etc/s ...

  6. OpenGL阴影,Shadow Volumes(附源程序,使用 VCGlib )

    实验平台:Win7,VS2010 先上结果截图:    本文是我前一篇博客:OpenGL阴影,Shadow Mapping(附源程序)的下篇,描述两个最常用的阴影技术中的第二个,Shadow Volu ...

  7. OpenGL阴影,Shadow Mapping(附源程序)

    实验平台:Win7,VS2010 先上结果截图(文章最后下载程序,解压后直接运行BIN文件夹下的EXE程序): 本文描述图形学的两个最常用的阴影技术之一,Shadow Mapping方法(另一种是Sh ...

  8. /etc/passwd&/etc/shadow文件分析

    /etc/passwd该目录存储的是操作系统用户信息,该文件为所有用户可见.给linux系统添加一个帐号:useradd -g mysql -d /home/test -m test(:新建一个用户t ...

  9. shadow Dom(shadowRoot) 访问

    示例 gtx.shadowRoot.getElementById("translation") gtx为host对象 起因 抓去chorome谷歌翻译插架的内容.有信息的内容div ...

随机推荐

  1. 封装jQuery插件实现TAB切换

    先上效果图: 直接上代码: index.html <!DOCTYPE html> <html lang="en"> <head> <met ...

  2. Asp.net WebApi 异常处理解决方案

    一.使用异常筛选器捕获所有异常 我们知道,一般情况下,WebApi作为服务使用,每次客户端发送http请求到我们的WebApi服务里面,服务端得到结果输出response到客户端.这个过程中,一旦服务 ...

  3. MyBatsi-Mapper映射文件

    Mapper映射文件 cache – 给定命名空间的缓存配置. cache-ref – 其他命名空间缓存配置的引用. resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加 ...

  4. 167 Two Sum II - Input array is sorted 两数之和 II - 输入有序数组

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数.函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2.请注意,返回的下标值(i ...

  5. java中的compareto方法以及LIst列表排序的详细介绍【转】

    java中的compareto方法的详细介绍 javacompareTo  java中的compareto方法,返回参与比较的前后两个字符串的asc码的差值,看下面一组代码 String a=&quo ...

  6. props.children 和容器类组件

    有一类组件,充当了容器的作用,它定义了一种外层结构形式,然后你可以往里面塞任意的内容.这种结构在实际当中非常常见,例如这种带卡片组件: 组件本身是一个不带任何内容的方形的容器,我可以在用这个组件的时候 ...

  7. .net 音频转换 .amr 转 .mp3 (ffmpeg转换法)

    最近看来是跟声音干上了啊! 音频转换的第二种方法,这种方法相对第一种来说,要简单的多! 首先,你得下载个“ffmpeg.exe” 插件,然后把它放到你的项目中,如下图: 程序中会调用该文件,以助于转换 ...

  8. 通俗易懂的Nhibernate教程(2) ---- 配置之Nhibernate配置

    在上一个教程中,我们讲了Nhibernate的基本使用!So,让我们回顾下Nhibernate使用基本的步骤吧 1.NHibernate配置  ----- 这一步我们告诉了Nhibernate:数据库 ...

  9. 关于IE 对 $.get 缓存的记录

    最近在IE9中碰到一个问题是, 当我对某个角色进行修改的时候,再点击查询还是修改之前的内容,但是实际数据库已经修改成功,纠结了好一会儿之后,才发现是 $.get请求的问题. 因为  IE对get请求, ...

  10. CF983A Finite or not?

    思路: 如果p,q不互质,先把q除以p,q的最大公约数.接下来只要b中包含了所有q的质因子就可以了.可以在gcd(q, b) 不等于1的时候不断地用q除以gcd(q, b).最后如果q等于1,说明Fi ...