首页 > 其他分享 >三维凸包 模板

三维凸包 模板

时间:2023-07-21 17:57:29浏览次数:32  
标签:return BCD double vertex 三维 凸包 vecs 模板 Vec

只会写增量法 orz

例题:P2287
随机种子 0x383494 被卡了精度,eps=1e-10 太大了

#include <cstdio>
#include <iostream>
#include <bitset>
#include <list>
#include <random>
#include <cmath>
#include <algorithm>
#define UP(i,s,e) for(auto i=s; i!=e; ++i)
std::mt19937 rdna(0x383494);
double constexpr eps = 1e-11;  // 警钟敲烂
double reps(){ static std::uniform_real_distribution<> r(-1.0, 1.0); return r(rdna)*eps; }
constexpr int N = 2000;
namespace calc_geo{ // }{{{
struct Vec{
	double x, y, z;
	Vec(){}
	Vec(double x, double y, double z):x(x), y(y), z(z){}
	//Vec &operator=(Vec b){ x=b.x, y=b.y, z=b.z; return *this; }
	Vec operator+(Vec b){ b.x+=x, b.y+=y, b.z+=z; return b; }
	Vec operator-(Vec b){ b.x=x-b.x, b.y=y-b.y, b.z=z-b.z; return b; }
	Vec operator-(){ return Vec(-x, -y, -z); }
	double operator^(Vec b){ return x*b.x+y*b.y+z*b.z; }
	Vec operator%(Vec b){ 
		return Vec(y * b.z - z * b.y,
				z * b.x - x * b.z,
				x * b.y - y * b.x); 
	}
	double len(){ return sqrt(x*x+y*y+z*z); }
	Vec &normal(){ double l = len(); if(l){x/=l, y/=l, z/=l;} return *this; }
	void shake(){ x += reps(); y += reps(); z += reps(); }
} vecs[N];
std::bitset<N> vis[N];
struct Surface{
	Vec *vertex[3]; // outside: anticlockwise
	Vec normal(){ // point towards outside
		return (*vertex[1]-*vertex[0])%(*vertex[2]-*vertex[1]);
	}
	double area(){
		return ((*vertex[1]-*vertex[0])%(*vertex[2]-*vertex[1])).len()/2.0;
	}
};
struct Convex{
	std::list<Surface> surs;
	void init(Vec *A, Vec *B, Vec *C){
		surs.clear();
		surs.push_back({A,B,C});
		surs.push_back({C,B,A});
	}
	void addpoint(Vec *A){
		UP(BCD, surs.begin(), surs.end()){
			if((BCD->normal()^(*A-*BCD->vertex[0])) > 0){
				UP(j, 0, 3){
					vis[BCD->vertex[j]-vecs][BCD->vertex[(j+1)%3]-vecs]
						= 1;
				}
				BCD = surs.erase(BCD);
				--BCD;
				continue;
			}
		}
		auto ee = surs.end();
		UP(BCD, surs.begin(), ee){
			UP(j, 0, 3){
				int idx, idy;
				idx = (int)(BCD->vertex[j]-vecs);
				idy = (int)(BCD->vertex[(j+1)%3]-vecs);
				if(!vis[idx][idy] && vis[idy][idx]){
					surs.push_back({vecs+idy, vecs+idx, A});
					vis[idy][idx] = 0;
				}
			}
		}
	}
	double getarea(){
		double ans = 0;
		for(auto BCD:surs){
			ans += BCD.area();
		}
		return ans;
	}
} con;
} // {}}}
using std::cin;
using std::cout;
namespace m{ // }{{{
using calc_geo::vecs;
using calc_geo::con;
int in;
void work(){
	cin >> in;
	UP(i, 0, in) {
		cin >> vecs[i].x >> vecs[i].y >> vecs[i].z;
		vecs[i].shake();
	}
	con.init(vecs, vecs+1, vecs+2);
	UP(i, 3, in){
		con.addpoint(vecs+i);
	}
	char outbuf[20];
	sprintf(outbuf, "%.6lf\n", con.getarea());
	cout << outbuf;
}
} // {}}}
int main(){m::work(); return 0;}

