您的位置:首页 > 其它

【充满原题的胡策】训练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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: