一道比较简单但是繁琐的三维计算几何,找错误找的我好心酸,没想到就把一个变量给写错了 = =;

题目的意思是求平面切长方体的截面面积+正方体顶部所遮盖的面积;

找出所有的切点,然后二维凸包一下直接算面积即可!

发个代码纪念一下!

代码:

 #include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define eps 1e-8
using namespace std; inline int sig(double x){return (x>eps)-(x<-eps);}
double w,l,hh,aa,bb,cc,dd;
int num1,num2;
struct point
{
double x,y,z;
point(double x=,double y=,double z=):x(x),y(y),z(z) { }
bool operator < (const point &t)const
{
if(sig(x-t.x)==)
{
return y<t.y;
}
else return x<t.x;
}
point operator+(const point&b)const{return point(x+b.x,y+b.y,z+b.z);}
point operator-(const point&b)const{return point(x-b.x,y-b.y,z-b.z);}
point operator*(double p){return point(x*p,y*p,z*p);}
point operator/(double p){return point(x/p,y/p,z/p);}
} ve[],tu[],vv[],tt[]; void intersection(point a,point b)
{
double t=(aa*a.x+bb*a.y+cc*a.z+dd)/(aa*(a.x-b.x)+bb*(a.y-b.y)+cc*(a.z-b.z));
if(t>=-eps&&t<=1.00000+eps)
{
point v=a+(b-a)*t;
ve[num1++]=v;
if(sig(v.z-hh)==)
tu[num2++]=v;
}
}
double lenth(point a){return sqrt(a.x*a.x+a.y*a.y+a.z*a.z);}
point cross(point a,point b){return point(a.y*b.z-a.z*b.y,a.z*b.x-a.x*b.z,a.x*b.y-a.y*b.x);}
double area(point a,point b,point c){return lenth(cross(b-a,c-a))/2.0;}
double cross2(point a,point b){return a.x*b.y-a.y*b.x;}
bool check(point a)
{
if(sig(aa*a.x+bb*a.y+cc*a.z+dd)<)
return ;
return ;
} int convexhull(point *p,int n,point* ch)
{
sort(p,p+n);
int m=;
for(int i=;i<n;i++)
{
while(m>&&cross2(ch[m-]-ch[m-],p[i]-ch[m-])<=eps)m--;
ch[m++]=p[i];
}
int k=m;
for(int i=n-;i>=;i--)
{
while(m>k&&cross2(ch[m-]-ch[m-],p[i]-ch[m-])<=eps)m--;
ch[m++]=p[i];
}
if(n>)m--;
return m;
} int main()
{
int t,ca;
scanf("%d",&t);
while(t--)
{
memset(tu,,sizeof tu);
memset(ve,,sizeof ve);
memset(vv,,sizeof vv);
memset(tt,,sizeof tt);
scanf("%d",&ca);
printf("%d ",ca);
scanf("%lf%lf%lf%lf%lf%lf%lf",&l,&w,&hh,&aa,&bb,&cc,&dd);
num1=num2=;
dd=-dd;
point a(0.0,0.0,0.0);
point b(l,0.0,0.0);
point c(l,w,0.0);
point d(0.0,w,0.0);
point e(0.0,0.0,hh);
point f(l,0.0,hh);
point g(l,w,hh);
point h(0.0,w,hh);
intersection(a,b);
intersection(b,c);
intersection(c,d);
intersection(d,a);
intersection(a,e);
intersection(b,f);
intersection(c,g);
intersection(d,h);
intersection(e,f);
intersection(f,g);
intersection(g,h);
intersection(h,e);
if(check(e)==)tu[num2++]=e;
if(check(f)==)tu[num2++]=f;
if(check(g)==)tu[num2++]=g;
if(check(h)==)tu[num2++]=h;
int x=convexhull(ve,num1,vv);
int y=convexhull(tu,num2,tt);
double ans=;
for(int i=;i<x;i++)
ans+=area(vv[],vv[i-],vv[i]);
for(int i=;i<y;i++)
ans+=area(tt[],tt[i-],tt[i]);
printf("%.0lf\n",ceil(ans));
}
return ;
}

