public void Add(TopoTriangle triangle) { triangles.Add(triangle); //if (tree != null) //tree.AddTriangle(triangle); }
public void disconnectFace(TopoTriangle face, TopoModel model) { faces.Remove(face); if (faces.Count == 0) { model.edges.Remove(this); } }
public TopoTriangle GetFaceExcept(TopoTriangle notThis) { foreach (TopoTriangle test in faces) { if (test != notThis) { return(test); } } return(null); }
public void Add(TopoTriangle triangle, int index) { if (tempTriangles.Count == 0) { for (int i = 0; i < 4; i++) { tempTriangles.Add(new List <TopoTriangle>()); } } tempTriangles[index].Add(triangle); }
void TestInplane3D_1() { TopoModel model = new TopoModel(); TopoVertex v1 = model.addVertex(new RHVector3(3.67848944664001, -2.6547646522522, 1.38814495312454E-14)); TopoVertex v2 = model.addVertex(new RHVector3(1.62981510162354, -1.05116808414459, 1.83297828141877E-14)); TopoVertex v3 = model.addVertex(new RHVector3(2.29873323440552, -0.79055267572403, 2.11497486191092E-14)); TopoVertex v4 = model.addVertex(new RHVector3(1.63205575942993, -1.05116808414459, 2.78849697113037)); TopoVertex v5 = model.addVertex(new RHVector3(0.916237592697144, -1.1297744512558, 1.83297828141877E-14)); TopoVertex v6 = model.addVertex(new RHVector3(1.38571500778198, -1.07829427719116, 2.67316389083862)); TopoTriangle t1 = model.AddTriangle(new TopoTriangle(model, v1, v2, v3)); TopoTriangle t2 = model.AddTriangle(new TopoTriangle(model, v4, v5, v6)); }
void TestInplaneOutside() { TopoModel model = new TopoModel(); TopoVertex v1 = model.addVertex(new RHVector3(0, 0, 0)); TopoVertex v2 = model.addVertex(new RHVector3(10, 0, 0)); TopoVertex v3 = model.addVertex(new RHVector3(10, 10, 0)); TopoVertex v4 = model.addVertex(new RHVector3(11, 1, 0)); TopoVertex v5 = model.addVertex(new RHVector3(17, 1, 0)); TopoVertex v6 = model.addVertex(new RHVector3(11, 7, 0)); TopoTriangle t1 = model.AddTriangle(new TopoTriangle(model, v1, v2, v3)); TopoTriangle t2 = model.AddTriangle(new TopoTriangle(model, v4, v5, v6)); }
void TestRightAngle() { TopoModel model = new TopoModel(); TopoVertex v1 = model.addVertex(new RHVector3(0, 0, 0)); TopoVertex v2 = model.addVertex(new RHVector3(10, 0, 0)); TopoVertex v3 = model.addVertex(new RHVector3(5, 5, 0)); TopoVertex v4 = model.addVertex(new RHVector3(0, 0, -5)); TopoVertex v5 = model.addVertex(new RHVector3(10, 0, -5)); TopoVertex v6 = model.addVertex(new RHVector3(5, 0, 5)); TopoTriangle t1 = model.AddTriangle(new TopoTriangle(model, v1, v2, v3)); TopoTriangle t2 = model.AddTriangle(new TopoTriangle(model, v4, v5, v6)); }
void TestInplaneInsideSameEdgeIntersects() { TopoModel model = new TopoModel(); TopoVertex v1 = model.addVertex(new RHVector3(0, 0, 0)); TopoVertex v2 = model.addVertex(new RHVector3(10, 0, 0)); TopoVertex v3 = model.addVertex(new RHVector3(10, 10, 0)); TopoVertex v4 = model.addVertex(new RHVector3(1, 1, 0)); TopoVertex v5 = model.addVertex(new RHVector3(7, 1, 0)); TopoVertex v6 = model.addVertex(new RHVector3(5, 3, 0)); TopoTriangle t1 = model.AddTriangle(new TopoTriangle(model, v1, v2, v3)); TopoTriangle t2 = model.AddTriangle(new TopoTriangle(model, v1, v2, v6)); }
void TestInplaneSameVertex() { TopoModel model = new TopoModel(); TopoVertex v1 = model.addVertex(new RHVector3(0, 0, 0)); TopoVertex v2 = model.addVertex(new RHVector3(10, 0, 0)); TopoVertex v3 = model.addVertex(new RHVector3(10, 10, 0)); TopoVertex v4 = model.addVertex(new RHVector3(10, -1, 0)); TopoVertex v5 = model.addVertex(new RHVector3(7, 1, 0)); TopoVertex v6 = model.addVertex(new RHVector3(1, -7, 0)); TopoTriangle t1 = model.AddTriangle(new TopoTriangle(model, v1, v2, v3)); TopoTriangle t2 = model.AddTriangle(new TopoTriangle(model, v1, v4, v6)); }
public bool SameNormalOrientation(TopoTriangle test) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (vertices[i] == test.vertices[j] && vertices[(i + 1) % 3] == test.vertices[(j + 2) % 3]) { return(true); } } } return(false); }
public int testTriangleSideFast(TopoTriangle triangle) { bool d1 = VertexDistance(triangle.vertices[0].pos) > 0; bool d2 = VertexDistance(triangle.vertices[1].pos) > 0; bool d3 = VertexDistance(triangle.vertices[2].pos) > 0; if (d1 && d2 && d3) { return(1); } if (d1 == d2 && d2 == d3) { return(-1); } return(0); }
public int testTriangleSide(TopoTriangle triangle) { double d1 = VertexDistance(triangle.vertices[0].pos); double d2 = VertexDistance(triangle.vertices[1].pos); double d3 = VertexDistance(triangle.vertices[2].pos); if (d1 >= 0 && d2 >= 0 && d3 >= 0) { return(1); } if (d1 <= 0 && d2 <= 0 && d3 <= 0) { return(-1); } return(0); }
public int NumberOfSharedVertices(TopoTriangle tri) { int sameVertices = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (vertices[i] == tri.vertices[j]) { sameVertices++; break; } } } return(sameVertices); }
/*public TopoEdge CommonThirdEdge() * { * TopoVertex v1 = edgeA.v1; * if (edgeB.v1 == v1 || edgeB.v2 == v1) * v1 = edgeA.v2; * TopoVertex v2 = edgeB.v1; * if (edgeA.v1 == v2 || edgeA.v2 == v2) * v2 = edgeB.v2; * foreach (TopoTriangle t in v1.connectedFacesList) * { * TopoEdge e = t.EdgeWithVertices(v1, v2); * if (e != null) * return e; * } * return null; * }*/ public TopoTriangle BuildTriangle(TopoModel model) { TopoVertex sharedPoint = null; TopoVertex p1 = null, p2 = null; if (edgeA.v1 == edgeB.v1) { sharedPoint = edgeA.v1; p1 = edgeA.v2; p2 = edgeB.v2; } else if (edgeA.v1 == edgeB.v2) { sharedPoint = edgeA.v1; p1 = edgeA.v2; p2 = edgeB.v1; } else if (edgeA.v2 == edgeB.v1) { sharedPoint = edgeA.v1; p1 = edgeA.v1; p2 = edgeB.v2; } else if (edgeA.v2 == edgeB.v2) { sharedPoint = edgeA.v2; p1 = edgeA.v1; p2 = edgeB.v1; } TopoTriangle faceA = edgeA.faces.First.Value; TopoTriangle newTriangle = new TopoTriangle(model, sharedPoint, p1, p2, 0, 0, 1); if (newTriangle.SameNormalOrientation(faceA) == false) { newTriangle.FlipDirection(); } //newTriangle.RecomputeNormal(); model.AddTriangle(newTriangle); return(newTriangle); }
public void AddTriangle(TopoTriangle triangle) { if (left == null && triangles == null) { triangles = new HashSet <TopoTriangle>(); } if (triangles != null) { triangles.Add(triangle); //box.Add(triangle.boundingBox); //if (triangles.Count > nextTrySplit) TrySplit(); } /*else * { * if (triangle.boundingBox.maxPoint[dimension] < middlePosition) * left.AddTriangle(triangle); * else if (triangle.boundingBox.minPoint[dimension] > middlePosition) * right.AddTriangle(triangle); * else * middle.AddTriangle(triangle); * }*/ }
public void addIntersectionToSubmesh(Submesh mesh, TopoTriangle triangle, bool addEdges, int color) { int[] outside = new int[3]; int[] inside = new int[3]; int nOutside = 0, nInside = 0; int i; for (i = 0; i < 3; i++) { if (VertexDistance(triangle.vertices[i].pos) > 0) { outside[nOutside++] = i; } else { inside[nInside++] = i; } } if (nOutside != 1 && nOutside != 2) { return; } RHVector3[] intersections = new RHVector3[3]; int nIntersections = 0; for (int iInside = 0; iInside < nInside; iInside++) { for (int iOutside = 0; iOutside < nOutside; iOutside++) { RHVector3 v1 = triangle.vertices[inside[iInside]].pos; RHVector3 v2 = triangle.vertices[outside[iOutside]].pos; double dist1 = VertexDistance(v1); double dist2 = VertexDistance(v2); double pos = Math.Abs(dist1) / Math.Abs(dist2 - dist1); intersections[nIntersections++] = new RHVector3( v1.x + pos * (v2.x - v1.x), v1.y + pos * (v2.y - v1.y), v1.z + pos * (v2.z - v1.z) ); } } if (nInside == 2) { if (outside[0] == 1) { mesh.AddTriangle(triangle.vertices[inside[1]].pos, triangle.vertices[inside[0]].pos, intersections[1], color); mesh.AddTriangle(triangle.vertices[inside[0]].pos, intersections[0], intersections[1], color); } else { mesh.AddTriangle(triangle.vertices[inside[0]].pos, triangle.vertices[inside[1]].pos, intersections[0], color); mesh.AddTriangle(triangle.vertices[inside[1]].pos, intersections[1], intersections[0], color); } } else { if (inside[0] == 1) { mesh.AddTriangle(triangle.vertices[inside[0]].pos, intersections[1], intersections[0], color); } else { mesh.AddTriangle(triangle.vertices[inside[0]].pos, intersections[0], intersections[1], color); } } /*if (addEdges) * { * if (nInside == 2) * { * mesh.AddEdge(triangle.vertices[inside[0]].pos, triangle.vertices[inside[1]].pos, triangle.edges[0].connectedFaces == 2 ? Submesh.MESHCOLOR_EDGE : Submesh.MESHCOLOR_ERROREDGE); * mesh.AddEdge(triangle.vertices[inside[0]].pos, intersections[0], triangle.edges[1].connectedFaces == 2 ? Submesh.MESHCOLOR_EDGE : Submesh.MESHCOLOR_ERROREDGE); * mesh.AddEdge(triangle.vertices[inside[1]].pos, intersections[1], triangle.edges[2].connectedFaces == 2 ? Submesh.MESHCOLOR_EDGE : Submesh.MESHCOLOR_ERROREDGE); * } * else * { * for (int iInter = 0; iInter < nIntersections; iInter++) * { * mesh.AddEdge(triangle.vertices[inside[0]].pos, intersections[iInter], triangle.edges[(inside[0]+2*iInter) % 3].connectedFaces == 2 ? Submesh.MESHCOLOR_EDGE : Submesh.MESHCOLOR_ERROREDGE); * } * } * }*/ if (nIntersections == 2) { mesh.AddEdge(intersections[0], intersections[1], Submesh.MESHCOLOR_CUT_EDGE); } }
public bool Remove(TopoTriangle triangle) { //if (tree != null) //tree.RemoveTriangle(triangle); return(triangles.Remove(triangle)); }
public bool Contains(TopoTriangle test) { return(triangles.Contains(test)); }
public TopoTriangleDistance(double dist, TopoTriangle tri) { triangle = tri; distance = dist; }
/// <summary> /// Splits an edge and changes the connected triangles to maintain /// a topological correct system. /// </summary> /// <param name="model"></param> /// <param name="vertex"></param> public void InsertVertex(TopoModel model, TopoVertex vertex) { LinkedList <TopoTriangle> delList = new LinkedList <TopoTriangle>(); LinkedList <TopoTriangle> testFaces = new LinkedList <TopoTriangle>(); foreach (TopoTriangle oldTriangle in faces) { testFaces.AddLast(oldTriangle); } foreach (TopoTriangle oldTriangle in testFaces) { delList.AddLast(oldTriangle); for (int i = 0; i < 3; i++) { if (oldTriangle.vertices[i] != v1 && oldTriangle.vertices[i] != v2) { TopoTriangle newTriangle = new TopoTriangle(model, v1, vertex, oldTriangle.vertices[i]); if (newTriangle.IsDegenerated()) { newTriangle.Unlink(model); } else { // Test orientation /*for (int e = 0; e < 3; e++) * { * TopoTriangle neigbour = newTriangle.edges[i].GetFaceExcept(newTriangle); * if (neigbour != null) * { * if(!newTriangle.SameNormalOrientation(neigbour)) * newTriangle.FlipDirection(); * break; * } * }*/ model.AddTriangle(newTriangle); } newTriangle = new TopoTriangle(model, vertex, v2, oldTriangle.vertices[i]); if (newTriangle.IsDegenerated()) { newTriangle.Unlink(model); } else { // Test orientation /*for (int e = 0; e < 3; e++) * { * TopoTriangle neigbour = newTriangle.edges[i].GetFaceExcept(newTriangle); * if (neigbour != null) * { * if (!newTriangle.SameNormalOrientation(neigbour)) * newTriangle.FlipDirection(); * break; * } * }*/ model.AddTriangle(newTriangle); } } } } foreach (TopoTriangle tri in delList) { tri.Unlink(model); model.removeTriangle(tri); } }
public void connectFace(TopoTriangle face) { faces.AddLast(face); }