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