【2011 Greater New York Regional 】Problem I :The Golden Ceiling的更多相关文章

  1. 【2011 Greater New York Regional 】Problem G: Rancher's Gift

    计算几何的题目,很简单: 自己随手敲了个,纪念下! #include<cstdio> #include<cmath> using namespace std; struct p ...

  2. 【2011 Greater New York Regional 】Problem H: Maximum in the Cycle of 1

    也是一个数学题: 主要用到的是排列组合的知识,推推公式就行了,挺简单的: 唯一要注意的是A(0,0)=1: 在这个上面WA了几次,= = 代码: #include<stdio.h> #de ...

  3. 【2011 Greater New York Regional 】Problem B The Rascal Triangle

    一个简单的规律题,每一列都是一个等差数列: 代码: #include<cstdio> #define ll long long using namespace std; int main( ...

  4. Poj(2407),Greater New York Regional 2015 (D)

    题目链接:http://poj.org/problem?id=2407 Relatives Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  5. 【2011集训贾志鹏】Crash 的数字表格

    题面 题目分析 (默认\(n<m\)) 题目要求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)\). 由\(lcm(i,j)=\frac{i\c ...

  6. [NOIp 1998 提高组]Probelm 2 连接多位数【2011百度实习生笔试题】

    /*====================================================================== [NOIp 1998 提高组]Probelm 2 连接 ...

  7. 【贪心+中位数】【新生赛3 1007题】 Problem G (K)

    Problem G Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Sub ...

  8. 【2011图灵奖得主】我眼中的Judea Pearl

    [2011图灵奖得主]我眼中的Judea Pearl 来源: 叶星遥的日志 2011年的图灵奖花落UCLA计算机系的Judea Pearl教授.图灵奖是计算领域的最高奖,由于近年来这个领域的兴盛也算是 ...

  9. 【BZOJ2998】Problem A(动态规划)

    [BZOJ2998]Problem A(动态规划) 题面 BZOJ 题解 一个人的成绩范围可以确定为一个区间 这样就变成了 选择若干区间,不重合, 每个区间有个权值,求最大权值和 这样就可直接\(dp ...

随机推荐

  1. c# 枚举基础有[flags]和没有的的区别

    枚举提供成组的常数值,它们有助于使成员成为强类型以及提高代码的可读性.在 C# 中,使用 enum 来声明枚举. 枚举分为简单枚举和标志枚举两种. 基本语法示例 enum Day { Sun, Mon ...

  2. Github + Hexo 搭建博客

    服务加速 brew 加速 http://blog.suconghou.cn/post/homebrew-speedup/ github加速 http://www.selfrebuild.net/201 ...

  3. java.sql.SQLException: Before start of result set

    在使用JDBC查询数据库报了这么一个错误 CREATE TABLE `d_user` ( `id` int(10) NOT NULL, `name` varchar(10) DEFAULT NULL, ...

  4. netMVC 搭建Ucenter 同步登陆退出discuz

    先看一下效果

  5. Kettle中通过触发器方式实现数据 增量更新

    在使用Kettle进行数据同步的时候, 共有 1.使用时间戳进行数据增量更新 2.使用数据库日志进行数据增量更新 3.使用触发器+快照表 进行数据增量更新 今天要介绍的是第3中方法. 实验的思路是这样 ...

  6. 四、使用Maven和使用Eclipse构建javaWeb项目

    环境前边已经搭建过了,我们就再弄了. 1.使用Maven构建javaWeb项目 (1).键入以下命令: $ mvn archetype:generate -DgroupId=com.holytax.w ...

  7. Ext.Net学习笔记13:Ext.Net GridPanel Sorter用法

    Ext.Net学习笔记13:Ext.Net GridPanel Sorter用法 这篇笔记将介绍如何使用Ext.Net GridPanel 中使用Sorter. 默认情况下,Ext.Net GridP ...

  8. struts 文件上传下载

    上传 1.编写上传action类 UploadAction.java package jxf.b_upload; import java.io.File; import java.io.IOExcep ...

  9. UVA 11729 - Commando War(贪心 相邻交换法)

    Commando War There is a war and it doesn't look very promising for your country. Now it's time to ac ...

  10. 【C++11】新特性——Lambda函数

    本篇文章由:http://www.sollyu.com/c11-new-lambda-function/ 文章列表 本文章为系列文章 [C++11]新特性--auto的使用 http://www.so ...