博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3862 Asteroids三维凸包➕重心
阅读量:4205 次
发布时间:2019-05-26

本文共 6426 字,大约阅读时间需要 21 分钟。

下边是队友写的,另附上kuangbin大神魔板
#include
#include
#include
#include
#include
#define eps 1e-8#define N 110using namespace std;struct point{ double x,y,z; point() {} point(double xx,double yy,double zz): x(xx),y(yy),z(zz) {} point operator -(const point p) { return point(x-p.x, y-p.y, z-p.z); } point operator +(const point p) { return point(x+p.x, y+p.y, z+p.z); } point operator *(const point p) { return point(y*p.z-z*p.y, z*p.x-x*p.z, x*p.y-y*p.x); } point operator *(double p) { return point(x*p, y*p,z*p); } point operator /(double p) { return point(x/p, y/p,z/p); } double operator ^( point p) { return x*p.x+y*p.y+z*p.z; }};struct node{ struct face { int a,b,c; bool ok; }; int n; point tn[N]; int num; face F[8*N]; int g[N][N]; double vlen(point a) { return sqrt(a.x*a.x+a.y*a.y+a.z*a.z); } point cross(const point &a,const point &b,const point &c) { return point ( (b.y-a.y)*(c.z-a.z) - (b.z-a.z)*(c.y-a.y), (b.z-a.z)*(c.x-a.x) - (b.x-a.x)*(c.z-a.z), (b.x-a.x)*(c.y-a.y) - (b.y-a.y)*(c.x-a.x) ); } double area(point a,point b,point c) { return vlen((b*a)*(c-a)); } double volume(point a,point b,point c,point d) { return (b-a)*(c-a)^(d-a); } double dbcmp(point &p,face &f) { point m = tn[f.b] - tn[f.a]; point n = tn[f.c] - tn[f.a]; point t = p - tn[f.a]; return (m*n)^t; } void deal(int p,int a,int b) { int f = g[a][b]; face add; if(F[f].ok) { if(dbcmp(tn[p],F[f]) > eps) dfs(p,f); else { add.a=b; add.b=a; add.c=p; add.ok=true; g[p][b] = g[a][p] = g[b][a] =num; F[num++] = add; } } } void dfs(int p,int now) { F[now].ok = false; deal(p,F[now].b,F[now].a); deal(p,F[now].c,F[now].b); deal(p,F[now].a,F[now].c); } bool same(int s,int t) { point &a = tn[F[s].a]; point &b = tn[F[s].b]; point &c = tn[F[s].c]; return fabs( volume(a,b,c,tn[F[t].a])) < eps && fabs( volume(a,b,c,tn[F[t].b])) < eps && fabs( volume(a,b,c,tn[F[t].c])) < eps ; } void create() { int i,j,tmp; face add; num = 0; if(n<4) return ; bool flag =true; for(i=1; i
eps) { swap(tn[1],tn[i]); flag = false; break; } } if(flag) return ; flag =true; for(i=2; i
eps ) { swap(tn[2],tn[i]); flag =false; break; } } if(flag) return ; flag =true; for(i =3; i
eps ) { swap(tn[3],tn[i]); flag =false; break; } } if(flag) return ; for(i=0; i<4; i++) { add.a = (i+1)%4; add.b = (i+2)%4; add.c = (i+3)%4; add.ok = true; if(dbcmp(tn[i],add) > 0) { swap(add.b,add.c); } g[add.a][add.b] = g[add.b][add.c] = g[add.c][add.a] =num; F[num++]=add; } for(i =4; i
eps) { dfs(i,j); break; } } } tmp =num; for(i=num=0; i
/*HDU 4273 Rescue给一个三维凸包,求重心到表面的最短距离模板题:三维凸包+多边形重心+点面距离*/#include
#include
#include
#include
#include
using namespace std;const int MAXN=550;const double eps=1e-8;struct Point{ double x,y,z; Point(){} Point(double xx,double yy,double zz):x(xx),y(yy),z(zz){} //两向量之差 Point operator -(const Point p1) { return Point(x-p1.x,y-p1.y,z-p1.z); } //两向量之和 Point operator +(const Point p1) { return Point(x+p1.x,y+p1.y,z+p1.z); } //叉乘 Point operator *(const Point p) { return Point(y*p.z-z*p.y,z*p.x-x*p.z,x*p.y-y*p.x); } Point operator *(double d) { return Point(x*d,y*d,z*d); } Point operator / (double d) { return Point(x/d,y/d,z/d); } //点乘 double operator ^(Point p) { return (x*p.x+y*p.y+z*p.z); }};struct CH3D{ struct face { //表示凸包一个面上的三个点的编号 int a,b,c; //表示该面是否属于最终凸包上的面 bool ok; }; //初始顶点数 int n; //初始顶点 Point P[MAXN]; //凸包表面的三角形数 int num; //凸包表面的三角形 face F[8*MAXN]; //凸包表面的三角形 int g[MAXN][MAXN]; //向量长度 double vlen(Point a) { return sqrt(a.x*a.x+a.y*a.y+a.z*a.z); } //叉乘 Point cross(const Point &a,const Point &b,const Point &c) { return Point((b.y-a.y)*(c.z-a.z)-(b.z-a.z)*(c.y-a.y), (b.z-a.z)*(c.x-a.x)-(b.x-a.x)*(c.z-a.z), (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x) ); } //三角形面积*2 double area(Point a,Point b,Point c) { return vlen((b-a)*(c-a)); } //四面体有向体积*6 double volume(Point a,Point b,Point c,Point d) { return (b-a)*(c-a)^(d-a); } //正:点在面同向 double dblcmp(Point &p,face &f) { Point m=P[f.b]-P[f.a]; Point n=P[f.c]-P[f.a]; Point t=p-P[f.a]; return (m*n)^t; } void deal(int p,int a,int b) { int f=g[a][b];//搜索与该边相邻的另一个平面 face add; if(F[f].ok) { if(dblcmp(P[p],F[f])>eps) dfs(p,f); else { add.a=b; add.b=a; add.c=p;//这里注意顺序,要成右手系 add.ok=true; g[p][b]=g[a][p]=g[b][a]=num; F[num++]=add; } } } void dfs(int p,int now)//递归搜索所有应该从凸包内删除的面 { F[now].ok=0; deal(p,F[now].b,F[now].a); deal(p,F[now].c,F[now].b); deal(p,F[now].a,F[now].c); } bool same(int s,int t) { Point &a=P[F[s].a]; Point &b=P[F[s].b]; Point &c=P[F[s].c]; return fabs(volume(a,b,c,P[F[t].a]))
eps) { swap(P[1],P[i]); flag=false; break; } } if(flag)return; flag=true; //使前三个点不共线 for(i=2;i
eps) { swap(P[2],P[i]); flag=false; break; } } if(flag)return; flag=true; //使前四个点不共面 for(int i=3;i
eps) { swap(P[3],P[i]); flag=false; break; } } if(flag)return; //***************************************** for(i=0;i<4;i++) { add.a=(i+1)%4; add.b=(i+2)%4; add.c=(i+3)%4; add.ok=true; if(dblcmp(P[i],add)>0)swap(add.b,add.c); g[add.a][add.b]=g[add.b][add.c]=g[add.c][add.a]=num; F[num++]=add; } for(i=4;i
eps) { dfs(i,j); break; } } } tmp=num; for(i=num=0;i

转载地址:http://vvali.baihongyu.com/

你可能感兴趣的文章
LoadRunner测试GWT
查看>>
负载测试项目成功的5个关键要素
查看>>
LoadRunner性能测试培训大纲
查看>>
LoadRunner测试J2ME的Socket程序
查看>>
《QTP自动化测试实践》要出第二版了!
查看>>
用LoadRunner开发开心网外挂
查看>>
QTP测试.NET控件CheckedListBox
查看>>
使用QTP的.NET插件扩展技术测试ComponentOne的ToolBar控件
查看>>
用上帝之眼进行自动化测试
查看>>
为LoadRunner写一个lr_save_float函数
查看>>
PrefTest工作室全新力作-《性能测试与调优实战》课程视频即将上线
查看>>
质量度量分析与测试技术 培训大纲
查看>>
欢迎加入【亿能测试快讯】邮件列表!
查看>>
为什么我们的自动化测试“要”这么难
查看>>
LoadRunner性能脚本开发实战训练
查看>>
测试之途,前途?钱途?图何?
查看>>
测试设计与测试项目实战训练
查看>>
HP Sprinter:敏捷加速器
查看>>
单元测试培训PPT
查看>>
adb常用命令
查看>>