コード例 #1
1
        public void CreateContour(BlockTableRecord btr)
        {
            if (panelBtr.ExtentsByTile.Diagonal() < endOffset)
            {
                return;
            }

            // из всех плиток отделить торцевые плитки????
            // дерево границ плиток
            TreeTiles = new RTree<Tuple<ObjectId, Extents3d>>();
            panelBtr.Tiles.ForEach(t =>
                           {
                               try
                               {
                                   var r = new Rectangle(t.Item2.MinPoint.X, t.Item2.MinPoint.Y, t.Item2.MaxPoint.X, t.Item2.MaxPoint.Y, 0, 0);
                                   TreeTiles.Add(r, t);
                               }
                               catch { }
                           });

            // Первый угол панели - левый нижний
            var pt1 = getCoordTileNoEnd(panelBtr.ExtentsByTile.MinPoint, EnumCorner.LeftLower);
            var pt2 = getCoordTileNoEnd(new Point3d(panelBtr.ExtentsByTile.MinPoint.X, panelBtr.ExtentsByTile.MaxPoint.Y, 0), EnumCorner.LeftTop);
            var pt3 = getCoordTileNoEnd(panelBtr.ExtentsByTile.MaxPoint, EnumCorner.RightTop);
            var pt4 = getCoordTileNoEnd(new Point3d(panelBtr.ExtentsByTile.MaxPoint.X, panelBtr.ExtentsByTile.MinPoint.Y, 0), EnumCorner.RightLower);

            Extents3d extNoEnd = new Extents3d(pt1, pt2);
            extNoEnd.AddPoint(pt3);
            extNoEnd.AddPoint(pt4);
            panelBtr.ExtentsNoEnd = extNoEnd;

            Point3dCollection pts = new Point3dCollection();
            pts.Add(pt1);
            pts.Add(pt2);
            pts.Add(pt3);
            pts.Add(pt4);
            using (Polyline3d poly = new Polyline3d(Poly3dType.SimplePoly, pts, true))
            {
                poly.LayerId = panelBtr.CPS.IdLayerContour;
                btr.AppendEntity(poly);
                btr.Database.TransactionManager.TopTransaction.AddNewlyCreatedDBObject(poly, true);
            }
        }
コード例 #2
0
 public void RTreeQuery_PointIntersectionTest()
 {
     for (int seed = 0; seed < 1; ++seed)
     {
         int n = 100000;
         var points = new Point[n];
         var rand = new Random(seed);
         double scale = 1000;
         for (int i = 0; i < n; ++i)
         {
             points[i] = new Point(rand.NextDouble() * scale, rand.NextDouble() * scale);
         }
         var bsptree = new RTree<Point>(
             from p in points
             select new KeyValuePair<Rectangle, Point>(new Rectangle(p), p));
         Assert.AreEqual(bsptree.GetAllLeaves().Count(), n);
         Assert.AreEqual(bsptree.GetAllIntersecting(new Rectangle(-2, -2, -1, -1)).Count(), 0);
         Assert.AreEqual(bsptree.GetAllIntersecting(new Rectangle(0, 0, scale, scale)).Count(), n);
         int intersecting = 0;
         for (int i = 0; i < 10000; ++i)
         {
             double s = scale / 100;
             var query = new Rectangle(rand.NextDouble() * s, rand.NextDouble() * s, rand.NextDouble() * s, rand.NextDouble() * s);
             if (bsptree.IsIntersecting(query))
             {
                 ++intersecting;
             }
         }
         System.Console.WriteLine(intersecting);
     }
 }
