题目描述

题解:

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

对于$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. hdoj3711【水】

    题意: 给你两个集合,对于每个B集合的元素,从A集合找一个数使得a^b的二进制的1个数最少. 思路: 直接搞= = #include <bits/stdc++.h> using names ...

  2. POJ2576【背包】

    题意: 每个人必须在一个团队或其他; 人对两支球队的数量不得超过1不同; 人们对各队的总重量应尽可能接近相等越好. 思路: 那么我求一个能接近最接近总和一半的值. 每个人的值就是物品,每个物品有且只有 ...

  3. Codeforces630C【水题】

    题意: 有一种数只会有7或者8构成,给一个n,问你前n位上有多少个这样的数. 思路: 对于一个 i 位,有2^i个数,然后前n项和就是2^(n+1)-2; 复习一下等比数列求和,等差数列求和吧; ①: ...

  4. java中常用到的math方法(Math.PI、Math.random()、Math.abs(double)、Math.floor(double)、Math.ceil(double)、Math.round(double))

    public class MathDemo { public static void main(String args[]){ /** * abs求绝对值 */ System.out.println( ...

  5. c#学习系列之装箱拆箱

    1.      装箱和拆箱是一个抽象的概念 2.      装箱是将值类型转换为引用类型 :拆箱是将引用类型转换为值类型       利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的 ...

  6. 06.NopCommerce配置邮箱账户

    NopCommerce如果配置让用户注册为通过邮箱注册,并且注册后激活邮箱才可登录,那么我们需要对NopCommerce的邮箱账户进行配置,用来发送邮件用.当然邮件还有很多其他用途,比如发送用户订阅的 ...

  7. LN : leetcode 215 Kth Largest Element in an Array

    lc 215 Kth Largest Element in an Array 215 Kth Largest Element in an Array Find the kth largest elem ...

  8. SIRI课程表

    wen 周一@0@{今天没课哦}周一 周二今天共一节课 第2节,可编程控制器应用,11号教学楼1 0 3房间 周二 周三今天共三节课 第二节,过程控制系统,2号楼2 1 0房间,第三节机械制造技术11 ...

  9. spark性能优化-JVM虚拟机垃圾回收调优

    1 2 3 4

  10. Entity Framework + MySQL 使用笔记

    添加: using (var edm = new NorthwindEntities()) { Customers c = ", Region = "天府广场", Con ...