예제 #1
0
            /// <summary>
            /// Gets the surface with the specified description.
            /// </summary>
            public static Quadtree <F> Get(_SurfaceDesc <T, F> Surface)
            {
                Quadtree <F> surf;

                if (Surface.Lower.Depth == 0)
                {
                    surf = Quadtree <F> .Singleton(Surface.SurfaceizeFunc(Surface.Lower.Value, Surface.Higher.Value, Surface.Axis));
                }
                else
                {
                    if (!_SurfaceCache.TryGetValue(Surface, out surf))
                    {
                        // RECURSE!
                        int            axisind  = (int)Surface.Axis;
                        Quadtree <F>[] children = new Quadtree <F> [4];
                        for (int t = 0; t < 4; t++)
                        {
                            _SurfaceDesc <T, F> subsurf = new _SurfaceDesc <T, F>()
                            {
                                Axis           = Surface.Axis,
                                Lower          = Surface.Lower[Octree.Indices[axisind, t, 1]],
                                Higher         = Surface.Higher[Octree.Indices[axisind, t, 0]],
                                SurfaceizeFunc = Surface.SurfaceizeFunc
                            };
                            children[t] = Get(subsurf);
                        }
                        surf = _SurfaceCache[Surface] = Quadtree <F> .Create(Surface.Lower.Depth, children);
                    }
                }
                return(surf);
            }
예제 #2
0
            // <summary>
            /// Gets the slice borders for the specified slice description.
            /// </summary>
            public static Quadtree <F> Get(_SliceDesc <T, F> Slice)
            {
                if (Slice.Octree.Depth == 0)
                {
                    throw new ArgumentException();
                }

                Quadtree <F> tree;

                if (!_SliceCache.TryGetValue(Slice, out tree))
                {
                    Axis a  = Slice.Axis;
                    int  ai = (int)a;
                    int  l  = Slice.Level;
                    int  hs = 1 << (Slice.Octree.Depth - 1);

                    if (l == hs - 1)
                    {
                        Quadtree <F>[] children = new Quadtree <F> [4];
                        for (int r = 0; r < 4; r++)
                        {
                            children[r] = _SurfaceDesc <T, F> .Get(new _SurfaceDesc <T, F>()
                            {
                                Axis           = a,
                                Lower          = Slice.Octree[Cubia.Octree.Indices[ai, r, 0]],
                                Higher         = Slice.Octree[Cubia.Octree.Indices[ai, r, 1]],
                                SurfaceizeFunc = Slice.SurfaceizeFunc
                            });
                        }
                        tree = Quadtree <F> .Create(children[0].Depth + 1, children);
                    }
                    else
                    {
                        int            i        = l < hs ? 0 : 1;
                        Quadtree <F>[] children = new Quadtree <F> [4];
                        for (int r = 0; r < 4; r++)
                        {
                            children[r] = _SliceDesc <T, F> .Get(new _SliceDesc <T, F>()
                            {
                                Axis           = a,
                                Level          = l - (i *hs),
                                SurfaceizeFunc = Slice.SurfaceizeFunc,
                                Octree         = Slice.Octree[Cubia.Octree.Indices[ai, r, i]]
                            });
                        }
                        tree = Quadtree <F> .Create(children[0].Depth + 1, children);
                    }

                    _SliceCache[Slice] = tree;
                }
                return(tree);
            }