コード例 #3
0
ファイル: RTreeTests.cs プロジェクト: gregorypilar/interlace
        public void TestSimpleInserts()
        {
            RTree tree = new RTree(4, 2);

            tree.Insert<int>(new Box(0, 0, 10, 10), 1); tree.ThrowOnInvariantsViolated();

            tree.Insert<int>(new Box(20, 0, 30, 10), 2); tree.ThrowOnInvariantsViolated();

            AssertSetIsEqual(tree.Find<int>(new Box(-5, -5, 5, 5)), 1);

            // Cause the first split:
            tree.Insert<int>(new Box(20, 0, 30, 10), 3); tree.ThrowOnInvariantsViolated();
            tree.Insert<int>(new Box(20, 20, 30, 30), 4); tree.ThrowOnInvariantsViolated();

            tree.Insert<int>(new Box(40, 0, 50, 30), 5); tree.ThrowOnInvariantsViolated();

            AssertSetIsEqual(tree.Find<int>(new Box(-5, -5, 5, 5)), 1);

            AssertSetIsEqual(tree.Find<int>(new Box(5, 5, 25, 25)), 1, 2, 3, 4);
            AssertSetIsEqual(tree.Find<int>(new Box(-1000, -1000, 1000, 1000)), 1, 2, 3, 4, 5);

            // Cause another set of splits:
            for (int i = 0; i < 1000; i++)
            {
                tree.Insert<int>(new Box(100 + i * 10, 0, 100 + i * 10 + 10, 10), 6 + i);
                tree.ThrowOnInvariantsViolated();
            }

            AssertSetIsEqual(tree.Find<int>(new Box(-5, -5, 5, 5)), 1);

            AssertSetIsEqual(tree.Find<int>(new Box(5, 5, 25, 25)), 1, 2, 3, 4);
            AssertSetIsEqual(tree.Find<int>(new Box(-1000, -1000, 45, 1000)), 1, 2, 3, 4, 5);
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: mtrakal/indsa
        static void Main(string[] args)
        {
            //Console.WriteLine(BitConverter.DoubleToInt64Bits(15.2335344534));

            RTree<string, int> rtree = new RTree<string, int>();
            rtree.Vloz("Rr", new PointF(33, 63), new PointF(38, 52), 110);
            rtree.Vloz("Rm", new PointF(30, 70), new PointF(33, 63), 111);

            rtree.Vloz("Ra", new PointF(5, 5), new PointF(10, 10), 101);
            rtree.Vloz("Rx", new PointF(10, 10), new PointF(20, 25), 102);
            rtree.Vloz("Rs", new PointF(20, 25), new PointF(35, 12), 103);

            rtree.Vloz("Rt", new PointF(30, 30), new PointF(35, 12), 104);
            rtree.Vloz("Rw", new PointF(30, 30), new PointF(38, 52), 105);
            rtree.Vloz("Rk", new PointF(15, 45), new PointF(28, 50), 106);

            rtree.Vloz("Rz", new PointF(15, 45), new PointF(22, 60), 107);
            rtree.Vloz("Rf", new PointF(25, 55), new PointF(28, 50), 108);
            rtree.Vloz("Rd", new PointF(25, 55), new PointF(33, 63), 109);

            rtree.PostavStrom();

            List<int> listBodove = rtree.VyhledejBodove(new PointF(10, 10));
            List<int> listIntervalove = rtree.VyhledejIntervalove(new Rectangle(7, 3, 10, 12));

            Debug.WriteLine("");
            Debug.WriteLine(string.Format("{0,-5}\t{1}\t{2,15}\t{3,10}\t{4,10}\t{5,5}\t{6,5}\t{7,5}\t{8,5}\t{9,5}\t{10,5}", "Data", "Key", "Z-order", "X order", "Y ordr", "V1.X", "V1.Y", "V2.X", "V2.Y", "Width", "Height"));
            foreach (RTree<string, int>.RVrchol item in rtree.poleListu) {
                item.GetZOrder();
                //Debug.WriteLine(item.Data + "\t" + item.Key);
            }
            rtree.DebugStrom();
            Console.ReadLine();
        }
コード例 #5
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="pushedNodes">nodes that are being pushed</param>
        /// <param name="separation"></param>
        /// <param name="pushingNodes"></param>
        public BumperPusher(IEnumerable<Node> pushedNodes, double separation, Node[] pushingNodes) {
            this.separation = separation;
            rtree = new RTree<Node>(RectangleNode<Node>.CreateRectangleNodeOnEnumeration(
                pushedNodes.Select(n => new RectangleNode<Node>(n, GetPaddedBoxOfNode(n)))));

            //LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(rtree.GetAllLeaves().Select(n=>new DebugCurve(n.BoundaryCurve)));
            this.pushingNodes = pushingNodes;
        }
コード例 #6
0
        public void Setup()
        {
            Instance = new RTree <string>();
            Instance.Add(new Rectangle(0, 0, 0, 0, 0, 0), "Origin");
            Instance.Add(new Rectangle(1, 1, 1, 1, 1, 1), "Box1");

            Instance.Add(new Rectangle(2, 2, 3, 3, 2, 3), "Box 2-3");
        }
コード例 #7
0
ファイル: Program.cs プロジェクト: dested/CTFMMO
        private static List <PlayerCluster> ClusterTree(RTree <Player> tree, List <Player> players, int viewRadius)
        {
            var playerClusterInformations = buildPlayerClusterInformations(tree, players, viewRadius);

            var playerClusters = buildPlayerClusters(players, playerClusterInformations);

            return(playerClusters);
        }
コード例 #8
0
ファイル: RTreeTests.cs プロジェクト: Artsdatabanken/ogapi
        public void Collides_When_Search_Finds_Matching_Points()
        {
            var tree = new RTree <int>(4);

            tree.Load(_data);

            Assert.IsTrue(tree.Collides(new BoundingBox(40, 20, 80, 70)));
        }
コード例 #9
0
ファイル: RTreeTests.cs プロジェクト: Artsdatabanken/ogapi
        public void Collides_Returns_False_If_Nothing_Found()
        {
            var tree = new RTree <int>(4);

            tree.Load(_data);

            Assert.IsFalse(tree.Collides(new BoundingBox(200, 200, 210, 210)));
        }
コード例 #10
0
ファイル: RTreeTests.cs プロジェクト: Artsdatabanken/ogapi
        public void Bulk_Load()
        {
            var tree = new RTree <int>(4);

            tree.Load(_data);

            CompareNodes(_data, tree.All().ToArray(), true);
        }
コード例 #11
0
ファイル: RTreeTests.cs プロジェクト: wubh110/Algorithms
        public void SearchReturnsEmptyResultIfNothingFound()
        {
            var tree = new RTree <Point>(maxEntries: 4);

            tree.BulkLoad(points);

            Assert.AreEqual(new Point[] { }, tree.Search(new Envelope(200, 200, 210, 210)));
        }
コード例 #12
0
        public void SetUp()
        {
            this.factory    = new GeometryFactory();
            this.geometries = new List <IPoint>(Enumerable.Range(1, 1000).Select(value => this.factory.CreatePoint(value, value, value)));

            this.tree = new RTree();
            this.tree.Add(this.geometries);
        }
コード例 #13
0
            public TestableIndexBuilder(IndexSettings settings, IObjectPool objectPool, ITrace trace)
                : base(settings, objectPool, trace)
            {
                Store = new ElementStore(new KeyValueStore(new KeyValueIndex(1000, 3),
                                                           new KeyValueUsage(new MemoryStream()), new MemoryStream()),
                                         new MemoryStream(), TestHelper.GetObjectPool());

                Tree = new RTree <uint>();
            }
コード例 #14
0
ファイル: RTreeTests.cs プロジェクト: wubh110/Algorithms
        public void NonExistentItemCanBeDeleted()
        {
            var tree = new RTree <Point>(maxEntries: 4);

            tree.BulkLoad(points);

            tree.Delete(new Point(13, 13, 13, 13));
            Assert.AreEqual(points.Length, tree.Count);
        }
コード例 #15
0
        public void RTreeCustomShapesCanBeRecycled()
        {
            var  filename = Path.GetTempFileName();
            long indexId  = 0;

            // create the new storage manager
            using (var storageManager = new DiskStorageManager(filename))
            {
                var options = new RTreeOptions()
                {
                    Dimensions      = 2,
                    EnsureTightMBRs = true,
                    TreeVariant     = RTreeVariant.RStar,
                    FillFactor      = 0.9
                };

                storageManager.DatafileSuffix  = "data";
                storageManager.IndexfileSuffix = "index";
                storageManager.Overwrite       = true;
                storageManager.PageSize        = 1024;

                using (var rtree = new RTree <byte[]>(options, storageManager))
                {
                    rtree.Add(new Circle(new Point(0, 0), 16), DataHelpers.GenerateSomeBytes(0x123021));

                    // verify that our circle is a circle
                    var circle = rtree.IntersectsWith(new Point(0, 0));
                    Assert.Equal(1, circle.Count());
                    Assert.Equal(0, rtree.IntersectsWith(new Point(15.99, 15.99)).Count());
                    indexId = rtree.Options.IndexIdentifier;
                }
            }

            // recycle the storage manager
            using (var storageManager = new DiskStorageManager(filename))
            {
                storageManager.DatafileSuffix  = "data";
                storageManager.IndexfileSuffix = "index";
                storageManager.Overwrite       = false;
                storageManager.PageSize        = 1024;

                var options = new RTreeOptions(indexId)
                {
                    Dimensions      = 2,
                    EnsureTightMBRs = true,
                    TreeVariant     = RTreeVariant.RStar,
                    FillFactor      = 0.9
                };

                using (var rtree = new RTree <byte[]>(options, storageManager))
                {
                    // verify that our circle is a circle
                    Assert.Equal(1, rtree.IntersectsWith(new Point(0, 0)).Count());
                    Assert.Equal(0, rtree.IntersectsWith(new Point(15.5, 15.5)).Count());
                }
            }
        }
コード例 #16
0
        public void ShouldAddAnElement()
        {
            var shape = Shape2DFactory.GetShape();
            var tree  = new RTree <Int32>();

            tree.Add(shape);

            Assert.AreEqual(1, tree.Count);
        }
コード例 #17
0
        internal void CreateRailTree()
        {
            _railTree =
                new RTree <Rail>(
                    _railDictionary.Values.Select(rail => new KeyValuePair <Rectangle, Rail>(rail.BoundingBox, rail)));

            Console.WriteLine("edges = {0}, rails = {1}, edge segments = {2}", _railsOfEdges.Count, _railDictionary.Count,
                              _railsOfEdges.Values.Sum(s => s.Count));
        }
コード例 #18
0
ファイル: RTreeTests.cs プロジェクト: wubh110/Algorithms
        public void BulkLoadTestData()
        {
            var tree = new RTree <Point>();

            tree.BulkLoad(points);

            Assert.AreEqual(points.Length, tree.Count);
            Assert.AreEqual(points.OrderBy(x => x).ToList(), tree.Search().OrderBy(x => x).ToList());
        }
コード例 #19
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="pushedNodes">nodes that are being pushed</param>
        /// <param name="separation"></param>
        /// <param name="pushingNodes"></param>
        public BumperPusher(IEnumerable <Node> pushedNodes, double separation, Node[] pushingNodes)
        {
            this.separation = separation;
            rtree           = new RTree <Node, Point>(RectangleNode <Node, Point> .CreateRectangleNodeOnEnumeration(
                                                          pushedNodes.Select(n => new RectangleNode <Node, Point>(n, GetPaddedBoxOfNode(n)))));

            //LayoutAlgorithmSettings.ShowDebugCurvesEnumeration(rtree.GetAllLeaves().Select(n=>new DebugCurve(n.BoundaryCurve)));
            this.pushingNodes = pushingNodes;
        }
コード例 #20
0
 ////////////////////////////////////////////////////////////////////////////
 //--------------------------------- REVISIONS ------------------------------
 // Date       Name                 Tracking #         Description
 // ---------  -------------------  -------------      ----------------------
 // 21DEC2008  James Shen                              Initial Creation
 ////////////////////////////////////////////////////////////////////////////
 protected void Initialize(RTree tree, int dimension, float fillFactor,
                           int capacity, int treeType)
 {
     Dimension    = dimension;
     FillFactor   = fillFactor;
     NodeCapacity = capacity;
     TreeType     = treeType;
     Tree         = tree;
     PageSize     = capacity * (8 * dimension + 4) + 12;
 }
コード例 #21
0
ファイル: RTreeTests.cs プロジェクト: Artsdatabanken/ogapi
        public void Search_Returns_Empty_Enumerable_If_Nothing_Found()
        {
            var tree = new RTree <int>(4);

            tree.Load(_data);

            var result = tree.Search(new BoundingBox(200, 200, 210, 210)).ToList();

            Assert.AreEqual(0, result.Count);
        }
コード例 #22
0
ファイル: RTreeTests.cs プロジェクト: Artsdatabanken/ogapi
        public void All_Returns_All_Points_In_The_Tree()
        {
            var tree = new RTree <int>(4);

            tree.Load(_data);

            var all = tree.All();

            CompareNodes(_data, all.ToArray(), true);
        }
コード例 #23
0
ファイル: CreatModel.cs プロジェクト: rockman864/Gh2Gen
        /// <summary>
        /// 设置荷载对象的单元编号
        /// </summary>
        /// <param name="rt">所有梁单元中点,RTree存储</param>
        /// <param name="beamLoad">被检查的梁单元线荷载</param>
        /// <param name="err">检测误差</param>
        ///
        private void SetBeamLoadEleNo(RTree rt, BeamLoadCls beamLoad, double err)
        {
            Point3d chkPt = beamLoad.LoadLine.PointAt(0.5);
            EventHandler <RTreeEventArgs> rTreeCallback = (object sender, RTreeEventArgs args) =>
            {
                beamLoad.EleNo = args.Id + 1;
            };

            rt.Search(new Sphere(chkPt, err), rTreeCallback);
        }
コード例 #24
0
ファイル: RTreeTests.cs プロジェクト: wubh110/Algorithms
        public void ClearWorks()
        {
            var tree = new RTree <Point>(maxEntries: 4);

            tree.BulkLoad(points);
            tree.Clear();

            Assert.AreEqual(0, tree.Count);
            Assert.IsEmpty(tree.Root.children);
        }
コード例 #25
0
        private RTree <double, Point> CreateOnRecs(List <Rectangle> rects)
        {
            var r = new RTree <double, Point>();

            foreach (var p in rects)
            {
                r.Add(p, p.Area);
            }
            return(r);
        }
コード例 #26
0
ファイル: Tile.cs プロジェクト: vildar82/PanelColorAlbum
        /// <summary>
        /// Покраска блоков плитки в Модели (без блоков АКР-Панелей)
        /// </summary>
        public static void PaintTileInModel(RTree <ColorArea> rtreeColorAreas)
        {
            Database db = HostApplicationServices.WorkingDatabase;

            using (var t = db.TransactionManager.StartTransaction())
            {
                PaintTileInBtr(SymbolUtilityServices.GetBlockModelSpaceId(db), rtreeColorAreas, Matrix3d.Identity);
                t.Commit();
            }
        }
コード例 #27
0
        public static void RtreeSearch(RTree pointsCloud, List <int> PointsIndex, Point3d chkPt, double err, List <int> vertices)
        {
            EventHandler <RTreeEventArgs> rTreeCallback =
                (object sender, RTreeEventArgs args) =>
            {
                vertices.Add(PointsIndex[args.Id]);    //点云中找到某个点跟chkPt比较近的时候,将该点的索引赋予vertices
            };

            pointsCloud.Search(new Sphere(chkPt, err), rTreeCallback);//在空间点云pointsCloud中搜索点chkPt,如果距离小于err,则调用rTreeCallback
        }
コード例 #28
0
ファイル: RTreeTests.cs プロジェクト: wubh110/Algorithms
        public void BulkLoadSplitsTreeProperly()
        {
            var tree = new RTree <Point>(maxEntries: 4);

            tree.BulkLoad(points);
            tree.BulkLoad(points);

            Assert.AreEqual(points.Length * 2, tree.Count);
            Assert.AreEqual(4, tree.Root.Height);
        }
コード例 #29
0
        // . . . . . . . . . . . . . . . . . . . . . . constructor
        public ParticleSystem(List <Point3d> positions, Mesh M)
        {
            Particles = new List <Particle>();
            for (int i = 0; i < positions.Count; i++)
            {
                Particles.Add(new Particle(this, positions[i], RandomVectorOnMesh(M, positions[i], i) * 1.5));
            }

            MeshRTree = PopulateMeshRTree(M);
        }
コード例 #30
0
ファイル: Program.cs プロジェクト: Sprunth/RTreeSharp
        static void Main(string[] args)
        {
            var tree = new RTree();

            tree.Insert(new BoundingBox(20, 3, 5, 10), "value1");
            tree.Insert(new BoundingBox(30, 32, 5, 15), "value2");
            tree.Insert(new BoundingBox(40, 1, 25, 10), "value3");
            tree.Insert(new BoundingBox(40, 1, 25, 12), "value5");
            Console.WriteLine("Hello World!");
        }
コード例 #31
0
ファイル: Recover3DModel.cs プロジェクト: rockman864/Gh2Gen
        /// <summary>
        /// This is the method that actually does the work.
        /// </summary>
        /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param>
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            List <Point3d> PointsCloud_3D       = new List <Point3d>();
            List <int>     PointsIndex_2D       = new List <int>();
            List <Point3d> PointsCoords_2D      = new List <Point3d>();
            List <Line>    Lines_2D             = new List <Line>();
            List <Line>    Lines_3D             = new List <Line>();
            double         err                  = 20;
            RTree          PointsCoords_2DRtree = new RTree();

            bool bool1 = DA.GetDataList(0, PointsCloud_3D);
            bool bool2 = DA.GetDataList(1, PointsIndex_2D);
            bool bool3 = DA.GetDataList(2, PointsCoords_2D);
            bool bool4 = DA.GetDataList(3, Lines_2D);
            bool bool5 = DA.GetData(4, ref err);

            ModelCls model = new ModelCls();

            if (bool1)
            {
                model.Nodes = PointsCloud_3D;
            }
            if (bool2 && bool3)
            {
                for (int i = 0; i < PointsCoords_2D.Count; i++)
                {
                    PointsCoords_2DRtree.Insert(PointsCoords_2D[i], i);
                }
            }
            if (bool1 && bool2 && bool3 && bool4)
            {
                List <BeamElementCls> BeamElements = new List <BeamElementCls>();
                Lines_2D.ForEach(x => BeamElements.Add(new BeamElementCls(x, 1, 1)));

                int num = BeamElements.Count;
                for (int i = 0; i < num; i++)
                {
                    List <int> verticesIndex = new List <int>();
                    for (int j = 0; j < 2; j++)
                    {
                        Point3d chkPt = BeamElements[i].Line.PointAt((double)j);
                        FunctionClass.RtreeSearch(PointsCoords_2DRtree, PointsIndex_2D, chkPt, err, verticesIndex);
                    }
                    if (verticesIndex.Count == 2)
                    {
                        BeamElements[i].Nodes_no = verticesIndex;
                        BeamElements[i].Line     = new Line(PointsCloud_3D[verticesIndex[0] - 1], PointsCloud_3D[verticesIndex[1] - 1]);
                    }
                }
                model.BeamElements = BeamElements;
                BeamElements.ForEach(x => Lines_3D.Add(x.Line));
                DA.SetDataList(0, Lines_3D);
                DA.SetData(2, model);
            }
        }
