Example #1
0
        /// <summary>
        /// Connects the Vertices to the correct triangles for the chosen mesh type.
        /// </summary>
        /// <param name="mesh">The new TriangleMesh containing only the Vertices.</param>
        /// <param name="steps">The number of steps to be taken.</param>
        /// <returns>The completed TriangleMesh.</returns>
        private TriangleMesh CreateTriangles(TriangleMesh mesh, int steps)
        {
            int point = 0;

            if (meshType == 0)
            {
                steps *= 2;
                do
                {
                    // Creates eight triangles per square.
                    mesh.Add(new Triangle(point, point + 1, point + steps + 2));
                    mesh.Add(new Triangle(point + 1, point + 2, point + steps + 2));
                    mesh.Add(new Triangle(point + 2, point + steps + 3, point + steps + 2));
                    mesh.Add(new Triangle(point + steps + 3, point + 2 * steps + 4, point + steps + 2));
                    mesh.Add(new Triangle(point + 2 * steps + 4, point + 2 * steps + 3, point + steps + 2));
                    mesh.Add(new Triangle(point + 2 * steps + 3, point + 2 * steps + 2, point + steps + 2));
                    mesh.Add(new Triangle(point + 2 * steps + 2, point + steps + 1, point + steps + 2));
                    mesh.Add(new Triangle(point + steps + 1, point, point + steps + 2));

                    if (point % (2 * steps + 2) < steps - 2)
                    {
                        point += 2;
                    }
                    else
                    {
                        point += steps + 4;
                    }
                } while (point <= mesh.Vertices.Count - (5 + 2 * steps));
            }
            else
            {
                do
                {
                    // Creates two triangles per square.
                    mesh.Add(new Triangle(point, point + 1, point + steps + 2));
                    mesh.Add(new Triangle(point, point + steps + 2, point + steps + 1));

                    if (point % (steps + 1) < steps - 1)
                    {
                        point++;
                    }
                    else
                    {
                        point += 2;
                    }
                } while (point <= mesh.Vertices.Count - (steps + 3));
            }

            mesh.Finish(true);
            return(mesh);
        }
Example #2
0
        /// <summary>
        /// Creates the base tetrahedron.
        /// </summary>
        private TriangleMesh CreateBaseTetrahedron()
        {
            TriangleMesh baseMesh = new TriangleMesh();

            baseMesh.Vertices.Add(new Vertex(0.5, 0.5, 0.5));
            baseMesh.Vertices.Add(new Vertex(-0.5, -0.5, 0.5));
            baseMesh.Vertices.Add(new Vertex(-0.5, 0.5, -0.5));
            baseMesh.Vertices.Add(new Vertex(0.5, -0.5, -0.5));

            baseMesh.Add(new Triangle(0, 1, 3));
            baseMesh.Add(new Triangle(1, 0, 2));
            baseMesh.Add(new Triangle(2, 0, 3));
            baseMesh.Add(new Triangle(2, 3, 1));

            return(baseMesh);
        }
Example #3
0
        /// <summary>
        /// Creates a rectangular base mesh.
        /// </summary>
        /// <returns>The rectangular base mesh</returns>
        private TriangleMesh CreateSquareBase()
        {
            TriangleMesh baseMesh = new TriangleMesh();

            int    xSteps  = (int)xStepsNumericUpDown.Value * 2;
            int    ySteps  = (int)yStepsNumericUpDown.Value * 2;
            double xLength = (double)xLengthNumericUpDown.Value;
            double yLength = (double)yLengthNumericUpDown.Value;
            double xMin    = -(xLength * (int)xStepsNumericUpDown.Value) / 2;
            double yMin    = -(yLength * (int)yStepsNumericUpDown.Value) / 2;

            baseMesh.Vertices.Add(new Vertex(xMin, yMin, 0));

            for (int i = 0; i <= ySteps; i++)
            {
                for (int j = 0; j <= xSteps; j++)
                {
                    if (i != 0)
                    {
                        baseMesh.Vertices.Add((baseMesh.Vertices[0] + new Vector(j * xLength * 0.5, i * yLength * 0.5, 0)).ToVertex());
                    }
                    else
                    {
                        if (j != 0)
                        {
                            baseMesh.Vertices.Add((baseMesh.Vertices[0] + new Vector(j * xLength * 0.5, i * yLength * 0.5, 0)).ToVertex());
                        }
                    }
                }
            }

            int point = 0;

            do
            {
                baseMesh.Add(new Triangle(point, point + 1, point + xSteps + 2));
                baseMesh.Add(new Triangle(point + 1, point + 2, point + xSteps + 2));
                baseMesh.Add(new Triangle(point + 2, point + xSteps + 3, point + xSteps + 2));
                baseMesh.Add(new Triangle(point + xSteps + 3, point + 2 * xSteps + 4, point + xSteps + 2));
                baseMesh.Add(new Triangle(point + 2 * xSteps + 4, point + 2 * xSteps + 3, point + xSteps + 2));
                baseMesh.Add(new Triangle(point + 2 * xSteps + 3, point + 2 * xSteps + 2, point + xSteps + 2));
                baseMesh.Add(new Triangle(point + 2 * xSteps + 2, point + xSteps + 1, point + xSteps + 2));
                baseMesh.Add(new Triangle(point + xSteps + 1, point, point + xSteps + 2));

                if (point % (2 * xSteps + 2) < xSteps - 2)
                {
                    point += 2;
                }
                else
                {
                    point += xSteps + 4;
                }
            } while (point <= baseMesh.Vertices.Count - (5 + 2 * xSteps));

            return(baseMesh);
        }
