示例#1
0
            public OctTreeNodeEnum_Box(Node Root, long X, long Y, long Z, ulong Width, ulong Height, ulong Depth)
            {
                _X = X;
                _Y = Y;
                _Z = Z;
                if (Width > (ulong)long.MaxValue)
                {
                    throw new Exception("Box query is too big");
                }
                if (Height > (ulong)long.MaxValue)
                {
                    throw new Exception("Box query is too big");
                }
                if (Depth > (ulong)long.MaxValue)
                {
                    throw new Exception("Box query is too big");
                }

                _Width  = (long)Width;
                _Height = (long)Height;
                _Depth  = (long)Depth;

                _EndX = _X + (long)_Width;
                _EndY = _Y + (long)_Height;
                _EndZ = _Z + (long)_Depth;

                _RootNode = Root;
                for (int n = 0; n < _NodeChain.Length; n++)
                {
                    _NodeChain[n] = new OcTreeNodeEnumState();
                }
                Reset();
            }
示例#2
0
            public bool MoveNext()
            {
                // MoveNext is call first so we need a special case for the initialization
                if (_First)
                {
                    _First = false;
                    if (_RootNode != null)
                    {
                        return(true);
                    }
                    else
                    {
                        return(false);
                    }
                }

restart:
                OcTreeNodeEnumState _Parent = _NodeChain[_NodeChainIndex];

                if (_Parent._Node._0_0_0 != null && (_Parent._Included || Intersect(_Parent._Node)))
                {
                    _Parent._SubdivisionIndex++;
                    _NodeChainIndex++;
                    _NodeChain[_NodeChainIndex]._SubdivisionIndex = 0;

                    switch (_Parent._SubdivisionIndex)
                    {
                    case 1:
                        _NodeChain[_NodeChainIndex]._Node = _Parent._Node._0_0_0;
                        if (_Parent._Included)
                        {
                            _NodeChain[_NodeChainIndex]._Included = true;
                        }
                        else
                        {
                            _NodeChain[_NodeChainIndex]._Included = Included(_NodeChain[_NodeChainIndex]._Node);
                        }
                        return(true);

                    case 2:
                        _NodeChain[_NodeChainIndex]._Node = _Parent._Node._0_1_0;
                        if (_Parent._Included)
                        {
                            _NodeChain[_NodeChainIndex]._Included = true;
                        }
                        else
                        {
                            _NodeChain[_NodeChainIndex]._Included = Included(_NodeChain[_NodeChainIndex]._Node);
                        }
                        return(true);

                    case 3:
                        _NodeChain[_NodeChainIndex]._Node = _Parent._Node._1_0_0;
                        if (_Parent._Included)
                        {
                            _NodeChain[_NodeChainIndex]._Included = true;
                        }
                        else
                        {
                            _NodeChain[_NodeChainIndex]._Included = Included(_NodeChain[_NodeChainIndex]._Node);
                        }
                        return(true);

                    case 4:
                        _NodeChain[_NodeChainIndex]._Node = _Parent._Node._1_1_0;
                        if (_Parent._Included)
                        {
                            _NodeChain[_NodeChainIndex]._Included = true;
                        }
                        else
                        {
                            _NodeChain[_NodeChainIndex]._Included = Included(_NodeChain[_NodeChainIndex]._Node);
                        }
                        return(true);

                    case 5:
                        _NodeChain[_NodeChainIndex]._Node = _Parent._Node._0_0_1;
                        if (_Parent._Included)
                        {
                            _NodeChain[_NodeChainIndex]._Included = true;
                        }
                        else
                        {
                            _NodeChain[_NodeChainIndex]._Included = Included(_NodeChain[_NodeChainIndex]._Node);
                        }
                        return(true);

                    case 6:
                        _NodeChain[_NodeChainIndex]._Node = _Parent._Node._0_1_1;
                        if (_Parent._Included)
                        {
                            _NodeChain[_NodeChainIndex]._Included = true;
                        }
                        else
                        {
                            _NodeChain[_NodeChainIndex]._Included = Included(_NodeChain[_NodeChainIndex]._Node);
                        }
                        return(true);

                    case 7:
                        _NodeChain[_NodeChainIndex]._Node = _Parent._Node._1_0_1;
                        if (_Parent._Included)
                        {
                            _NodeChain[_NodeChainIndex]._Included = true;
                        }
                        else
                        {
                            _NodeChain[_NodeChainIndex]._Included = Included(_NodeChain[_NodeChainIndex]._Node);
                        }
                        return(true);

                    case 8:
                        _NodeChain[_NodeChainIndex]._Node = _Parent._Node._1_1_1;
                        if (_Parent._Included)
                        {
                            _NodeChain[_NodeChainIndex]._Included = true;
                        }
                        else
                        {
                            _NodeChain[_NodeChainIndex]._Included = Included(_NodeChain[_NodeChainIndex]._Node);
                        }
                        return(true);

                    default:
                        if (_NodeChainIndex == 1)
                        {
                            return(false);
                        }
                        _NodeChainIndex -= 2;
                        goto restart;
                    }
                }
                else
                {
                    if (_NodeChainIndex == 0)
                    {
                        return(false);
                    }
                    _NodeChainIndex -= 1;
                    goto restart;
                }
            }