コード例 #32
0
        RTree PopulateMeshRTree(Mesh M)
        {
            RTree rt = new RTree();

            for (int i = 0; i < M.Vertices.Count; i++)
            {
                rt.Insert((Point3d)M.Vertices[i], i);
            }

            return(rt);
        }
コード例 #33
0
ファイル: RTreeTests.cs プロジェクト: Artsdatabanken/ogapi
        public void Load_Properly_Splits_Tree_Root_When_Merging_Trees_Of_Same_Height()
        {
            var tree = new RTree <int>(4);

            tree.Load(_data);
            tree.Load(_data);

            Assert.AreEqual(4, tree.Height);

            CompareNodes(_data.Concat(_data).ToArray(), tree.All().ToArray(), true);
        }
コード例 #34
0
        public void AllVertexes()
        {
            iFacadeVertexes = new List <Point3d>();
            iFacadeRTree    = new RTree();

            for (int i = 0; i < meshBodies[0].PtMesh.Vertices.Count; i++)
            {
                iFacadeVertexes.Add(meshBodies[0].PtMesh.Vertices[i].ToPoint3d());
                iFacadeRTree.Insert(meshBodies[0].PtMesh.Vertices[i].ToPoint3d(), i);
            }
        }
コード例 #35
0
        private static RTree <BlockSectionKP> GetRtreeBs(List <BlockSectionKP> blocks)
        {
            RTree <BlockSectionKP> rtree = new RTree <BlockSectionKP>  ();

            foreach (var item in blocks)
            {
                Rectangle r = item.Rectangle;
                rtree.Add(r, item);
            }
            return(rtree);
        }
