Beispiel #1
0
 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);
 }
Beispiel #2
0
 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));
 }
Beispiel #3
0
 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;
 }
Beispiel #4
0
        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;
        }