public EnumMorseVertexType[] ComputeMorse(TriMesh mesh, double[] function) { EnumMorseVertexType[] morseType = new EnumMorseVertexType[mesh.Vertices.Count]; foreach (TriMesh.Vertex v in mesh.Vertices) { double mid = function[v.Index]; int change = CountChange(v, function); if (change == 2) { morseType[v.Index] = EnumMorseVertexType.Regular; } else if (change > 2 && change % 2 == 0) { morseType[v.Index] = EnumMorseVertexType.Saddle; } else if (change == 0) { double round = function[v.HalfEdge.ToVertex.Index]; if (round > mid) { morseType[v.Index] = EnumMorseVertexType.Minum; } else { morseType[v.Index] = EnumMorseVertexType.Maxium; } } else { throw new Exception("不应该为奇数"); } } return(morseType); }
public void ColorMorseVertice(TriMesh mesh, EnumMorseVertexType[] morseType) { foreach (TriMesh.Vertex v in mesh.Vertices) { switch (morseType[v.Index]) { case EnumMorseVertexType.Regular: break; case EnumMorseVertexType.Minum: v.Traits.SelectedFlag = 1; v.Traits.Color = Color4.Yellow; break; case EnumMorseVertexType.Maxium: v.Traits.SelectedFlag = 2; v.Traits.Color = Color4.Red; break; case EnumMorseVertexType.Saddle: int change = ComputeSaddleType(v,function); v.Traits.SelectedFlag =(byte)(3 + change); v.Traits.Color = Color4.Blue; break; default: break; } } //int m = 0; //foreach (TriMesh.Vertex s in this.saddleList) //{ // m += CountChange(s,function) / 2 - 1; //} //Console.WriteLine("Max: {0}, Min: {1}, Saddle: {2}, Saddle m: {3}", // this.maxList.Count, this.minList.Count, this.saddleList.Count, m); //Console.WriteLine("euler: {0}", TriMeshUtil.GetEulerCharacteristic(this.mesh)); }
public EnumMorseVertexType[] ComputeMorse(TriMesh mesh,double[] function) { EnumMorseVertexType[] morseType = new EnumMorseVertexType[ mesh.Vertices.Count]; foreach (TriMesh.Vertex v in mesh.Vertices) { double mid = function[v.Index]; int change = CountChange(v,function); if (change == 2) { morseType[v.Index] = EnumMorseVertexType.Regular; } else if (change > 2 && change % 2 == 0) { morseType[v.Index] = EnumMorseVertexType.Saddle; } else if (change == 0) { double round = function[v.HalfEdge.ToVertex.Index]; if (round > mid) { morseType[v.Index] = EnumMorseVertexType.Minum; } else { morseType[v.Index] = EnumMorseVertexType.Maxium; } } else { throw new Exception("不应该为奇数"); } } return morseType; }
public MorseVertice ComputeMorseVertice(EnumMorseVertexType[] morseType) { MorseVertice morseVertice = new MorseVertice(); for (int i = 0; i < morseType.Length; i++) { switch (morseType[i]) { case EnumMorseVertexType.Saddle: morseVertice.SaddleList.Add(mesh.Vertices[i]); break; case EnumMorseVertexType.Maxium: morseVertice.MaxList.Add(mesh.Vertices[i]); break; case EnumMorseVertexType.Minum: morseVertice.MinList.Add(mesh.Vertices[i]); break; } } return morseVertice; }