コード例 #36
0
ファイル: Sensable.cs プロジェクト: DavidMann10k/Marionette
        private static void BuildTree()
        {
            Stopwatch watch = new Stopwatch ();
            watch.Start ();

            sensable_tree = new RTree<Sensable> (sensables.Count, sensables.Count);

            foreach (Sensable sensable in sensables) {
                var pos = sensable.transform.position;
                var rect = new Rectangle (new float[]{ pos.x, pos.y, pos.z }, new float[]{ pos.x, pos.y, pos.z });
                sensable_tree.Add (rect, sensable);
            }

            watch.Stop ();
            if (watch.Elapsed.TotalMilliseconds > 0)
                UnityEngine.Debug.Log ("BUILD TREE: " + watch.Elapsed.TotalMilliseconds.ToString ());
        }
コード例 #37
0
        internal List<VisibilityEdge> GetAllGraphEdgesWithEndpointInInteriorOf(IEnumerable<Rectangle> rects,
            double slack = 0.01) {
            var rtree = new RTree<Rectangle>();
            foreach (var rect in rects) {
                var shrinkedRect = rect.Clone();
                shrinkedRect.ScaleAroundCenter(1 - slack);
                rtree.Add(shrinkedRect, shrinkedRect);
            }

            var edges = (from edge in PathRouter.GetAllEdgesVisibilityEdges()
                let qrect1 = new Rectangle(edge.SourcePoint, edge.SourcePoint)
                let qrect2 = new Rectangle(edge.TargetPoint, edge.TargetPoint)
                where rtree.GetAllIntersecting(qrect1).Any() || rtree.GetAllIntersecting(qrect2).Any()
                select edge).ToList();

            return edges;
        }
コード例 #38
0
ファイル: engine.cs プロジェクト: Khalefa/Editdistance-c-
        static void run(ArrayList words)
        {
            double ec = words.Count;
            DateTime st = DateTime.Now;

            rts = new RTree<string>[32];
            for (int i = 0; i < 32; i++) rts[i] = new RTree<string>(100, 50);

            long word_c = searchRtrees(words);
            DateTime t2 = DateTime.Now;
            TimeSpan ts2 = t2 - st;
            Console.WriteLine("level " + level + " exact " + exact);
            Console.WriteLine(ts2);
            //Console.WriteLine(ts1);
            Console.WriteLine(ts2);
            // Console.WriteLine("Count " + word_c);
        }