Example #4
0
        /// <summary>
        /// Unites two TriangleMeshes making sure the Vertices remain unique.
        /// </summary>
        /// <param name="one">The first TriangleMesh</param>
        /// <param name="two">The second TriangleMesh</param>
        /// <returns>The united TriangleMesh</returns>
        public static TriangleMesh Union(TriangleMesh one, TriangleMesh two)
        {
            TriangleMesh union = new TriangleMesh();
            TriangleMesh big;
            TriangleMesh small;

            if (one.Vertices.Count >= two.Vertices.Count)
            {
                big   = one;
                small = two;
            }
            else
            {
                big   = two;
                small = one;
            }

            // The bigger TriangleMesh is part of the union.
            union.Vertices.AddRange(big.Vertices.ToArray());
            union.AddRange(big.ToArray());
            List <Triangle> temp = new List <Triangle>(small.ToArray());

            // The Vertices of the smaller TriangleMesh are included in the union.
            for (int i = 0; i < small.Vertices.Count; i++)
            {
                Vertex vertex = small.Vertices[i];

                // The indices of the Vertices in the Triangles of the smaller TriangleMesh
                // are set to the corresponding indices in the union.
                int index = big.Vertices.IndexOf(vertex);
                if (index == -1)
                {
                    union.Vertices.Add(vertex.Copy().ToVertex());
                    for (int j = 0; j < vertex.Triangles.Count; j++)
                    {
                        temp[vertex.Triangles[j]].Replace(i, union.Vertices.Count - 1);
                    }
                }
                else
                {
                    for (int j = 0; j < vertex.Triangles.Count; j++)
                    {
                        temp[vertex.Triangles[j]].Replace(i, index);
                    }
                }
            }

            // The Triangles of the smaller TriangleMesh are included in the union.
            for (int k = 0; k < temp.Count; k++)
            {
                union.Add(new Triangle(temp[k][0], temp[k][1], temp[k][2]));
            }

            union.Finish(true);
            return(union);
        }
Example #5
0
        /// <summary>
        /// Creates a hexagonal base mesh.
        /// </summary>
        /// <returns>The hexagonal base mesh</returns>
        private TriangleMesh CreateHexBase()
        {
            TriangleMesh baseMesh = new TriangleMesh();

            Cursor = System.Windows.Input.Cursors.Wait;

            double baseLength = (double)lengthNumericUpDown.Value;

            baseMesh.Vertices.Add(new Vertex(0, 0, 0));
            baseMesh.Vertices.Add(new Vertex(baseLength, 0, 0));
            baseMesh.Vertices.Add(new Vertex(baseLength / 2, baseLength * Math.Sqrt(3) / 2, 0));
            baseMesh.Vertices.Add(new Vertex(-baseLength / 2, baseLength * Math.Sqrt(3) / 2, 0));
            baseMesh.Vertices.Add(new Vertex(-baseLength, 0, 0));
            baseMesh.Vertices.Add(new Vertex(-baseLength / 2, -baseLength * Math.Sqrt(3) / 2, 0));
            baseMesh.Vertices.Add(new Vertex(baseLength / 2, -baseLength * Math.Sqrt(3) / 2, 0));

            baseMesh.Add(new Triangle(0, 1, 2));
            baseMesh.Add(new Triangle(0, 2, 3));
            baseMesh.Add(new Triangle(0, 3, 4));
            baseMesh.Add(new Triangle(0, 4, 5));
            baseMesh.Add(new Triangle(0, 5, 6));
            baseMesh.Add(new Triangle(0, 6, 1));

            baseMesh.Subdivide((int)stepsNumericUpDown.Value);

            Cursor = System.Windows.Input.Cursors.Arrow;

            return(baseMesh);
        }
