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); }
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); } }
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"); }
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"); }
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; }
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); }