コード例 #39
0
 public void RTreeQuery_RandomPoints()
 {
     var bspQueryTime = new Stopwatch();
     var checkQueryTime = new Stopwatch();
     const int Seeds = 5;
     const int Repeats = 5;
     for (int seed = 0; seed < Seeds; ++seed)
     {
         int n = 100000;
         var points = new Point[n];
         var rand = new Random(seed);
         double scale = 1000;
         for (int i = 0; i < n; ++i)
         {
             points[i] = new Point(rand.NextDouble() * scale, rand.NextDouble() * scale);
         }
         var queryTree = new RTree<Point>(
             from p in points
             select new KeyValuePair<Rectangle, Point>(new Rectangle(p), p));
         Assert.AreEqual(queryTree.GetAllLeaves().Count(), n);
         Assert.AreEqual(queryTree.GetAllIntersecting(new Rectangle(-2, -2, -1, -1)).Count(), 0);
         Assert.AreEqual(queryTree.GetAllIntersecting(new Rectangle(0, 0, scale, scale)).Count(), n);
         for (int i = 0; i < Repeats; ++i)
         {
             double s = scale / 100;
             var query = new Rectangle(rand.NextDouble() * s, rand.NextDouble() * s, rand.NextDouble() * s, rand.NextDouble() * s);
             bspQueryTime.Start();
             var result = queryTree.GetAllIntersecting(query).ToList();
             bspQueryTime.Stop();
             checkQueryTime.Start();
             var checkList = (from p in points
                              where query.Contains(p)
                              select p).ToList();
             checkQueryTime.Stop();
             var checkSet = new HashSet<Point>(checkList);
             Assert.AreEqual(result.Count, checkList.Count);
             foreach (var r in result)
             {
                 Assert.IsTrue(query.Contains(r));
                 Assert.IsTrue(checkSet.Contains(r));
             }
         }
         Assert.IsTrue(bspQueryTime.ElapsedMilliseconds < checkQueryTime.ElapsedMilliseconds);
     }
 }
コード例 #40
0
ファイル: Program.cs プロジェクト: wangchj/geo-store-sim
        static void Main(string[] args)
        {
            RTree<int> rtree1 = new RTree<int>(4, 0);
            //rtree1.Add(new Rectangle(30, 30, 30, 30, 0, 0), 101);
            //rtree1.Add(new Rectangle(12, 12, 12, 12, 0, 0), 102);
            //rtree1.Add(new Rectangle(14, 14, 14, 14, 0, 0), 103);
            //rtree1.Add(new Rectangle(16, 16, 16, 16, 0, 0), 104);
            //rtree1.Add(new Rectangle(35, 35, 35, 35, 0, 0), 105);

            rtree1.Add(new Rectangle(2, 6, 2, 6, 0, 0), 1);
            rtree1.Add(new Rectangle(2.5f, 6, 2.5f, 6, 0, 0), 2);
            rtree1.Add(new Rectangle(3, 5, 3, 5, 0, 0), 3);
            rtree1.Add(new Rectangle(3, 6, 3, 6, 0, 0), 4);
            rtree1.Add(new Rectangle(3.5f, 6, 3.5f, 6, 0, 0), 5);
            rtree1.Add(new Rectangle(4, 6, 4, 6, 0, 0), 6);
            rtree1.Add(new Rectangle(1.5f, 5.5f, 1.5f, 5.5f, 0, 0), 7);
            rtree1.Add(new Rectangle(1.5f, 5.1f, 1.5f, 5.1f, 0, 0), 8);
            rtree1.Add(new Rectangle(3.5f, 5.5f, 3.5f, 5.5f, 0, 0), 9);
            rtree1.Add(new Rectangle(4, 5.5f, 4, 5.5f, 0, 0), 10);
            rtree1.Add(new Rectangle(4.5f, 5.5f, 4.5f, 5.5f, 0, 0), 11); //k
            Console.WriteLine("End Of Program");
        }
コード例 #41
0
        private RTree<int> LoadRTree(string dataPath, int maxNode)
        {
            string rex = @"\w+ (\S+) (\S+)";
            RTree<int> rtree = null;
            StreamReader streamReader = null;
            int count = 0;

            try
            {
                rtree = new RTree<int>(maxNode, 0);
                streamReader = new StreamReader(dataPath);
                for (string line = streamReader.ReadLine();
                    line != null;
                    line = streamReader.ReadLine())
                {
                    Match match = Regex.Match(line, rex);
                    if (match.Success)
                    {
                        float lat = float.Parse(match.Groups[2].Value);
                        float lon = float.Parse(match.Groups[1].Value);
                        rtree.Add(new Rectangle(lat, lon, lat, lon, 0, 0), count);
                        count++;
                    }
                }

                return rtree;
            }
            catch (Exception ex)
            {
                Console.WriteLine("Unable to load RTree data: " +
                    ex.Message);
                return null;
            }
            finally
            {
                if (streamReader != null) streamReader.Close();
            }
        }
コード例 #42
0
        internal bool Run() {
            if (metroGraphData.Edges.Count() == 0) return false;

            var splittingPoints = new Dictionary<PointPair, List<Point>>();
            var treeOfVertices = new RTree<Point>();
            foreach (var vertex in Vertices()) {
                var r = new Rectangle(vertex.Point);
                r.Pad(ApproximateComparer.IntersectionEpsilon);
                treeOfVertices.Add(r, vertex.Point);
            }

            var treeOfEdges = RectangleNode<PointPair>.CreateRectangleNodeOnData(Edges(), e => new Rectangle(e.First, e.Second));
            RectangleNodeUtils.CrossRectangleNodes<PointPair>(treeOfEdges, treeOfEdges, (a, b) => IntersectTwoEdges(a, b, splittingPoints, treeOfVertices));

            SortInsertedPoints(splittingPoints);
            bool pointsInserted = InsertPointsIntoPolylines(splittingPoints);

            bool progress = FixPaths();

            bool pointsRemoved = RemoveUnimportantCrossings();

            return progress || pointsInserted || pointsRemoved;
        }
コード例 #43
0
ファイル: Model.cs プロジェクト: Khalefa/VLDBDemo_win
 public static ModelTree BTree(double[] error_level)
 {
     int period = ts.freq[ts.freq.Length - 1];
     int n = ts.Length / period;
     ArrayList ranges = new ArrayList();
     for (int i = 0; i < n; i++)
     {
         Range r = new Range(i * period, (i + 1) * period - 1);
         r.computed = 1;
         r.matched=1;
         ranges.Add(r);
     }
     ArrayList all_ranges = new ArrayList();
     //all_ranges.Add(ranges);
     ArrayList nr;
     foreach (double i in error_level)
     {
         nr = Level(ranges, i);
         all_ranges.Add(nr);
         ranges = nr;
     }
     ArrayList top = (ArrayList)all_ranges[all_ranges.Count - 1];
     if (top.Count == 0)
     {
         top.Add(new Range(0, ts.Length - 1));
         all_ranges[all_ranges.Count - 1] = top;
     }
     top = (ArrayList)all_ranges[all_ranges.Count - 1];
     if (top.Count != 1)
     {
         ArrayList a=new ArrayList();
         a.Add(new Range(0, ts.Length - 1));
         all_ranges.Add(a);
     }
     RTree rt = new RTree(all_ranges,ts);
     return rt.root.t;
 }
