• P4724 【模板】三维凸包(简洁)


    题目描述

    给出空间中n个点,求凸包表面积。

    输入格式

    第一行一个整数n,表示点数。

    接下来n行,每行三个实数x,y,z描述坐标。

    输出格式

    输出凸包表面积,保留3位小数。

    输入输出样例

    输入 #1
    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;
    }
  • 相关阅读:
    Maven:Maven Wrapper
    ue4 shooterGame 第一步 搭建git linux服务器
    淌水 UE4的shootergame 案例 准备
    cesium+ geoserverTerrainProvide+png展示3D高程图展示
    geoserver使用curl发布 imagemosaic
    three.js 根据png生成heightmap
    github中cesium-terrain-builder和cesium-terrain-server使用
    geoServer 发布geoTiff格式的DEM数据
    NetCDF 入门
    java生成base64编码的png
  • 原文地址:https://www.cnblogs.com/nublity/p/11650718.html
Copyright © 2020-2023  润新知