Example #6
0
        /// <summary>
        /// Creates the base octahedron.
        /// </summary>
        private TriangleMesh CreateBaseOctahedron()
        {
            TriangleMesh baseMesh = new TriangleMesh();

            baseMesh.Vertices.Add(new Vertex(0, 0, 0.5));
            baseMesh.Vertices.Add(new Vertex(0.5, 0, 0));
            baseMesh.Vertices.Add(new Vertex(0, 0.5, 0));
            baseMesh.Vertices.Add(new Vertex(-0.5, 0, 0));
            baseMesh.Vertices.Add(new Vertex(0, -0.5, 0));
            baseMesh.Vertices.Add(new Vertex(0, 0, -0.5));

            baseMesh.Add(new Triangle(0, 1, 2));
            baseMesh.Add(new Triangle(0, 2, 3));
            baseMesh.Add(new Triangle(0, 3, 4));
            baseMesh.Add(new Triangle(0, 4, 1));
            baseMesh.Add(new Triangle(5, 2, 1));
            baseMesh.Add(new Triangle(5, 3, 2));
            baseMesh.Add(new Triangle(5, 4, 3));
            baseMesh.Add(new Triangle(5, 1, 4));

            return(baseMesh);
        }
Example #7
0
        /// <summary>
        /// Creates the base pyramid.
        /// </summary>
        private TriangleMesh CreateBasePyramid()
        {
            TriangleMesh baseMesh = new TriangleMesh();

            baseMesh.Vertices.Add(new Vertex(0, 0, 0.5));
            baseMesh.Vertices.Add(new Vertex(0.5, 0.5, -0.5));
            baseMesh.Vertices.Add(new Vertex(-0.5, 0.5, -0.5));
            baseMesh.Vertices.Add(new Vertex(-0.5, -0.5, -0.5));
            baseMesh.Vertices.Add(new Vertex(0.5, -0.5, -0.5));

            baseMesh.Add(new Triangle(0, 1, 2));
            baseMesh.Add(new Triangle(0, 2, 3));
            baseMesh.Add(new Triangle(0, 3, 4));
            baseMesh.Add(new Triangle(0, 4, 1));
            baseMesh.Add(new Triangle(1, 2, 3));
            baseMesh.Add(new Triangle(3, 4, 1));

            return(baseMesh);
        }
Example #8
0
        /// <summary>
        /// Creates the base icosahedron.
        /// </summary>
        private TriangleMesh CreateBaseIcosahedron()
        {
            TriangleMesh baseMesh = new TriangleMesh();

            double phi     = Math.PI * 26.56505 / 180.0;
            double theta   = 0;
            double theta2  = Math.PI * 36.0 / 180.0;
            double theta72 = Math.PI * 72.0 / 180;

            baseMesh.Vertices.Add(new Vertex(0, 0, 1));

            for (int i = 1; i < 6; i++)
            {
                Vertex newVertex = new Vertex(Math.Cos(theta) * Math.Cos(phi), Math.Sin(theta) * Math.Cos(phi), Math.Sin(phi));
                newVertex.Normalize();
                baseMesh.Vertices.Add(newVertex);
                theta += theta72;
            }

            for (int j = 6; j < 11; j++)
            {
                Vertex newVertex = new Vertex(Math.Cos(theta2) * Math.Cos(-phi), Math.Sin(theta2) * Math.Cos(-phi), Math.Sin(-phi));
                newVertex.Normalize();
                baseMesh.Vertices.Add(newVertex);
                theta2 += theta72;
            }

            baseMesh.Vertices.Add(new Vertex(0, 0, -1));

            baseMesh.Add(new Triangle(0, 1, 2));
            baseMesh.Add(new Triangle(0, 2, 3));
            baseMesh.Add(new Triangle(0, 3, 4));
            baseMesh.Add(new Triangle(0, 4, 5));
            baseMesh.Add(new Triangle(0, 5, 1));
            baseMesh.Add(new Triangle(11, 7, 6));
            baseMesh.Add(new Triangle(11, 8, 7));
            baseMesh.Add(new Triangle(11, 9, 8));
            baseMesh.Add(new Triangle(11, 10, 9));
            baseMesh.Add(new Triangle(11, 6, 10));
            baseMesh.Add(new Triangle(1, 6, 2));
            baseMesh.Add(new Triangle(2, 7, 3));
            baseMesh.Add(new Triangle(3, 8, 4));
            baseMesh.Add(new Triangle(4, 9, 5));
            baseMesh.Add(new Triangle(5, 10, 1));
            baseMesh.Add(new Triangle(6, 7, 2));
            baseMesh.Add(new Triangle(7, 8, 3));
            baseMesh.Add(new Triangle(8, 9, 4));
            baseMesh.Add(new Triangle(9, 10, 5));
            baseMesh.Add(new Triangle(10, 6, 1));

            return(baseMesh);
        }
