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); }
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)); } }
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); } } }
protected Vector3D GetPos(TriMesh.HalfEdge hf) { return(TriMeshUtil.GetMidPoint(hf.Edge)); }