public AddSubdivisionSphere ( System.Windows.Media.Media3D.Point3D center, double radius, int subdivisions ) : void | ||
center | System.Windows.Media.Media3D.Point3D | /// The center of the sphere. /// |
radius | double | /// The radius of the sphere. /// |
subdivisions | int | /// The number of triangular subdivisions of the original icosahedron. /// |
Résultat | void |
/// <summary> /// Updates the visuals. /// </summary> protected void UpdateVisuals() { if (this.Mesh == null) { this.Content = null; return; } var m = new Model3DGroup(); this.TriangleIndexToFaceIndex = new List<int>(); var faceGeometry = this.Mesh.ToMeshGeometry3D( this.SharedVertices, this.ShrinkFactor, this.TriangleIndexToFaceIndex); m.Children.Add( new GeometryModel3D(faceGeometry, this.FaceMaterial) { BackMaterial = this.FaceBackMaterial }); // Add the nodes if (this.VertexRadius > 0) { var gm = new MeshBuilder(false, false); foreach (var p in this.Mesh.Vertices) { gm.AddSubdivisionSphere(p, this.VertexRadius, this.VertexResolution); // gm.AddBox(p, VertexRadius, VertexRadius, VertexRadius); } m.Children.Add(new GeometryModel3D(gm.ToMesh(), this.VertexMaterial)); } // Add the edges if (this.EdgeDiameter > 0) { var em = new MeshBuilder(false, false); //// int fi = 0; foreach (var p in this.Mesh.Faces) { //// var n = this.Mesh.GetFaceNormal(fi++); for (int i = 0; i < p.Length; i += 1) { var p0 = this.Mesh.Vertices[p[i]]; var p1 = this.Mesh.Vertices[p[(i + 1) % p.Length]]; em.AddCylinder(p0, p1, this.EdgeDiameter, 4); } } m.Children.Add(new GeometryModel3D(em.ToMesh(), this.EdgeMaterial)); } this.Content = m; }
/// <summary> /// Updates the visuals. /// </summary> protected void UpdateVisuals() { this.vertexVisuals = new Dictionary<HalfEdgeMesh.Vertex, ModelUIElement3D>(); this.halfEdgeVisuals = new Dictionary<HalfEdgeMesh.HalfEdge, ModelUIElement3D>(); this.faceVisuals = new Dictionary<HalfEdgeMesh.Face, ModelUIElement3D>(); this.Children.Clear(); if (this.Mesh == null) { return; } if (this.VertexRadius > 0) { // Add the vertices foreach (var vertex in this.Mesh.Vertices) { var gm = new MeshBuilder(false, false); gm.AddSubdivisionSphere(vertex.Position, this.VertexRadius, 4); var vertexElement = new ModelUIElement3D { Model = new GeometryModel3D(gm.ToMesh(), this.VertexMaterial) }; var currentVertex = vertex; vertexElement.MouseLeftButtonDown += (s, e) => this.HighlightVertex(currentVertex); this.vertexVisuals.Add(vertex, vertexElement); this.Add(vertexElement); } } var faceCenter = new Dictionary<HalfEdgeMesh.Face, Point3D>(); foreach (var face in this.Mesh.Faces) { var faceVertices = face.Vertices.Select(v => v.Position).ToList(); // Find the face centroid var center = this.FindCentroid(faceVertices); faceCenter.Add(face, center); if (this.ShrinkFactor < 1) { // Add the faces for (int i = 0; i < faceVertices.Count; i++) { faceVertices[i] += (center - faceVertices[i]) * this.ShrinkFactor; } var gm = new MeshBuilder(false, false); gm.AddTriangleFan(faceVertices); var faceElement = new ModelUIElement3D { Model = new GeometryModel3D(gm.ToMesh(), this.FaceMaterial) { BackMaterial = this.FaceBackMaterial } }; var currentFace = face; faceElement.MouseLeftButtonDown += (s, e) => this.HighlightFace(currentFace); this.faceVisuals.Add(face, faceElement); this.Add(faceElement); } } if (this.EdgeDiameter > 0) { // Add the edges foreach (var edge in this.Mesh.Edges) { var start = edge.StartVertex.Position; var end = edge.EndVertex.Position; var center = faceCenter[edge.Face]; start = start + (center - start) * this.ShrinkFactor; end = end + (center - end) * this.ShrinkFactor; var gm = new MeshBuilder(false, false); gm.AddArrow(start, end, this.EdgeDiameter); var edgeElement = new ModelUIElement3D { Model = new GeometryModel3D(gm.ToMesh(), this.EdgeMaterial) }; var currentEdge = edge; edgeElement.MouseLeftButtonDown += (s, e) => { this.HighlightEdge(currentEdge); }; this.halfEdgeVisuals.Add(edge, edgeElement); this.Add(edgeElement); } } }