예제 #1
0
        /// <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);
        }