标签:return,BCD,double,vertex,三维,凸包,vecs,模板,Vec
From: https://www.cnblogs.com/x383494/p/17572078.html

相关文章

  • 基于vite的前端模板库create-xg
    一个类似于create-vite的快速生成模板,因为create-vite创建的项目模板只有最基础的东西,仍然需要安装第三方依赖如ui库等,还未达到开箱即用的程度。于是自己动手实现一个类似的模板库,包含vue/react、路由、ui库、axios、mock数据,可以在此基础上直接开发业务代码,避免重复的环境搭......
  • HTML模板继承导入
      include导入 include可以导入多次,extend继承只能一次......
  • 那些你不要的模板
    打qoj板子赛打的。有的是会的,只是之前没写过。就题论题,所以写的不一定是正解。回文自动机题意对于\(S\),记\(c_S(T)\)表示\(T\)在\(S\)中的出现次数。对所有回文串\(T\),求\(\max_T(c_S(T)\cdot|T|^2)\)。对于所有数据,\(|S|\leq10^6\)。题解经典结论:本质......
  • 线段树--区间最大值模板
    Smiling&Weeping----你是我绕过的山河错落,才找到的人间烟火ProblemDescriptionThereisasequence a oflength n.Weuse ai todenotethe i-thelementinthissequence.Youshoulddothefollowingthreetypesofoperationstoth......
  • C++ 模板编程技术解析
    一、函数模板函数模板实现通用函数,根据传递类型进行编译时实参推导:template<typenameT>Tadd(Ta,Tb){returna+b;}intmain(){intx=1,y=2;doublem=1.5,n=2.5;intz=add(x,y);doublep=add(m,n);return0;}这里te......
  • html 数据可视化大屏展示模板源码分享(第一期)
    1、angular+echart.js统计数据图表读取投屏数据大屏2、生意参谋大数据可视化HTML模板3、大数据可视化展板通用模板4、基于echarts实现的销售统计数据可视化大屏模板5、新能源车联网综合大数据平台6、厅店效能大屏监控看板7、东海省交通大数据分析平台8、基于echarts......
  • 小旋风超级模板站群788套整站html5模板(已经过xxfseo处理)免费下载
    这784套整站模板来源于市面上的html5英文模板,经过机器处理(替换、过滤、精简、压缩)后,生成的。适用于超级模板站群。本来是1千多套的,删除了后台模板、单页模板。剩下784套不错的模板。整站多页面模板。----------------------------------------------------------------------使......
  • LCT 模板
    以P3690为例。#include<iostream>#defineUP(i,s,e)for(autoi=s;i<e;++i)namespaceLCT{//}{{{structNode{ Node*ls,*rs; Node*fa; intsum,val; boolrev; Node();}nil_,*nil=&nil_;Node::Node(){fa=ls=rs=nil;}voidpushup(......
  • 建站新手福利:免费网页模板大合集,快速打造专业网站!
    今天给大家带来的网站模板素材,网站类型丰富,包含户外旅行、餐饮、个人网站等等,可以学习和参考其中的布局排版和配色。 ⬇⬇⬇点击获取更多设计资源https://js.design/community?category=design&source=bky&plan=bbqbky772   1、设计公司&工作室相信大家都希望拥有属......
  • 上传jrxml模板进行JasperReport解析导致任意代码执行RCE
    JasperReport是一个强大、灵活的报表生成工具,能够展示丰富的页面内容,并将之转换成PDF、HTML、XML等格式。该库完全由Java写成,可以用于在各种Java应用程序,包括J2EE,Web应用程序中生成动态内容。JasperReports附带了报表编译器,可以在报表表达式内部使用Groovy脚本语言或JavaScript编......