Ejemplo n.º 1
0
        private void InitVertexInfo()
        {
            this.dataGridViewVertex.Rows.Clear();

            foreach (TriMesh.Vertex vertex in Mesh.Vertices)
            {
                this.dataGridViewVertex.Rows.Add(vertex.Index, vertex.Traits.Position.x, vertex.Traits.Position.y, vertex.Traits.Position.z);
            }
            foreach (TriMesh.Face face in Mesh.Faces)
            {
                this.dataGridViewFace.Rows.Add(face.Index, face.GetVertex(0).Index, face.GetVertex(1).Index, face.GetVertex(2).Index, TriMeshUtil.ComputeAreaFace(face));
            }

            foreach (TriMesh.Edge edge in Mesh.Edges)
            {
                string face0 = "null";
                string face1 = "null";
                if (edge.Face0 != null)
                {
                    face0 = edge.Face0.Index.ToString();
                }
                if (edge.Face1 != null)
                {
                    face1 = edge.Face1.Index.ToString();
                }
                this.dataGridViewEdge.Rows.Add(edge.Index,
                                               edge.Vertex0.Index,
                                               edge.Vertex1.Index, face0,
                                               face1, TriMeshUtil.ComputeEdgeLength(edge),
                                               TriMeshUtil.ComputeDihedralAngle(edge) / 3.14 * 180);
            }
        }
Ejemplo n.º 2
0
 public static double[] ComputeEdgeLength(TriMesh mesh)
 {
     double[] edgeLength = new double[mesh.Edges.Count];
     for (int i = 0; i < mesh.Edges.Count; i++)
     {
         edgeLength[i] = TriMeshUtil.ComputeEdgeLength(mesh.Edges[i]);
     }
     return(edgeLength);
 }
Ejemplo n.º 3
0
        public override void Run()
        {
            Vector3D[]    Av     = new Vector3D[this.mesh.Faces.Count];
            Vector3D[]    E      = new Vector3D[this.mesh.Faces.Count];
            double[]      D      = new double[this.mesh.Faces.Count];
            Vector3D[]    AI     = new Vector3D[this.mesh.Faces.Count];
            List <Region> region = new List <Region>();
            Vector3D      max;
            Vector3D      min;

            double[] s = new double[this.mesh.Faces.Count];


            int k = 0;

            int[] facenum = new int[this.mesh.Faces.Count];
            for (int i = 0; i < this.mesh.Faces.Count; i++)
            {
                facenum[i] = -1;
                foreach (TriMesh.Face face in mesh.Faces[i].Faces)
                {
                    double a = TriMeshUtil.ComputeEdgeLength(face.GetVertex(0), face.GetVertex(1));

                    double b = TriMeshUtil.ComputeEdgeLength(face.GetVertex(0), face.GetVertex(2));
                    double c = TriMeshUtil.ComputeEdgeLength(face.GetVertex(2), face.GetVertex(1));
                    double p = (a + b + c) / 2;
                    s[i] = Math.Pow(p * (p - a) * (p - b) * (p - c), 0.5);

                    Av[k] = (face.Traits.Normal - mesh.Faces[i].Traits.Normal) * s[i];
                    k++;
                    E[i] = E[i] + Av[i] / (s[i] * k);
                }

                max = Av[0];
                min = Av[0];
                for (int j = 1; j < k; j++)
                {
                    if (max.Length() < Av[j].Length())
                    {
                        max = Av[j];
                    }
                    if (min.Length() > Av[j].Length())
                    {
                        min = Av[j];
                    }
                }
                AI[i] = max - min;
                for (int j = 1; j <= k; j++)
                {
                    E[i] = E[i] + Av[i] / (s[i] * j);
                    D[i] = (Av[i] - E[i]).Length() / j;
                }
                k = 0;
            }


            for (int i = 0; i < this.mesh.Faces.Count; i++)
            {
                if ((Av[i].Length() < 0.86) && (D[i] < 0.098))
                {
                    facenum[k] = i;

                    k++;
                }
            }

            for (int i = 0; i < k - 1; i++)
            {
                int j;
                int index = i;
                for (int m = i + 1; m < k; m++)
                {
                    if (E[facenum[m]].Length() < E[facenum[index]].Length())
                    {
                        j              = facenum[m];
                        facenum[m]     = facenum[index];
                        facenum[index] = j;
                    }
                }
            }
            // int j = 0;
            byte color = 1;

            for (int m = 0; m < k; m++)
            {
                int      test = 0;
                Vector3D Normal;

                Region mutiface = new Region(this.mesh);
                double sum;
                if (mesh.Faces[facenum[m]].Traits.SelectedFlag == 0)
                {
                    mesh.Faces[facenum[m]].Traits.SelectedFlag = color;
                    mutiface.SetSeedFaces(facenum[m]);
                    mutiface.AddBoundaryFaces(mesh.Faces[facenum[m]]);
                    mutiface.SetColor(color);
                    Normal = mesh.Faces[facenum[m]].Traits.Normal;
                    sum    = s[facenum[m]];
                }
                else
                {
                    continue;
                }
                Boolean n = true;

                for (; n;)
                {
                    // n = true;
                    test = mutiface.Getallfacenumber();
                    List <TriMesh.Face> selectedFaces = new List <TriMesh.Face>();

                    for (int i = 0; i < mutiface.getBoundaryFaces().Count; i++)
                    {
                        selectedFaces.Add(mutiface.getBoundaryFaces()[i]);
                    }



                    for (int i = 0; i < selectedFaces.Count; i++)
                    {
                        int test2 = 0;

                        foreach (TriMesh.Face face in selectedFaces[i].Faces)
                        {
                            if (face.Traits.SelectedFlag == 0 && (Normal - selectedFaces[i].Traits.Normal).Length() * s[facenum[0]] < 0.481 && (face.Traits.Normal - Normal).Length() * sum < 0.72)
                            {
                                mutiface.AddFaces(selectedFaces[i], i);


                                mutiface.AddBoundaryFaces(face);

                                face.Traits.SelectedFlag = selectedFaces[i].Traits.SelectedFlag;
                                Normal = Normal + face.Traits.Normal;
                                sum    = sum + s[face.Index];

                                test2++;
                            }
                        }


                        Normal = Normal / (test + 1);
                        sum    = sum / (test + 1);
                        if (test2 == 0)
                        {
                            mutiface.AddFinalBoundaryFaces(selectedFaces[i]);
                        }
                    }
                    if (test == mutiface.Getallfacenumber())
                    {
                        n = false;
                    }
                    else if (mutiface.Getallfacenumber() >= 2200)
                    {
                        n = false;
                    }
                }


                region.Add(mutiface);

                color++;
            }
        }
