Exemple #1
0
        protected Vector3D GetPos1(TriMesh.HalfEdge hf)
        {
            Vector3D from = hf.FromVertex.Traits.Position;
            Vector3D to   = hf.ToVertex.Traits.Position;
            Vector3D l    = to - from;

            Vector3D[] vi = this.GetV(hf);
            Vector3D[] vj = this.GetV(hf.Opposite);
            Vector3D   c1 = Vector3D.Zero;
            Vector3D   c2 = Vector3D.Zero;

            for (int i = 0; i < vi.Length - 1; i++)
            {
                c1 += (vi[i] - from).Cross(vi[i + 1] - from);
            }
            for (int i = 0; i < vj.Length - 1; i++)
            {
                c2 += (vj[i + 1] - to).Cross(vj[i] - to);
            }
            Matrix4D m = Matrix4D.ZeroMatrix;

            m.Row1 = new Vector4D(c1 - c2, to.Dot(c2) - from.Dot(c1));
            m.Row2 = new Vector4D(l.y, -l.x, 0d, to.y * l.x - to.x * l.y);
            m.Row3 = new Vector4D(l.z, 0d, -l.x, to.z * l.x - to.x * l.z);
            m.Row4 = new Vector4D(0d, 0d, 0d, 1d);

            Vector3D pos = Vector3D.Zero;
            double   det = Util.Solve(ref m, ref pos);

            if (det == 0)
            {
                pos = TriMeshUtil.GetMidPoint(hf.Edge);
            }
            else
            {
                double vo1 = c1.Dot(pos - from);
                double vo2 = c2.Dot(pos - to);
            }
            return(pos);
        }
Exemple #2
0
 public void ComputeGeometryC(PolygonMesh dualMesh)
 {
     //get the mid-Vertex of each edges
     TriMesh.Vertex[] edgeVertices = new TriMesh.Vertex[mesh.Faces.Count * 3];
     foreach (TriMesh.Edge e in mesh.Edges)
     {
         Vector3D midVertex0 = TriMeshUtil.GetMidPoint(e);
         dualMesh.Vertices.Add(new VertexTraits(midVertex0.x,
                                                midVertex0.y,
                                                midVertex0.z));
     }
     //get circumcentre of each faces
     foreach (TriMesh.Face f in mesh.Faces)
     {
         TriMesh.Vertex vertex0      = f.GetVertex(0);
         TriMesh.Vertex vertex1      = f.GetVertex(1);
         TriMesh.Vertex vertex2      = f.GetVertex(2);
         Triangle       triangle     = new Triangle(vertex0.Traits.Position, vertex1.Traits.Position, vertex2.Traits.Position);
         Vector3D       circumCenter = triangle.ComputeCircumCenter();
         dualMesh.Vertices.Add(new VertexTraits(circumCenter.x,
                                                circumCenter.y,
                                                circumCenter.z));
     }
 }