コード例 #44
0
 StaircaseRemover(List<Path> paths, RectangleNode<Polyline> hierarchyOfObstacles) {
     HierarchyOfObstacles = new RTree<Polyline>(hierarchyOfObstacles);
     Paths = paths;
 }
コード例 #45
0
ファイル: MbrEvaluator.cs プロジェクト: wangchj/geo-store-sim
        /// <summary>
        /// 
        /// </summary>
        /// <param name="center"></param>
        /// <param name="k"></param>
        /// <returns></returns>
        public override int KnnQuery(RTree.Point center, int k)
        {
            return 0;
            /*
            //Stage 1

            SortedList<float, List<MBR>> nearestMBR =
                new SortedList<float, List<MBR>>();
            foreach (MBR mbr in this.mbrs)
            {
                //Get distance between center and node MBR.
                List<float> bounds = mbr.getBounts();
                Rectangle tempRec = new Rectangle(bounds[0], bounds[1], bounds[2], bounds[3], 0, 0);
                float dist = tempRec.distance(center);

                //See if this node can be ignored.
                if (nearestMBR.Count >= k &&
                        dist >= nearestMBR.Keys[nearestMBR.Count - 1])
                    continue;

                if (nearestMBR.ContainsKey(dist))
                {
                    nearestMBR[dist].Add(mbr);
                }
                else
                {
                    List<MBR> l = new List<MBR>();
                    l.Add(mbr);
                    nearestMBR.Add(dist, l);
                }

                //if (nearestNodes.Count > 2 * k)
                //    nearestNodes.Capacity = k;
            }

            //nearestNodes.Capacity = k;

            //Stage 2
            //Get a list of closest objects and their
            //containing node.
            SortedList<float, List<int>> nearestObj = new SortedList<float, List<int>>();
            foreach (List<MBR> list in nearestMBR.Values)
            {
                foreach (Node<int> node in list)
                {
                    for (int i = 0; i < node.getEntryCount(); i++)
                    {
                        Rectangle rec = node.getEntry(i);
                        float dist = rec.distance(center);

                        //If the distance is larger than k-th object, ignore.
                        if (nearestObj.Count >= k &&
                            dist >= nearestObj.Keys[nearestObj.Count - 1])
                            continue;

                        if (nearestObj.ContainsKey(dist))
                        {
                            nearestObj[dist].Add(node.NodeId);
                        }
                        else
                        {
                            List<int> l = new List<int>();
                            l.Add(node.NodeId);
                            nearestObj.Add(dist, l);
                        }
                    }

                    //if (nearestObj.Count > 2 * k)
                    //    nearestObj.Capacity = k;
                }
            }

            //if (nearestObj.Count > k)
            //    nearestObj.Capacity = k;

            //Stage 3

            HashSet<int> NodeIdSet = new HashSet<int>();
            int result = 0;
            int count = 0;
            foreach (List<int> list in nearestObj.Values)
            {
                foreach (int id in list)
                {
                    count++;
                    if (!NodeIdSet.Contains(id))
                    {
                        result += nodeMap[id].getEntryCount();
                        NodeIdSet.Add(id);
                    }
                    if (count >= k)
                        return result;
                }
            }

            return result;*/
        }
コード例 #46
0
 internal void CreateEmptyRailTree() {
     _railTree = new RTree<Rail>();
 }
コード例 #47
0
        bool TopologyForCallingTriangleIsCorrect() {
            Point[] indexToPoints = new Point[_pointsToIndices.Count];
            foreach (var pp in _pointsToIndices) {
                indexToPoints[pp.Value] = pp.Key;
            }

            var tree =
                new RTree<Point>(_pointsToIndices.Keys.Select(p => new KeyValuePair<Rectangle, Point>(new Rectangle(p), p)));
            var badSegs = (from e in _segments let overlaps = GetPointsOverlappingSeg(e, tree, indexToPoints) where overlaps.Count > 2 select e).ToList();

#if TEST_MSAGL
            if (badSegs.Any())
               ShowInputSegments(badSegs, indexToPoints);
#endif
            return !badSegs.Any();
        }
コード例 #48
0
ファイル: MbrEvaluator.cs プロジェクト: wangchj/geo-store-sim
 public override int RangeQuery(RTree.Point center, float range)
 {
     throw new NotImplementedException();
 }
コード例 #49
0
        public void RTreeQuery_IncrementalRectangles()
        {
            const int RectsCount = 1000;
            const int RegionSize = 1000;
            const int RectSize = 10;
            for (int seed = 0; seed < 1; ++seed)
            {
                var rects = new Rectangle[RectsCount];
                var rand = new Random(seed);
                for (int i = 0; i < RectsCount; ++i)
                {
                    rects[i] = new Rectangle(new Point(rand.Next(RegionSize), rand.Next(RegionSize)));
                }

                // create rTree with just the first rectangle
                var l = new List<KeyValuePair<Rectangle, Rectangle>>
                            {
                                new KeyValuePair<Rectangle, Rectangle>(rects[0], rects[0])
                            };
                var queryTree = new RTree<Rectangle>(l);

                // add remaining rectangles 10 at a time
                for (int a = 1, b = 10; b < RectsCount; a = b, b += 10)
                {
                    for (int i = a; i < b; ++i)
                    {
                        queryTree.Add(rects[i], rects[i]);
                    }
                    Assert.AreEqual(queryTree.GetAllLeaves().Count(), b, "did we lose leaves?");
                    Assert.AreEqual(queryTree.GetAllIntersecting(
                        new Rectangle(0, 0, RegionSize + RectSize, RegionSize + RectSize)).Count(), b,
                        "are all leaves inside the max range?");
                    Assert.AreEqual(queryTree.GetAllIntersecting(new Rectangle(-2, -2, -1, -1)).Count(), 0,
                        "should be no leaves inside this rectangle!");
                    var query = new Rectangle(rand.Next(RegionSize), rand.Next(RegionSize), rand.Next(RegionSize), rand.Next(RegionSize));
                    var checkList = (from r in rects.Take(b)
                                     where query.Intersects(r)
                                     select r).ToList();
                    var checkSet = new HashSet<Rectangle>(checkList);
                    var result = queryTree.GetAllIntersecting(query).ToList();
                    Assert.AreEqual(result.Count, checkList.Count, "result and check are different sizes: seed={0}", seed);
                    foreach (var r in result)
                    {
                        Assert.IsTrue(query.Intersects(r), "rect doesn't intersect query: seed={0}, rect={1}, query={2}", seed, r, query);
                        Assert.IsTrue(checkSet.Contains(r), "check set does not contain rect: seed={0}", seed);
                    }
                }
            }
        }
