P4724 模板三维凸包(简洁)
Posted nublity
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P4724 模板三维凸包(简洁)相关的知识,希望对你有一定的参考价值。
题目描述
给出空间中n个点,求凸包表面积。
输入格式
第一行一个整数n,表示点数。
接下来n行,每行三个实数x,y,z描述坐标。
输出格式
输出凸包表面积,保留3位小数。
输入输出样例
输入 #1
4
0 0 0
1 0 0
0 1 0
0 0 1
输出 #1
2.366
说明/提示
n≤2000
#include<bits/stdc++.h> using namespace std; const int N = 2010; const double eps = 1e-9; int n, cnt, vis[N][N]; double ans; double Rand() { return rand() / (double) RAND_MAX; } double reps() { return (Rand() - 0.5) * eps; } struct Node { double x, y, z; void shake() { x += reps(); y += reps(); z += reps(); } double len() { return sqrt(x * x + y * y + z * z); } Node operator-(Node A) { return (Node) {x - A.x, y - A.y, z - A.z}; } Node operator*(Node A) { return (Node) {y * A.z - z * A.y, z * A.x - x * A.z, x * A.y - y * A.x}; } double operator&(Node A) { return x * A.x + y * A.y + z * A.z; } } A[N]; struct Face { int v[3]; Node Normal() { return (A[v[1]] - A[v[0]]) * (A[v[2]] - A[v[0]]); } double area() { return Normal().len() / 2.0; } } f[N], C[N]; int see(Face a, Node b) { return ((b - A[a.v[0]]) & a.Normal()) > 0; } void Convex_3D() { f[++cnt] = (Face) {1, 2, 3}; f[++cnt] = (Face) {3, 2, 1}; for (int i = 4, cc = 0; i <= n; i++) { for (int j = 1, v; j <= cnt; j++) { if (!(v = see(f[j], A[i]))) C[++cc] = f[j]; for (int k = 0; k < 3; k++) vis[f[j].v[k]][f[j].v[(k + 1) % 3]] = v; } for (int j = 1; j <= cnt; j++) for (int k = 0; k < 3; k++) { int x = f[j].v[k], y = f[j].v[(k + 1) % 3]; if (vis[x][y] && !vis[y][x]) C[++cc] = (Face) {x, y, i}; } for (int j = 1; j <= cc; j++) f[j] = C[j]; cnt = cc; cc = 0; } } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) cin >> A[i].x >> A[i].y >> A[i].z, A[i].shake(); Convex_3D(); for (int i = 1; i <= cnt; i++) ans += f[i].area(); cout << fixed << setprecision(3) << ans << endl; return 0; }
以上是关于P4724 模板三维凸包(简洁)的主要内容,如果未能解决你的问题,请参考以下文章