Marching: write C++ data structures
This commit is contained in:
parent
62730a03b4
commit
4804309182
2 changed files with 81 additions and 2 deletions
|
@ -1,5 +1,9 @@
|
||||||
#include "MarchingCubes.hpp"
|
#include "MarchingCubes.hpp"
|
||||||
|
|
||||||
|
const std::vector<MarchingCubes::CubeTri>
|
||||||
|
MarchingCubes::edges_of_intersection[256] = {
|
||||||
|
};
|
||||||
|
|
||||||
MarchingCubes::MarchingCubes(
|
MarchingCubes::MarchingCubes(
|
||||||
const ImplicitSurface& surface,
|
const ImplicitSurface& surface,
|
||||||
const Cuboid& box,
|
const Cuboid& box,
|
||||||
|
@ -24,7 +28,18 @@ Mesh MarchingCubes::operator()() {
|
||||||
for(double z = box.low(2); z < box.high(2) + resolution;
|
for(double z = box.low(2); z < box.high(2) + resolution;
|
||||||
z += resolution)
|
z += resolution)
|
||||||
{
|
{
|
||||||
//TODO apply marching cube indeed
|
Intersections intersections;
|
||||||
|
for(int dx=0; dx <= 1; dx++) {
|
||||||
|
for(int dy=0; dy <= 1; dy++) {
|
||||||
|
for(int dz=0; dz <= 1; dz++) {
|
||||||
|
double cx = x + resolution * dx;
|
||||||
|
double cy = y + resolution * dy;
|
||||||
|
double cz = z + resolution * dz;
|
||||||
|
intersections.set_corner(cx, cy, cz,
|
||||||
|
surface(cx, cy, cz));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,40 @@
|
||||||
|
|
||||||
class MarchingCubes {
|
class MarchingCubes {
|
||||||
private:
|
private:
|
||||||
|
class Intersections {
|
||||||
|
public:
|
||||||
typedef unsigned char intersect_t;
|
typedef unsigned char intersect_t;
|
||||||
|
Intersections() : inters(0) {}
|
||||||
|
|
||||||
|
intersect_t value() const {
|
||||||
|
return inters;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** The corners are indexed with three booleans, one for each
|
||||||
|
* axis (x, y, z). A false value means a lower coordinate along
|
||||||
|
* this axis.
|
||||||
|
* Eg., (false, true, false) means the corner (0, 1, 0) for a
|
||||||
|
* cube of side 1 placed at (0, 0, 0).
|
||||||
|
*/
|
||||||
|
|
||||||
|
void set_corner(bool x, bool y, bool z, bool val) {
|
||||||
|
intersect_t mask = 1 << (shift(x, y, z));
|
||||||
|
if(val)
|
||||||
|
inters |= mask;
|
||||||
|
else
|
||||||
|
inters &= ~mask;
|
||||||
|
}
|
||||||
|
bool get_corner(bool x, bool y, bool z) const {
|
||||||
|
return (inters & (1 << shift(x, y, z))) == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
intersect_t inters;
|
||||||
|
|
||||||
|
int shift(bool x, bool y, bool z) const {
|
||||||
|
return x + (y << 1) + (z << 2);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MarchingCubes(
|
MarchingCubes(
|
||||||
|
@ -39,7 +72,38 @@ class MarchingCubes {
|
||||||
|
|
||||||
Mesh operator()();
|
Mesh operator()();
|
||||||
|
|
||||||
|
struct CubeEdge {
|
||||||
|
CubeEdge() {}
|
||||||
|
CubeEdge(bool x0, bool y0, bool z0,
|
||||||
|
bool x1, bool y1, bool z1)
|
||||||
|
{
|
||||||
|
x[0] = x0;
|
||||||
|
y[0] = y0;
|
||||||
|
z[0] = z0;
|
||||||
|
x[1] = x1;
|
||||||
|
y[1] = y1;
|
||||||
|
z[1] = z1;
|
||||||
|
}
|
||||||
|
bool x[2], y[2], z[2];
|
||||||
|
};
|
||||||
|
struct CubeTri {
|
||||||
|
CubeTri() {}
|
||||||
|
CubeTri(const CubeEdge* edge_) {
|
||||||
|
for(size_t i=0; i < 3; ++i)
|
||||||
|
edge[i] = edge_[i];
|
||||||
|
}
|
||||||
|
CubeTri(const CubeEdge e0, const CubeEdge e1, const CubeEdge e2) {
|
||||||
|
edge[0] = e0;
|
||||||
|
edge[1] = e1;
|
||||||
|
edge[2] = e2;
|
||||||
|
}
|
||||||
|
CubeEdge edge[3];
|
||||||
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
static const std::vector<CubeTri> edges_of_intersection[256];
|
||||||
|
|
||||||
const ImplicitSurface& surface;
|
const ImplicitSurface& surface;
|
||||||
Cuboid box;
|
Cuboid box;
|
||||||
double resolution;
|
double resolution;
|
||||||
|
|
Loading…
Reference in a new issue