コード例 #50
0
ファイル: Program.cs プロジェクト: Khalefa/FilterTree
        static void run()
        {
            ArrayList words = readinput("c:\\data\\web2.txt");
            double ec = words.Count;
            DateTime st = DateTime.Now;
            FilterTree ft = new FilterTree(words);
            TimeSpan ts = DateTime.Now - st;
            pair xx1 = ft.join(ft, 1);
            //pair xx2 = ft.join(ft, 2);
            DateTime et = DateTime.Now;
            Console.WriteLine(ts);
            Console.WriteLine(et - st);
            long c1 = (long)xx1.second;
               // long c2 = (long)xx2.second;
            Console.WriteLine(ec);
            Console.WriteLine(c1 / ec / ec);

            RTree<Node> rt = new RTree<Node>();

            foreach (Node w in ft.root.children.Values)
            {
                rt.Add(new Rectangle(w.p), w);
            }
            RTree<Node> rt1 = new RTree<Node>();
            //ArrayList leafs1 = ft.getLeafs(1);
            foreach (Node w1 in ft.root.children.Values)
            {
                rt1.Add(new Rectangle(w1.p), w1);
            }
            List<pair> a= rt.joins(rt1, 1);
            long matches = 0;
            foreach (pair p in a)
            {
                Node p1 = (Node)p.first;
                Node p2 = (Node)p.second;
                matches+=p1.words.Count * p2.words.Count;
            }
            //Console.WriteLine(c2 / ec / ec);
        }
コード例 #51
0
 /// <summary>
 /// ignoring crossing at ls.Start
 /// </summary>
 /// <param name="ls"></param>
 /// <param name="rTree"></param>
 /// <param name="segsToIgnore"></param>
 /// <returns></returns>
 static bool IsCrossing(LineSegment ls, RTree<SegWithIndex> rTree, SegWithIndex[] segsToIgnore) {
     return rTree.GetAllIntersecting(ls.BoundingBox).Where(seg => !segsToIgnore.Contains(seg)).Any();
 }
 void DrawFixedRectsSegments(RTree<Rectangle> fixedRectanglesTree,
     RTree<SymmetricSegment> fixedSegmentsTree) {
     foreach (var fr in fixedRectanglesTree.GetAllLeaves())
         DrawRectDilated(fr);
     foreach (var seg in fixedSegmentsTree.GetAllLeaves()) {
         DrawLineSegDilated(seg.A, seg.B);
     }
 }
        public int PositionAllMoveableRectsSameSize(int startInd, RTree<Rectangle> fixedRectanglesTree,
            RTree<SymmetricSegment> fixedSegmentsTree) {
            Console.WriteLine("\nRemoving overlaps");
            int i;
            if (_moveableRectangles.Length == 0) return 0;

            InitInsertRectSize(_moveableRectangles[startInd]);

            DrawFixedRectsSegments(fixedRectanglesTree, fixedSegmentsTree);

            for (i = startInd; i < _moveableRectangles.Length; i++) {
                var rect = _moveableRectangles[i];

                bool couldInsert;

                if (IsPositionFree(rect.Center)) {
                    movedRectangles[i] = rect;
                    couldInsert = true;
                }
                else {
                    Point newPos;
                    couldInsert = FindClosestFreePos(rect.Center, out newPos);
                    movedRectangles[i] = Translate(rect, newPos - rect.Center);
                }

                if (!couldInsert) {
                    return i;
                }

                fixedRectanglesTree.Add(movedRectangles[i], movedRectangles[i]);
                DrawRectDilated(movedRectangles[i]);

                if (i%10 == 0) {
                    Console.Write(".");
                }
            }
            return _moveableRectangles.Length;
        }
コード例 #54
0
 /// <summary>
 /// Construct an instance with data and RTree max node.
 /// </summary>
 /// <param name="dataPath">The data of the RTree. This file
 /// must be in the specified format.</param>
 /// <param name="maxNode">The maximum number of entries in a
 /// node of the RTree.</param>
 public RTreeQueryEvaluator(string dataPath, int maxNode)
 {
     if (dataPath == null) throw new ArgumentNullException();
     if ((this.rtree = LoadRTree(dataPath, maxNode)) == null)
         throw new ApplicationException("Unable to load RTree");
 }
コード例 #55
0
 public void RTreeQuery_Rectangles()
 {
     const int Seeds = 100;
     const int RectCount = 1000;
     const int RegionSize = 1000;
     const int RectSize = 10;
     for (int seed = 0; seed < Seeds; ++seed)
     {
         var rects = new Rectangle[RectCount];
         var rand = new Random(seed);
         for (int i = 0; i < RectCount; ++i)
         {
             rects[i] = new Rectangle(rand.Next(RegionSize), rand.Next(RegionSize), new Point(RectSize, RectSize));
         }
         var bsptree = new RTree<Rectangle>(
             from r in rects
             select new KeyValuePair<Rectangle, Rectangle>(r, r));
         Assert.AreEqual(bsptree.GetAllLeaves().Count(), RectCount);
         Assert.AreEqual(bsptree.GetAllIntersecting(new Rectangle(0, 0, RegionSize + RectSize, RegionSize + RectSize)).Count(), RectCount);
         Assert.AreEqual(bsptree.GetAllIntersecting(new Rectangle(-2, -2, -1, -1)).Count(), 0);
         var query = new Rectangle(rand.Next(RegionSize), rand.Next(RegionSize), rand.Next(RegionSize), rand.Next(RegionSize));
         var checkList = (from r in rects
                          where query.Intersects(r)
                          select r).ToList();
         var checkSet = new HashSet<Rectangle>(checkList);
         var result = bsptree.GetAllIntersecting(query).ToList();
         Assert.AreEqual(result.Count, checkList.Count, "result and check are different sizes: seed={0}", seed);
         foreach (var r in result)
         {
             Assert.IsTrue(query.Intersects(r), "rect doesn't intersect query: seed={0}, rect={1}, query={2}", seed, r, query);
             Assert.IsTrue(checkSet.Contains(r), "check set does not contain rect: seed={0}", seed);
         }
     }
 }
コード例 #56
0
ファイル: Program.cs プロジェクト: dested/CTFMMO
        private static List<PlayerCluster> ClusterTree(RTree<Player> tree, List<Player> players, int viewRadius)
        {
            var playerClusterInformations = buildPlayerClusterInformations(tree, players, viewRadius);

            var playerClusters = buildPlayerClusters(players, playerClusterInformations);
            return playerClusters;

        }