Example #9
0
        /// <summary>
        /// Creates the base dodecahedron.
        /// </summary>
        private TriangleMesh CreateBaseDodecahedron()
        {
            TriangleMesh baseMesh = new TriangleMesh();

            double phi    = (1 + Math.Sqrt(5)) / 2;
            double phiInv = 2 / (1 + Math.Sqrt(5));

            baseMesh.Vertices.Add(new Vertex(1, 1, 1));                                          // 0
            baseMesh.Vertices.Add(new Vertex(-1, 1, 1));                                         // 1
            baseMesh.Vertices.Add(new Vertex(1, -1, 1));                                         // 2
            baseMesh.Vertices.Add(new Vertex(1, 1, -1));                                         // 3
            baseMesh.Vertices.Add(new Vertex(-1, -1, 1));                                        // 4
            baseMesh.Vertices.Add(new Vertex(-1, 1, -1));                                        // 5
            baseMesh.Vertices.Add(new Vertex(1, -1, -1));                                        // 6
            baseMesh.Vertices.Add(new Vertex(-1, -1, -1));                                       // 7
            baseMesh.Vertices.Add(new Vertex(0, phiInv, phi));                                   // 8
            baseMesh.Vertices.Add(new Vertex(0, -phiInv, phi));                                  // 9
            baseMesh.Vertices.Add(new Vertex(0, phiInv, -phi));                                  // 10
            baseMesh.Vertices.Add(new Vertex(0, -phiInv, -phi));                                 // 11
            baseMesh.Vertices.Add(new Vertex(phiInv, phi, 0));                                   // 12
            baseMesh.Vertices.Add(new Vertex(-phiInv, phi, 0));                                  // 13
            baseMesh.Vertices.Add(new Vertex(phiInv, -phi, 0));                                  // 14
            baseMesh.Vertices.Add(new Vertex(-phiInv, -phi, 0));                                 // 15
            baseMesh.Vertices.Add(new Vertex(phi, 0, phiInv));                                   // 16
            baseMesh.Vertices.Add(new Vertex(-phi, 0, phiInv));                                  // 17
            baseMesh.Vertices.Add(new Vertex(phi, 0, -phiInv));                                  // 18
            baseMesh.Vertices.Add(new Vertex(-phi, 0, -phiInv));                                 // 19

            baseMesh.Vertices.Add(new Vertex(0, (2 * (1 + phi) + phiInv) / 5, (2 + phi) / 5));   // 20
            baseMesh.Vertices.Add(new Vertex((2 + phi) / 5, 0, (2 * (1 + phi) + phiInv) / 5));   // 21
            baseMesh.Vertices.Add(new Vertex((2 * (1 + phi) + phiInv) / 5, (2 + phi) / 5, 0));   // 22
            baseMesh.Vertices.Add(new Vertex(-(2 * (1 + phi) + phiInv) / 5, (2 + phi) / 5, 0));  // 23
            baseMesh.Vertices.Add(new Vertex(-(2 + phi) / 5, 0, -(2 * (1 + phi) + phiInv) / 5)); // 24
            baseMesh.Vertices.Add(new Vertex(-(2 * (1 + phi) + phiInv) / 5, -(2 + phi) / 5, 0)); // 25
            baseMesh.Vertices.Add(new Vertex(-(2 + phi) / 5, 0, (2 * (1 + phi) + phiInv) / 5));  // 26
            baseMesh.Vertices.Add(new Vertex(0, -(2 * (1 + phi) + phiInv) / 5, (2 + phi) / 5));  // 27
            baseMesh.Vertices.Add(new Vertex((2 * (1 + phi) + phiInv) / 5, -(2 + phi) / 5, 0));  // 28
            baseMesh.Vertices.Add(new Vertex((2 + phi) / 5, 0, -(2 * (1 + phi) + phiInv) / 5));  // 29
            baseMesh.Vertices.Add(new Vertex(0, -(2 * (1 + phi) + phiInv) / 5, -(2 + phi) / 5)); // 30
            baseMesh.Vertices.Add(new Vertex(0, (2 * (1 + phi) + phiInv) / 5, -(2 + phi) / 5));  // 31

            baseMesh.Add(new Triangle(0, 12, 20));
            baseMesh.Add(new Triangle(12, 13, 20));
            baseMesh.Add(new Triangle(13, 1, 20));
            baseMesh.Add(new Triangle(1, 8, 20));
            baseMesh.Add(new Triangle(8, 0, 20));
            baseMesh.Add(new Triangle(0, 8, 21));
            baseMesh.Add(new Triangle(8, 9, 21));
            baseMesh.Add(new Triangle(9, 2, 21));
            baseMesh.Add(new Triangle(2, 16, 21));
            baseMesh.Add(new Triangle(16, 0, 21));
            baseMesh.Add(new Triangle(0, 16, 22));
            baseMesh.Add(new Triangle(16, 18, 22));
            baseMesh.Add(new Triangle(18, 3, 22));
            baseMesh.Add(new Triangle(3, 12, 22));
            baseMesh.Add(new Triangle(12, 0, 22));
            baseMesh.Add(new Triangle(19, 17, 23));
            baseMesh.Add(new Triangle(17, 1, 23));
            baseMesh.Add(new Triangle(1, 13, 23));
            baseMesh.Add(new Triangle(13, 5, 23));
            baseMesh.Add(new Triangle(5, 19, 23));
            baseMesh.Add(new Triangle(19, 5, 24));
            baseMesh.Add(new Triangle(5, 10, 24));
            baseMesh.Add(new Triangle(10, 11, 24));
            baseMesh.Add(new Triangle(11, 7, 24));
            baseMesh.Add(new Triangle(7, 19, 24));
            baseMesh.Add(new Triangle(19, 7, 25));
            baseMesh.Add(new Triangle(7, 15, 25));
            baseMesh.Add(new Triangle(15, 4, 25));
            baseMesh.Add(new Triangle(4, 17, 25));
            baseMesh.Add(new Triangle(17, 19, 25));
            baseMesh.Add(new Triangle(1, 17, 26));
            baseMesh.Add(new Triangle(17, 4, 26));
            baseMesh.Add(new Triangle(4, 9, 26));
            baseMesh.Add(new Triangle(9, 8, 26));
            baseMesh.Add(new Triangle(8, 1, 26));
            baseMesh.Add(new Triangle(2, 9, 27));
            baseMesh.Add(new Triangle(9, 4, 27));
            baseMesh.Add(new Triangle(4, 15, 27));
            baseMesh.Add(new Triangle(15, 14, 27));
            baseMesh.Add(new Triangle(14, 2, 27));
            baseMesh.Add(new Triangle(2, 14, 28));
            baseMesh.Add(new Triangle(14, 6, 28));
            baseMesh.Add(new Triangle(6, 18, 28));
            baseMesh.Add(new Triangle(18, 16, 28));
            baseMesh.Add(new Triangle(16, 2, 28));
            baseMesh.Add(new Triangle(3, 18, 29));
            baseMesh.Add(new Triangle(18, 6, 29));
            baseMesh.Add(new Triangle(6, 11, 29));
            baseMesh.Add(new Triangle(11, 10, 29));
            baseMesh.Add(new Triangle(10, 3, 29));
            baseMesh.Add(new Triangle(6, 14, 30));
            baseMesh.Add(new Triangle(14, 15, 30));
            baseMesh.Add(new Triangle(15, 7, 30));
            baseMesh.Add(new Triangle(7, 11, 30));
            baseMesh.Add(new Triangle(11, 6, 30));
            baseMesh.Add(new Triangle(3, 10, 31));
            baseMesh.Add(new Triangle(10, 5, 31));
            baseMesh.Add(new Triangle(5, 13, 31));
            baseMesh.Add(new Triangle(13, 12, 31));
            baseMesh.Add(new Triangle(12, 3, 31));

            return(baseMesh);
        }