【充满原题的胡策】训练2.26 T2(三维计算几何)
2018-02-26 15:42
447 查看
题目:
题解:
这道题目基本分为4个步骤:旋转地平面(100pts)
投影
求凸包
求面积
这个投影的过程其实不错,我只写了30pts的
代码:
#include <cstdio> #include <algorithm> using namespace std; const double INF=1e18; const double eps=1e-9; int dcmp(double x) { if (x<=eps && x>=-eps) return 0; return (x>0)?1:-1; } struct po { double x,y,z; po (double X=0,double Y=0,double Z=0){x=X; y=Y; z=Z;} }d[50005],sta[50005],light; int n,top;double ans; bool operator <(const po &a,const po&b){return a.x<b.x||(a.x==b.x&&a.y<b.y);} double cj(po x,po y){return x.x*y.y-x.y*y.x;} po operator -(po x,po y){return po(x.x-y.x,x.y-y.y);} void tb() { sort(d+1,d+n+1); top=0; for (int i=1;i<=n;i++) { while (top>1 && dcmp(cj(sta[top]-sta[top-1],d[i]-sta[top-1]))<=0) top--; sta[++top]=d[i]; } int k=top; for (int i=n-1;i>=1;i--) { while (top>k && dcmp(cj(sta[top]-sta[top-1],d[i]-sta[top-1]))<=0) top--; sta[++top]=d[i]; } if (n>1 f249 ) top--; } po ty(po a,po b) { double x,y,z; if(dcmp(a.x-b.x))x=a.x+a.z*(a.x-b.x)/(b.z-a.z); else x=a.x; if(dcmp(a.y-b.y))y=a.y+a.z*(a.y-b.y)/(b.z-a.z); else y=a.y; z=0; return po(x,y,z); } int main() { freopen("shadow.in","r",stdin); freopen("shadow.out","w",stdout); double x,y,z; for(int i=1;i<=3;i++)scanf("%lf%lf%lf",&x,&y,&z); scanf("%lf%lf%lf",&x,&y,&z); light=po(x,y,z); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%lf%lf%lf",&x,&y,&z); d[i]=ty(light,po(x,y,z)); } tb(); double ans=0; for(int i=3;i<=top;i++) ans+=cj(sta[i-1]-sta[1],sta[i]-sta[1])/2; if(ans<0) ans=-ans; printf("%0.2lf\n",ans); }
相关文章推荐
- 【充满原题的胡策】训练2.26 T1(线性基+讲解)
- 计算几何,三维向量的旋转
- 7-8月acm训练第一发(数论与计算几何)
- HDU 4617 Weapon 三维计算几何
- HDU 4741 Save Labman No.004 ( 三维计算几何 空间异面直线距离 )
- SGU 110 三维计算几何 向量的灵活运用
- HDU 4449 Building Design 第37届ACM/ICPC 金华赛区H题 (计算几何,三维凸包+空间坐标旋转+二维凸包)
- HDU 4617 Weapon (简单三维计算几何,异面直线距离)
- 三维计算几何模板[不定期更新]
- HDU 4617 Weapon (三维计算几何)
- hdu 1174:爆头(计算几何,三维叉积求点到线的距离)
- 三维计算几何模板--表面三角形个数 表面多边形个数 三维凸包 表面积 凸包重心 点到面的距离
- HDU 5839 Special Tetrahedron (三维计算几何)
- 计算几何三维模板
- 三维计算几何模板 hdu 5733 tetrahedron(不知为何WA)
- HDU 573 tetrahedron 三维计算几何(叉积, 四面体内切球)
- bzoj 1964: hull 三维凸包 计算几何
- 【BZOJ】【P1964】【hull 三维凸包】【题解】【计算几何】
- POJ 3528(计算几何+三维凸包表面积)
- POJ 计算几何专项训练(1) 【2318】&【2398】&【3304】&【2653】&【1556】&【1066】