コード例 #57
0
ファイル: Program.cs プロジェクト: dested/CTFMMO
        private static Dictionary<Player, PlayerClusterInfo> buildPlayerClusterInformations(RTree<Player> tree, List<Player> players, int viewRadius)
        {
            Dictionary<Player, PlayerClusterInfo> playerClusterInformations = new Dictionary<Player, PlayerClusterInfo>();

            for (int index = 0; index < players.Count; index++)
            {
                var currentPlayer = players[index];
                List<Player> nearest = tree.Nearest(new Point(currentPlayer.X, currentPlayer.Y), viewRadius);

                PlayerClusterInfo playerClusterInfo = new PlayerClusterInfo(currentPlayer);

                for (int i = 0; i < nearest.Count; i++)
                {
                    var nearPlayer = nearest[i];
                    if (nearPlayer == currentPlayer) continue;
                    playerClusterInfo.Neighbors.Add(new Tuple<double, Player>(pointDistance(nearPlayer, currentPlayer), nearPlayer));
                }

                playerClusterInformations.Add(currentPlayer, playerClusterInfo);
            }
            return playerClusterInformations;
        }
コード例 #58
0
ファイル: Program.cs プロジェクト: dested/CTFMMO
        private static void start()
        {
            canvas = (CanvasElement)Document.GetElementById("canvas");
            context = (CanvasRenderingContext2D)canvas.GetContext(CanvasContextId.Render2D);

            Offset = new Vector2(0, 0);

            Vector2 draggingPos = null;
            canvas.OnMousedown = @event =>
            {
                int mouseX = ((dynamic)@event).pageX;
                int mouseY = ((dynamic)@event).pageY;
                draggingPos = new Vector2(mouseX, mouseY);
            };
            canvas.OnMouseup = @event =>
            {
                /*
                                if (draggingPos == null) return;

                                int mouseX = ((dynamic)@event).pageX;
                                int mouseY = ((dynamic)@event).pageY;

                                draggingPos = new Vector2(draggingPos.X - mouseX, draggingPos.Y - mouseY);

                                Offset = new Vector2(Offset.X + draggingPos.X, Offset.Y + draggingPos.Y);
                                draw();


                */
                draggingPos = null;
            };
            Document.OnMousemove = @event =>
            {
                if (draggingPos == null) return;

                int mouseX = ((dynamic)@event).pageX;
                int mouseY = ((dynamic)@event).pageY;

                Offset = new Vector2(Offset.X + (draggingPos.X - mouseX) * 6, Offset.Y + (draggingPos.Y - mouseY) * 6);

                draggingPos = new Vector2(mouseX, mouseY);
                Draw();
            };



            canvas.Width = Document.Body.ClientWidth - 100;
            canvas.Height = Document.Body.ClientHeight - 100;
            context.Save();
            context.Font = "50px Arial";
            context.FillText("Loading...", canvas.Width / 2, canvas.Height / 2);
            context.Restore();


            Window.OnKeydown = @event =>
            {
                if (((dynamic)@event).keyCode == 17)
                {
                    drawLines = !drawLines;
                }
                Draw();
            };


        
             


            Window.SetTimeout(() =>
            {
                Console.WriteLine("Started");
                Console.Profile();

                Stopwatch sw = new Stopwatch();
                sw.Start();
                tree = new RTree<Player>();
                players = new List<Player>();
                for (int j = 0; j < numberOfPlayers; j++)
                {
                    var player = new Player(nextId());
                    player.X = rand.Next(0, gameSize);
                    player.Y = rand.Next(0, gameSize);
                    players.Add(player);
                    tree.Add(new Rectangle(player.X, player.Y), player);
                }

                buildClusters(viewRadius);

                sw.Stop();
                Console.ProfileEnd();
                Console.WriteLine(string.Format("Time {0}", sw.ElapsedMilliseconds));
                Console.WriteLine("Done");
                Draw();
            });
        }
コード例 #59
0
/*
        void AddSegsHandlingOverlaps(SymmetricTuple<int> seg, RTree<Point> tree, Point[] indexToPoints) {
            var overlaps = GetPointsOverlappingSeg(seg, tree,indexToPoints);
            if (overlaps.Count <= 2) {
                _segments.Insert(seg);
                return;
            }
            Point ep0 = indexToPoints[seg.A];
            AddSegment(ep0, overlaps[1]);
            AddSegment(overlaps[overlaps.Count - 2], indexToPoints[seg.B]);
            if (overlaps.Count > 3) {
                AddSegsHandlingOverlaps(new SymmetricTuple<int>(_pointIndices[overlaps[1]],_pointIndices[overlaps[overlaps.Count - 2]]), tree, indexToPoints);
            }
        }
*/

        List<Point> GetPointsOverlappingSeg(SymmetricTuple<int> seg, RTree<Point> tree, Point[] indexToPoints) {
            Point p0 = indexToPoints[seg.A];
            Point p1 = indexToPoints[seg.B];
            var rect = new Rectangle(p0, p1);
            rect.Pad(1e-5);

            Point[] vts = tree.GetAllIntersecting(rect).ToArray();

            double t;
            var vtsOverlapping = vts.Where(p => Point.DistToLineSegment(p, p0, p1, out t) < 1e-5).ToList();

            vtsOverlapping = vtsOverlapping.OrderBy(p => (p - p0).Length).ToList();
            if (vtsOverlapping.Count > 2) {
                Console.WriteLine("overlapping points");
                foreach (var v in vtsOverlapping)
                    Console.WriteLine(v);
            }
            return vtsOverlapping;
        }
コード例 #60
0
        public static List<FacadeFrontBlock> GetFacadeFrontBlocks(BlockTableRecord ms, List<FloorMounting> floors)
        {
            List<FacadeFrontBlock> facadeFrontBlocks = new List<FacadeFrontBlock>();
            foreach (ObjectId idEnt in ms)
            {
                var blRef = idEnt.GetObject(OpenMode.ForRead, false, true) as BlockReference;
                if (blRef == null) { continue; }
                // Если это блок обозначения стороны фасада - по имени блока
                if (string.Equals(blRef.GetEffectiveName(), Settings.Default.BlockFacadeName, StringComparison.CurrentCultureIgnoreCase))
                {
                    FacadeFrontBlock front = new FacadeFrontBlock(blRef);
                    facadeFrontBlocks.Add(front);
                }
            }
            // Найти все блоки монтажных панелей входящих в фасад
            RTree<FloorMounting> rtreeFloors = new RTree<FloorMounting>();
            foreach (var front in floors)
            {
                try
                {
                    rtreeFloors.Add(front.RectangleRTree, front);
                }
                catch { }
            }
            foreach (var front in facadeFrontBlocks)
            {
                // найти соотв обозн стороны фасада
                var frontsIntersects = rtreeFloors.Intersects(front.RectangleRTree);

                // если нет пересечений фасадов - пропускаем блок монтажки - он не входит в
                // фасады, просто так вставлен
                if (frontsIntersects.Count == 0)
                {
                    Inspector.AddError($"Для блока обозначения стороны фасада не найдены монтажные планы.", front.IdBlRef, System.Drawing.SystemIcons.Error);
                    continue;
                }
                foreach (var item in frontsIntersects)
                {
                    front.AddPanels(item);
                }
                front.DefineMinMax();
            }
            return facadeFrontBlocks;
        }