/// <summary> /// Creates a new model from all the points that make up the "Top" surface /// of the DMT Model (i.e. those triangles that can be seen in entirety from above). /// </summary> /// <returns>DMTModel object of the top surface.</returns> public DMTModel SurfaceFromTop() { //Get the points that make up the top surface PointCloud topSurfacePoints = PointCloudFromTop(); DMTModel topSurfaceDMT = new DMTModel(); foreach (DMTTriangleBlock block in _blocks) { DMTTriangleBlock newBlock = new DMTTriangleBlock(); for (int intTriangleNo = 0; intTriangleNo <= TotalNoOfTriangles - 1; intTriangleNo++) { Point vertex1 = null; Point vertex2 = null; Point vertex3 = null; vertex1 = block.GetVertex1(intTriangleNo); vertex2 = block.GetVertex2(intTriangleNo); vertex3 = block.GetVertex3(intTriangleNo); // See if this triangle is part of the top surface if (topSurfacePoints.Contains(vertex1) && topSurfacePoints.Contains(vertex2) && topSurfacePoints.Contains(vertex3)) { // Add the vertices to the list of vertices if they are not already in there int vertex1Index = 0; int vertex2Index = 0; int vertex3Index = 0; if (newBlock.TriangleVertices.Contains(vertex1)) { vertex1Index = newBlock.TriangleVertices.IndexOf(vertex1); } else { vertex1Index = newBlock.TriangleVertices.Count; newBlock.TriangleVertices.Add(vertex1); } if (newBlock.TriangleVertices.Contains(vertex2)) { vertex2Index = newBlock.TriangleVertices.IndexOf(vertex2); } else { vertex2Index = newBlock.TriangleVertices.Count; newBlock.TriangleVertices.Add(vertex2); } if (newBlock.TriangleVertices.Contains(vertex3)) { vertex3Index = newBlock.TriangleVertices.IndexOf(vertex3); } else { vertex3Index = newBlock.TriangleVertices.Count; newBlock.TriangleVertices.Add(vertex3); } // Create a new DMTTriangle that points to the Nodes newBlock.TriangleFirstVertexIndices.Add(vertex1Index); newBlock.TriangleSecondVertexIndices.Add(vertex2Index); newBlock.TriangleThirdVertexIndices.Add(vertex3Index); } } topSurfaceDMT.AddTriangleBlock(newBlock); } // With the new structure we don't need this //' Make sure each vertex knows which triangle it is a part of //topSurfaceDMT.RelinkNodesToTriangles() // Return the top surface return(topSurfaceDMT); }