Пример #1
0
        /// <summary> Gets range (interval) tree with LODs </summary>
        private RangeTree <float, int> GetLodTree(float cameraAspect, float maxDistance)
        {
            const float sizeRatio = 0.5f;
            var         tree      = new RangeTree <float, int>();

            var aspectRatio = sizeRatio * (Screen.height < Screen.width ? 1 / cameraAspect : 1);

            FieldOfView = GetFieldOfView(GeoUtils.CreateQuadKey(_geoOrigin, LodRange.Minimum), maxDistance, aspectRatio);

            if (LodRange.Minimum == LodRange.Maximum)
            {
                tree.Add(0, maxDistance, LodRange.Minimum);
            }
            else
            {
                for (int lod = LodRange.Minimum; lod <= LodRange.Maximum; ++lod)
                {
                    var frustumHeight = GetFrustumHeight(GeoUtils.CreateQuadKey(_geoOrigin, lod), aspectRatio);
                    var distance      = frustumHeight * 0.5f / Mathf.Tan(FieldOfView * 0.5f * Mathf.Deg2Rad);
                    tree.Add(distance, maxDistance, lod);
                    maxDistance = distance - float.Epsilon;
                }
            }

            tree.Rebuild();

            return(tree);
        }
Пример #2
0
        public void BuildEmptyIntervalTree()
        {
            var emptyTree = new RangeTree <DateTime, int>();

            emptyTree.Rebuild();
            Assert.Pass();
        }
Пример #3
0
        private RangeTree <float, int> GetLodTree()
        {
            var baseValue = 2f * _radius;
            var lodTree   = new RangeTree <float, int>();

            for (int lod = LodRange.Minimum; lod <= LodRange.Maximum; ++lod)
            {
                if (lod == 1)
                {
                    lodTree.Add(baseValue, 2 * baseValue, lod);
                }
                else if (lod == 2)
                {
                    lodTree.Add(baseValue - 1 / 3f * _radius, baseValue, lod);
                }
                else
                {
                    float fib1 = GetFibonacciNumber(lod - 1);
                    float fib2 = GetFibonacciNumber(lod);
                    var   max  = baseValue - _radius * (lod == 3 ? 1 / 3f : fib1 / (fib1 + 1));
                    var   min  = baseValue - _radius * fib2 / (fib2 + 1);

                    lodTree.Add(min, max, lod);
                }
            }

            lodTree.Rebuild();

            return(lodTree);
        }
Пример #4
0
        public bool RemoveUser(Guid uid)
        {
            var cell = _currentUsersLocations[uid];

            var query_res = rtree.Query(cell);

            //var clone = query_res.ToList();

            foreach (var q in query_res)
            {
                var toremove = q.Content.FirstOrDefault(u => u == uid);

                if (toremove == null)
                {
                    return(false);
                }
                q.Content.Remove(toremove);
            }

            //if (query_res.Count > 0)
            //{
            //    rtree.Remove(query_res[0]);
            //    if (clone.Count != 0)
            //    {
            //        rtree.Add(new SimpleRangeItem { Range = new Range<S2CellId>(clone[0].Range.From), Content = clone[0].Content });
            //    }

            //}
            //else return false;
            rtree.Rebuild();
            return(true);
        }
Пример #5
0
        public void CanGetMaxValue()
        {
            var tree = new RangeTree <float, string>();

            tree.Add(new RangeValuePair <float, string>(100, 200, "1"));
            tree.Add(new RangeValuePair <float, string>(300, 400, "2"));
            tree.Rebuild();

            var value = tree.Max;

            Assert.AreEqual(400, value);
        }
Пример #6
0
        private RangeTree <float, int> GetLodTree()
        {
            var lodTree = new RangeTree <float, int>();

            for (int lod = LodRange.Minimum; lod <= LodRange.Maximum; ++lod)
            {
                lodTree.Add(_radius + _radius * Mathf.Pow(2, 1 - lod),
                            _radius + _radius * Mathf.Pow(2, 2 - lod),
                            lod);
            }

            lodTree.Rebuild();

            return(lodTree);
        }
Пример #7
0
 private void BuildRangeTree()
 {
     try
     {
         List <VertexData> vertices = _forestGraph.Vertices.Select(i => i.Data).ToList();
         if (_rangeTree.IsBuilded())
         {
             _rangeTree.Rebuild(vertices);
         }
         else
         {
             _rangeTree.Build(vertices);
         }
     }
     catch (Exception ex)
     {
         ShowMessage(ex.Message, MessageBoxIcon.Error, Resources.RangeTreeBuildError);
     }
 }