Пример #1
0
        public TriangleMatrix(TriangleCollection tc, Logger logger)
        {
            this.logger = logger;

            System.DateTime pre = System.DateTime.Now;
            logger.WriteLine("Build hash  " + tc.GetNumberOfTriangles());
            matrix = new SparseFloatMatrix2D <List <int> >(resolution, tc.GetNumberOfTriangles());

            Vector vertex0;
            Vector vertex1;
            Vector vertex2;

            for (int i = 0; i < tc.GetNumberOfTriangles(); i++)
            {
                tc.GetTriangleVertices(i,
                                       out vertex0.x, out vertex0.y, out vertex0.z,
                                       out vertex1.x, out vertex1.y, out vertex1.z,
                                       out vertex2.x, out vertex2.y, out vertex2.z);

                float minx = Utils.min(vertex0.x, vertex1.x, vertex2.x);
                float maxx = Utils.max(vertex0.x, vertex1.x, vertex2.x);
                float miny = Utils.min(vertex0.y, vertex1.y, vertex2.y);
                float maxy = Utils.max(vertex0.y, vertex1.y, vertex2.y);

                Vector box_center;
                Vector box_halfsize;
                box_halfsize.x = resolution / 2;
                box_halfsize.y = resolution / 2;
                box_halfsize.z = 1E6f;

                int startx = matrix.LocalToGrid(minx);
                int endx   = matrix.LocalToGrid(maxx);
                int starty = matrix.LocalToGrid(miny);
                int endy   = matrix.LocalToGrid(maxy);

                for (int x = startx; x <= endx; x++)
                {
                    for (int y = starty; y <= endy; y++)
                    {
                        float grid_x = matrix.GridToLocal(x);
                        float grid_y = matrix.GridToLocal(y);
                        box_center.x = grid_x + resolution / 2;
                        box_center.y = grid_y + resolution / 2;
                        box_center.z = 0;
                        if (Utils.TestTriangleBoxIntersect(vertex0, vertex1, vertex2, box_center, box_halfsize))
                        {
                            AddTriangleAt(grid_x, grid_y, i);
                        }
                    }
                }
            }
            System.DateTime post = System.DateTime.Now;
            System.TimeSpan ts   = post.Subtract(pre);
            logger.WriteLine("done " + maxAtOne + " time " + ts);
        }
Пример #2
0
 public void AddAllTrianglesFrom(TriangleCollection set)
 {
     for (int i = 0; i < set.GetNumberOfTriangles(); i++)
     {
         float v0x, v0y, v0z;
         float v1x, v1y, v1z;
         float v2x, v2y, v2z;
         set.GetTriangleVertices(i,
                                 out v0x, out v0y, out v0z,
                                 out v1x, out v1y, out v1z,
                                 out v2x, out v2y, out v2z);
         int v0 = AddVertex(v0x, v0y, v0z);
         int v1 = AddVertex(v1x, v1y, v1z);
         int v2 = AddVertex(v2x, v2y, v2z);
         AddTriangle(v0, v1, v2);
     }
 }
Пример #3
0
        public TriangleQuadtree(TriangleCollection tc)
        {
            Console.WriteLine("Build oct " + tc.GetNumberOfTriangles());
            this.tc = tc;
            tc.GetBBox(out min.x, out min.y, out min.z,
                       out max.x, out max.y, out max.z);
            rootNode = new Node(this, min, max);

            SimpleLinkedList tlist = new SimpleLinkedList();

            for (int i = 0; i < tc.GetNumberOfTriangles(); i++)
            {
                tlist.AddNew(i);
            }
            rootNode.Build(tlist, 0);
            Console.WriteLine("done");
        }
Пример #4
0
        public TriangleOctree(TriangleCollection tc)
        {
            PathGraph.Log("Build oct " + tc.GetNumberOfTriangles());
            this.tc = tc;
            tc.GetBBox(out min.x, out min.y, out min.z,
                       out max.x, out max.y, out max.z);
            rootNode = new Node(this, min, max);

            var tlist = new SimpleLinkedList();

            for (int i = 0; i < tc.GetNumberOfTriangles(); i++)
            {
                tlist.AddNew(i);
            }
            rootNode.Build(tlist, 0);
            PathGraph.Log("done");
        }
