public MarchingCubesResults Generate(List <GridCube> cubes, double isoLevel) { var toReturn = new MarchingCubesResults(); toReturn.Iso = isoLevel; toReturn.Grid = cubes; foreach (var cube in cubes) { foreach (var line in cube.Edges) { if (!line.IsAnalyzed) { var calcA = line.Point1.CalculatedValue; if (!calcA.HasValue) { calcA = line.Point1.CalculatedValue = CalculateOrGetFromCache(function, line.Point1); } var calcB = line.Point2.CalculatedValue; if (!calcB.HasValue) { calcB = line.Point2.CalculatedValue = CalculateOrGetFromCache(function, line.Point2); } line.IsAnalyzed = true; // Current edge has iso line. if (calcA.HasValue && calcB.HasValue && (calcA.Value < isoLevel != calcB.Value < isoLevel)) { if (line.IsoPoint == null) { line.HasIsoLine = true; var interpolation = Interpolation; if (interpolation == null) { interpolation = new SimpleInterpolation(true); } line.IsoPoint = interpolation.Interpolate( line.Point1, line.Point2, line.AxissIndex, isoLevel); } } } } toReturn.Triangles.AddRange(GetTriangles(cube, isoLevel)); } return(toReturn); }
public MarchingCubesResults GenerateI(double isoLevel, INterpolationAlgoritm interpolation) { if (interpolation == null) { interpolation = new GoldenSectionSearch(this.function, 0.005); } //AnalyzeCubes(cubes, isoLevel, interpolation); var results = new MarchingCubesResults() { Value = isoLevel }; //foreach (var cube in cubes) //{ // results.Triangles.AddRange(GetTriangles(cube, isoLevel)); //} return(results); }