Exemple #3
0
        public void MakeTheTopologyB(PolygonMesh dualMesh)
        {
            List <TriMesh.Vertex> boundaryVertices = new List <TriMesh.Vertex>();

            boundaryVertices = TriMeshUtil.RetrieveAllBoundaryVertex(mesh);
            foreach (TriMesh.Face face in mesh.Faces)
            {
                int              index           = face.Index;
                int              baryVertexIndex = mesh.Edges.Count;
                int              edgeVertexIndex;
                int              faceIndex        = index;
                TriMesh.Edge     boundaryEdge     = new TriMesh.Edge();
                TriMesh.HalfEdge tempHalfedge     = new TriMesh.HalfEdge();
                TriMesh.Vertex   vertex0          = mesh.Faces[index].GetVertex(0);
                TriMesh.Vertex   vertex1          = mesh.Faces[index].GetVertex(1);
                TriMesh.Vertex   vertex2          = mesh.Faces[index].GetVertex(2);
                TriMesh.HalfEdge halfedge0        = vertex0.FindHalfedgeTo(vertex1);
                TriMesh.HalfEdge halfedge1        = vertex1.FindHalfedgeTo(vertex2);
                TriMesh.HalfEdge halfedge2        = vertex2.FindHalfedgeTo(vertex0);
                TriMesh.HalfEdge boundaryHalfedge = new TriMesh.HalfEdge();
                tempHalfedge = halfedge0;

                edgeVertexIndex = halfedge0.Edge.Index;
                TriMesh.Vertex firstVertex  = dualMesh.Vertices[baryVertexIndex + faceIndex];
                TriMesh.Vertex secondVertex = dualMesh.Vertices[edgeVertexIndex];
                if (firstVertex.FindHalfedgeTo(secondVertex) == null)
                {
                    List <TriMesh.Vertex> ringVertices = new List <TriMesh.Vertex>();
                    do
                    {
                        ringVertices.Add(dualMesh.Vertices[baryVertexIndex + faceIndex]);
                        ringVertices.Add(dualMesh.Vertices[edgeVertexIndex]);
                        if (tempHalfedge.Opposite.Next.Face != null)
                        {
                            tempHalfedge    = tempHalfedge.Opposite.Next;
                            faceIndex       = tempHalfedge.Face.Index;
                            edgeVertexIndex = tempHalfedge.Edge.Index;
                        }
                        else
                        {
                            tempHalfedge    = tempHalfedge.Opposite.Next;
                            edgeVertexIndex = tempHalfedge.Edge.Index;
                            faceIndex       = tempHalfedge.Opposite.Next.Face.Index;
                        }
                    } while (tempHalfedge != halfedge0);
                    TriMesh.Vertex[] newFaceVertices = new TriMesh.Vertex[ringVertices.Count];
                    for (int i = 0; i < ringVertices.Count; i++)
                    {
                        newFaceVertices[i] = ringVertices[i];
                    }
                    dualMesh.Faces.Add(newFaceVertices);
                }
                tempHalfedge    = halfedge1;
                edgeVertexIndex = halfedge1.Edge.Index;
                firstVertex     = dualMesh.Vertices[baryVertexIndex + faceIndex];
                secondVertex    = dualMesh.Vertices[edgeVertexIndex];
                if (firstVertex.FindHalfedgeTo(secondVertex) == null)
                {
                    List <TriMesh.Vertex> ringVertices = new List <TriMesh.Vertex>();
                    do
                    {
                        ringVertices.Add(dualMesh.Vertices[baryVertexIndex + faceIndex]);
                        ringVertices.Add(dualMesh.Vertices[edgeVertexIndex]);
                        if (tempHalfedge.Opposite.Next != null)
                        {
                            tempHalfedge    = tempHalfedge.Opposite.Next;
                            faceIndex       = tempHalfedge.Face.Index;
                            edgeVertexIndex = tempHalfedge.Edge.Index;
                        }
                        else
                        {
                            continue;
                        }
                    } while (tempHalfedge != halfedge1);
                    TriMesh.Vertex[] newFaceVertices = new TriMesh.Vertex[ringVertices.Count];
                    for (int i = 0; i < ringVertices.Count; i++)
                    {
                        newFaceVertices[i] = ringVertices[i];
                    }
                    dualMesh.Faces.Add(newFaceVertices);
                }
                tempHalfedge    = halfedge2;
                edgeVertexIndex = halfedge2.Edge.Index;
                firstVertex     = dualMesh.Vertices[baryVertexIndex + faceIndex];
                secondVertex    = dualMesh.Vertices[edgeVertexIndex];
                if (firstVertex.FindHalfedgeTo(secondVertex) == null)
                {
                    List <TriMesh.Vertex> ringVertices = new List <TriMesh.Vertex>();
                    do
                    {
                        ringVertices.Add(dualMesh.Vertices[baryVertexIndex + faceIndex]);
                        ringVertices.Add(dualMesh.Vertices[edgeVertexIndex]);
                        if (tempHalfedge.Opposite.Next != null)
                        {
                            tempHalfedge    = tempHalfedge.Opposite.Next;
                            faceIndex       = tempHalfedge.Face.Index;
                            edgeVertexIndex = tempHalfedge.Edge.Index;
                        }
                        else
                        {
                            continue;
                        }
                    } while (tempHalfedge != halfedge2);
                    TriMesh.Vertex[] newFaceVertices = new TriMesh.Vertex[ringVertices.Count];
                    for (int i = 0; i < ringVertices.Count; i++)
                    {
                        newFaceVertices[i] = ringVertices[i];
                    }
                    dualMesh.Faces.Add(newFaceVertices);
                }
            }
        }
Exemple #4
0
 protected Vector3D GetPos(TriMesh.HalfEdge hf)
 {
     return(TriMeshUtil.GetMidPoint(hf.Edge));
 }