Files

57 lines
1.3 KiB
C++
Raw Permalink Normal View History

2026-08-03 18:42:47 +08:00
/**
* @file Marching cubes
*
* Based on https://github.com/ilastik/marching_cubes
*
* License: BSD-3-Clause
*
* Copyright 2018, The ilastik development team
* Copyright 2020, Schrodinger, Inc.
*/
#ifndef MARCHING_CUBES_H
#define MARCHING_CUBES_H
#include <memory>
namespace mc
{
struct Point {
float x, y, z;
float operator[](size_t pos) const { return (&x)[pos]; }
float& operator[](size_t pos) { return (&x)[pos]; }
};
class Field
{
public:
virtual ~Field() = default;
virtual size_t xDim() const = 0;
virtual size_t yDim() const = 0;
virtual size_t zDim() const = 0;
virtual float get(size_t x, size_t y, size_t z) const = 0;
virtual Point get_point(size_t x, size_t y, size_t z) const = 0;
Point get_gradient(size_t x, size_t y, size_t z) const;
};
/**
* Isosurface mesh with faces, vertices and normals
*/
struct Mesh {
size_t vertexCount = 0; //!< the number of vertices
std::unique_ptr<Point[]> vertices; //!< vertex positions
std::unique_ptr<Point[]> normals; //!< normal direction of each vertex
size_t faceCount = 0; //!< the number of faces
std::unique_ptr<size_t[]>
faces; //!< the faces given by 3 vertex indices (length = faceCount * 3)
};
Mesh march(const Field& volume, float isoLevel, bool gradient_normals = true);
void calculateNormals(Mesh& mesh);
} // namespace mc
#endif