三维凸包之增量算法

本文深入探讨了三维空间中凸包的增量算法,详细阐述了算法的工作流程,揭示了如何通过逐步添加点来构建凸包,适用于理解和实现高效的空间几何计算。
摘要由CSDN通过智能技术生成

算法工作过程:

选取点集中的四个点构成一个初始的四面体:
选两个点p1, p2,再选一个点p3,p3和p1, p2不在同一条直线上,这样形成了一个面。再选一个点,不在同一个面上,形成一个四面体。
然后继续研究剩余的点:
点在四面体内部,略过。
点在四面体外部,删除此点能“看见”的面,扩大凸包体积。


POJ 3528 Ultimate Weapon
大意:求解多面体表面积

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const double eps=1e-7;
const int N=5e2+10;
struct point{
    double x,y,z;
    point(){ x=0; y=0; z=0; }
    point(double _x,double _y,double _z):x(_x),y(_y),z(_z) {}
    point operator -(const point other){
        return point(x-other.x,y-other.y,z-other.z);
    }
    point operator *(const point other){
        return point(y*other.z-z*other.y,-x*other.z+z*other.x,x*other.y-y*other.x);
    }
    double operator ^(const point other){ //点乘
        return x*other.x+y*other.y+z*other.z;
    }
};
struct ch3D{
     struct fac{
         int a,b,c;  // 面上三点的编号
         bool ok;   // 是否属于凸包
     };
     int n;  //初始点数
     point P[N];  //初始点

     int cnt;  //凸包上的三角形
     fac F[N*6];  // 被创建的面不超过6N

     int vis[N][N];
     double vlen(point v){
         return sqrt(v.x*v.x+v.y*v.y+v.z*v.z);
     }
     double area(point p1,point p2,point p3){
         return vlen((p2-p1)*(p3-p1));   // 三角形面积*2
     }
     double volumn(point p1,point p2,point p3,point p4){
         return fabs((p2-p1)*(p3-p1)^(p4-p1));  //V的6倍
     }
     double pToPlane(point p,fac ff){  // 点在面的同向: +
         point m=P[ff.b]-P[ff.a];
         point n=P[ff.c]-P[ff.a];
         point v=p-P[ff.a];
         return m*n^v;
     }
     void deal(int p,int a,int b){
         int f=vis[a][b];
         fac add;
         if(F[f].ok){
            if(pToPlane(P[p],F[f])>ep
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值