Пример #5
0
        public TriangleOctree(TriangleCollection tc, Logger logger)
        {
            this.logger = logger;
            logger.WriteLine("Build oct " + tc.GetNumberOfTriangles());
            this.tc = tc;
            tc.GetBBox(out min.x, out min.y, out min.z,
                       out max.x, out max.y, out max.z);
            rootNode = new Node(this, min, max, this.logger);

            SimpleLinkedList tlist = new SimpleLinkedList(this.logger);

            for (int i = 0; i < tc.GetNumberOfTriangles(); i++)
            {
                tlist.AddNew(i);
            }
            rootNode.Build(tlist, 0);
            logger.WriteLine("done");
        }
        private void LoadChunkAt(float x, float y)
        {
            int grid_x, grid_y;

            GetGridStartAt(x, y, out grid_x, out grid_y);

            if (chunks.IsSet(grid_x, grid_y))
            {
                return;
            }
            EvictIfNeeded();
            TriangleCollection tc = new TriangleCollection(this.logger);

            float min_x, max_x, min_y, max_y;

            GetGridLimits(grid_x, grid_y, out min_x, out min_y, out max_x, out max_y);

            Console.WriteLine("Got asked for triangles at " + x + ", " + y);
            Console.WriteLine("Need triangles grid (" + min_x + " , " + min_y + ") - (" + max_x + ", " + max_y);

            tc.SetLimits(min_x - 1, min_y - 1, -1E30f, max_x + 1, max_y + 1, 1E30f);
            foreach (TriangleSupplier s in suppliers)
            {
                s.GetTriangles(tc, min_x, min_y, max_x, max_y);
            }
            tc.CompactVertices();
            tc.ClearVertexMatrix(); // not needed anymore
            tc.base_x = grid_x;
            tc.base_y = grid_y;
            Console.WriteLine("  it got " + tc.GetNumberOfTriangles() + " triangles and " + tc.GetNumberOfVertices() + " vertices");

            loadedChunks.Add(tc);
            NotifyChunkAdded?.Invoke(new ChunkAddedEventArgs(tc));
            System.Threading.Thread.Sleep(1000);

            chunks.Set(grid_x, grid_y, tc);

            Console.WriteLine("Got triangles grid (" + tc.min_x + " , " + tc.min_y + ") - (" + tc.max_x + ", " + tc.max_y);
            m_Updated = true;
        }
Пример #7
0
        private void LoadChunkAt(float x, float y)
        {
            int grid_x, grid_y;

            GetGridStartAt(x, y, out grid_x, out grid_y);

            if (chunks.IsSet(grid_x, grid_y))
            {
                return;
            }
            EvictIfNeeded();
            var tc = new TriangleCollection();


            float min_x, max_x, min_y, max_y;

            GetGridLimits(grid_x, grid_y, out min_x, out min_y, out max_x, out max_y);

            PathGraph.Log("Got asked for triangles at " + x + ", " + y);
            PathGraph.Log("Need triangles grid (" + min_x + " , " + min_y + ") - (" + max_x + ", " + max_y);

            tc.SetLimits(min_x - 1, min_y - 1, -1E30f, max_x + 1, max_y + 1, 1E30f);
            foreach (TriangleSupplier s in suppliers)
            {
                s.GetTriangles(tc, min_x, min_y, max_x, max_y);
            }
            tc.CompactVertices();
            tc.ClearVertexMatrix(); // not needed anymore
            tc.base_x = grid_x;
            tc.base_y = grid_y;
            PathGraph.Log("  it got " + tc.GetNumberOfTriangles() + " triangles and " + tc.GetNumberOfVertices() +
                          " vertices");


            loadedChunks.Add(tc);
            chunks.Set(grid_x, grid_y, tc);


            PathGraph.Log("Got triangles grid (" + tc.min_x + " , " + tc.min_y + ") - (" + tc.max_x + ", " + tc.max_y);
        }