Example #1
0
        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);
        }
Example #2
0
        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);
        }