// Add a sphere without texture coordinates. public static void AddSphere(this MeshGeometry3D mesh, Point3D center, double radius, int numTheta, int numPhi, bool smooth = false) { // Make a point dictionary if needed. Dictionary <Point3D, int> pointDict = null; if (smooth) { pointDict = new Dictionary <Point3D, int>(); } // Generate the points. double dtheta = 2 * Math.PI / numTheta; double dphi = Math.PI / numPhi; double theta = 0; for (int t = 0; t < numTheta; t++) { double phi = 0; for (int p = 0; p < numPhi; p++) { // Find this piece's points. Point3D[] points = { G3.SpherePoint(center, radius, theta, phi), G3.SpherePoint(center, radius, theta, phi + dphi), G3.SpherePoint(center, radius, theta + dtheta, phi + dphi), G3.SpherePoint(center, radius, theta + dtheta, phi), }; // Make the polygon. mesh.AddPolygon(pointDict, points); phi += dphi; } theta += dtheta; } }
// Add a sphere with texture coordinates. public static void AddTexturedSphere(this MeshGeometry3D mesh, Point3D center, double radius, int numTheta, int numPhi, bool smooth = false) { double dtheta = 2 * Math.PI / numTheta; double dphi = Math.PI / numPhi; double theta = 0; for (int t = 0; t < numTheta; t++) { double phi = 0; for (int p = 0; p < numPhi; p++) { // Find this piece's points. Point3D point1 = G3.SpherePoint(center, radius, theta, phi).Round(); Point3D point2 = G3.SpherePoint(center, radius, theta, phi + dphi).Round(); Point3D point3 = G3.SpherePoint(center, radius, theta + dtheta, phi + dphi).Round(); Point3D point4 = G3.SpherePoint(center, radius, theta + dtheta, phi).Round(); // Find this piece's texture coordinates. Point coords1 = new Point((double)t / numTheta, (double)p / numPhi); Point coords2 = new Point((double)t / numTheta, (double)(p + 1) / numPhi); Point coords3 = new Point((double)(t + 1) / numTheta, (double)(p + 1) / numPhi); Point coords4 = new Point((double)(t + 1) / numTheta, (double)p / numPhi); // Find this piece's normals. Vector3D normal1 = (Vector3D)G3.SpherePoint(D3.Origin, 1, theta, phi).Round(); Vector3D normal2 = (Vector3D)G3.SpherePoint(D3.Origin, 1, theta, phi + dphi).Round(); Vector3D normal3 = (Vector3D)G3.SpherePoint(D3.Origin, 1, theta + dtheta, phi + dphi).Round(); Vector3D normal4 = (Vector3D)G3.SpherePoint(D3.Origin, 1, theta + dtheta, phi).Round(); // Make the first triangle. int index = mesh.Positions.Count; mesh.Positions.Add(point1); if (smooth) { mesh.Normals.Add(normal1); } mesh.TextureCoordinates.Add(coords1); mesh.Positions.Add(point2); if (smooth) { mesh.Normals.Add(normal2); } mesh.TextureCoordinates.Add(coords2); mesh.Positions.Add(point3); if (smooth) { mesh.Normals.Add(normal3); } mesh.TextureCoordinates.Add(coords3); mesh.TriangleIndices.Add(index++); mesh.TriangleIndices.Add(index++); mesh.TriangleIndices.Add(index++); // Make the second triangle. mesh.Positions.Add(point1); if (smooth) { mesh.Normals.Add(normal1); } mesh.TextureCoordinates.Add(coords1); mesh.Positions.Add(point3); if (smooth) { mesh.Normals.Add(normal3); } mesh.TextureCoordinates.Add(coords3); mesh.Positions.Add(point4); if (smooth) { mesh.Normals.Add(normal4); } mesh.TextureCoordinates.Add(coords4); mesh.TriangleIndices.Add(index++); mesh.TriangleIndices.Add(index++); mesh.TriangleIndices.Add(index++); phi += dphi; } theta += dtheta; } }