Пример #1
0
    Vector <double> getEdgePoint(Vector <double> a, Vector <double> b, double valA, double valB)
    {
        double          sample;
        Vector <double> point;

        do
        {
            point  = (a + b) / 2.0;
            sample = surface.sample(point);
            if (Math.Sign(sample) == Math.Sign(valA))
            {
                a    = point;
                valA = sample;
            }
            else
            {
                b    = point;
                valB = sample;
            }
        } while(sample < 0.02);

        return(point);
    }
Пример #2
0
    Cell(double originalSize, int level, int maxLevel, Vector <double> pos, IsoSurface surface, Cell parent)
    {
        this.originalSize = originalSize;
        this.level        = level;
        this.maxLevel     = maxLevel;
        this.pos          = pos;
        this.parent       = parent;

        size = originalSize / Math.Pow(2, level);

        points = new double[(int)Math.Pow(2, pos.Count)];

        int sign = 0;

        for (int i = 0; i < points.Length; i++)
        {
            var vector = posToVector(pointIndexToPos(i));
            points[i] = surface.sample(pos + vector);

            if (signed)
            {
                continue;
            }

            int thisSign = Math.Sign(points[i]);
            if (sign == 0)
            {
                sign = thisSign;
            }

            if (sign != thisSign)
            {
                setSigned();
            }

            sign = thisSign;
        }

        if (!signed)
        {
            if (parent != null)
            {
                if (parent.signed)
                {
                    return;
                }
            }
        }

        if (level == maxLevel)
        {
        }
        else
        {
            children = new Cell[points.Length];
            for (int i = 0; i < children.Length; i++)
            {
                var vector = posToVector(pointIndexToPos(i)) * 0.5;
                children[i] = new Cell(originalSize, level + 1, maxLevel, pos + vector, surface, this);
            }
        }
    }