Ejemplo n.º 4
0
 void UpdateLength(TriMesh.Edge edge)
 {
     this.EdgeLength[edge.Index] = TriMeshUtil.ComputeEdgeLength(edge);
 }
Ejemplo n.º 5
0
        public double  Dijkstra(TriMesh.Vertex source, TriMesh.Vertex destination)
        {
            List <TriMesh.Vertex> S = new List <TriMesh.Vertex>(); //以求出最短路径的点的集合
            List <TriMesh.Vertex> T = new List <TriMesh.Vertex>(); //未求出最短路径的点的集合


            double minDistance = 0;

            PathD[] minPath = new PathD[mesh.Vertices.Count];//每个点的最短路径过程
            for (int i = 0; i < mesh.Vertices.Count; i++)
            {
                minPath[i] = new PathD();
            }

            #region STEP1 初始化两组点的集合
            S.Add(source);
            minPath[source.Index].path   = 0;
            minPath[source.Index].vertex = source;
            minPath[source.Index].pathNumber.Add(source.Index);
            for (int i = 0; i < mesh.Vertices.Count; i++)
            {
                if (mesh.Vertices[i] != source)
                {
                    T.Add(mesh.Vertices[i]);
                    minPath[mesh.Vertices[i].Index].path   = double.MaxValue;
                    minPath[mesh.Vertices[i].Index].vertex = mesh.Vertices[i];
                }
            }
            int count = 0;
            foreach (TriMesh.Vertex vertex in source.Vertices)
            {
                if (vertex == destination)
                {
                    return(minDistance = TriMeshUtil.ComputeEdgeLength(source.FindEdgeTo(vertex)));
                }
                count++;
                if (count == source.VertexCount)
                {
                    minDistance = double.MaxValue;
                }
            }
            #endregion

            #region STEP2 遍历所有点,计算source到destination的最短路径的点的集合
            while (true)
            {
                for (int i = 0; i < S.Count; i++)
                {
                    foreach (TriMesh.Vertex v in S[i].Vertices)
                    {
                        for (int j = 0; j < T.Count; j++)
                        {
                            if (T[j] == v)
                            {
                                if (S.Contains(T[j]) == true)
                                {
                                    continue;
                                }
                                if (TriMeshUtil.ComputeEdgeLength(S[i].FindEdgeTo(T[j])) < minPath[T[j].Index].path)
                                {
                                    minPath[T[j].Index].path = TriMeshUtil.ComputeEdgeLength(S[i].FindEdgeTo(T[j]));

                                    minPath[T[j].Index].pathNumber.Clear();
                                    for (int k = 0; k < minPath[S[i].Index].pathNumber.Count; k++)
                                    {
                                        minPath[T[j].Index].pathNumber.Add(minPath[S[i].Index].pathNumber[k]);
                                    }
                                    minPath[T[j].Index].pathNumber.Add(T[j].Index);
                                    S.Add(T[j]);
                                }
                            }
                        }
                    }
                }


                if (S.Count == mesh.Vertices.Count)
                {
                    break;
                }
            }
            #endregion

            #region 计算出最短路径以及为最短路径染色
            minDistance = 0;
            for (int i = 0; i < minPath[destination.Index].pathNumber.Count - 1; i++)
            {
                minDistance += TriMeshUtil.ComputeEdgeLength(mesh.Vertices[minPath[destination.Index].pathNumber[i]].FindEdgeTo(
                                                                 mesh.Vertices[minPath[destination.Index].pathNumber[i + 1]]));
            }
            for (int i = 0; i < minPath[destination.Index].pathNumber.Count - 1; i++)
            {
                mesh.Vertices[minPath[destination.Index].pathNumber[i]].FindEdgeTo(mesh.Vertices[minPath[destination.Index].pathNumber[i + 1]]).Traits.SelectedFlag = 1;
            }
            #endregion

            return(minDistance);
        }
Ejemplo n.º 6
0
 protected override double GetValue(HalfEdgeMesh.Edge target)
 {
     return(TriMeshUtil.ComputeEdgeLength(target));
 }