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)); }
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 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 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 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)); if (t1.Intersects(t2)) { faildTests++; Console.WriteLine("Failed test:TestInplaneOutside"); } }
void TestSharedPointIntersect() { 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, v1, v5, v6)); if (!t1.Intersects(t2)) { faildTests++; Console.WriteLine("Failed test:TestSharedPointIntersect"); } }
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)); if (!t1.Intersects(t2)) { faildTests++; Console.WriteLine("Failed test:TestInplaneInsideSameEdgeIntersects"); } }
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); }
/// <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); } }