/// <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); }
public void BuildEmptyIntervalTree() { var emptyTree = new RangeTree <DateTime, int>(); emptyTree.Rebuild(); Assert.Pass(); }
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); }
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); }
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); }
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); }
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); } }