private void insertVertexToSameSenseEdge(Face Fa, int Bounds, int Edge, Vertex3d V) { EdgeLoop EL = Fa.Bounds[Bounds]; Edge E = EL[Edge]; Face Neigbhbor = null; int outloop = -1; double d = Face.GetDualEdge(Fa, Bounds, Edge + 0.5, ref outloop, ref Neigbhbor); EdgeLoop DualEL = Neigbhbor.Bounds[outloop]; int DualEdge = (int)d; Edge F = DualEL[DualEdge]; // Zuerst die neue Kante Edge NewEdge = new Edge(); EdgeList.Add(NewEdge); NewEdge.SameSense = true; NewEdge.EdgeStart = E.EdgeStart; NewEdge.EdgeEnd = V; Line3D L = new Line3D(NewEdge.EdgeStart.Value, V.Value); EdgeCurveList.Add(L); L.Neighbors = new Face[2]; L.Neighbors[0] = E.EdgeCurve.Neighbors[0]; L.Neighbors[1] = E.EdgeCurve.Neighbors[1]; NewEdge.EdgeCurve = L; VertexList.Add(V); E.EdgeStart = V; E.EdgeCurve.A = V.Value; EL.Insert(Edge, NewEdge); // Duale NewEdge = new Edge(); NewEdge.SameSense = false; EdgeList.Add(NewEdge); if (DualEdge + 1 < DualEL.Count) { DualEL.Insert(DualEdge + 1, NewEdge); } else { DualEL.Insert(0, NewEdge); } NewEdge.EdgeStart = V; NewEdge.EdgeEnd = F.EdgeEnd; F.EdgeEnd = V; NewEdge.EdgeCurve = L; }
bool Check() { int FC = FaceList.Count; int KC = EdgeCurveList.Count; int EC = VertexList.Count; int CT = EC - KC + FC - 2; // Euler if (CT == 0) { int ED = EdgeList.Count; if (ED == 2 * KC) { /* Ok*/ } else {// return false; } } else { // return false; for (int i = 0; i < EdgeCurveList.Count; i++) { Edge[] Edges = EdgeCurveList[i].Tag as Edge[]; if (Edges != null) { if ((Edges[0] == null) || (Edges[1] == null)) { } else { if (EdgeList.IndexOf(Edges[0]) == -1) { } if (EdgeList.IndexOf(Edges[1]) == -1) { } } } if (EdgeCurveList[i].A.dist(EdgeCurveList[i].B) < 0.0001) { } } } if (!CheckEdges()) { } ; // return false; for (int i = 0; i < FaceList.Count; i++) { Face F = FaceList[i]; for (int j = 0; j < F.Bounds.Count; j++) { EdgeLoop EL = F.Bounds[j]; for (int k = 0; k < EL.Count; k++) { Edge E = EL[k]; int OutLoop = -1; if ((E.SameSense) && ( (E.EdgeCurve.A.dist(E.EdgeStart.Value) > 0.0001) || (E.EdgeCurve.B.dist(E.EdgeEnd.Value) > 0.0001))) { return(false); } if ((!E.SameSense) && ( (E.EdgeCurve.B.dist(E.EdgeStart.Value) > 0.0001) || (E.EdgeCurve.A.dist(E.EdgeEnd.Value) > 0.0001))) { return(false); } Face FF = null; if (E.EdgeCurve.Neighbors[0] == null) { return(false); } if (E.EdgeCurve is Line3D) { Line3D Curve3d = E.EdgeCurve as Line3D; xyz _A = F.Surface.Base.Relativ(Curve3d.A); xyz _B = F.Surface.Base.Relativ(Curve3d.B); if (System.Math.Abs(_A.z) > 0.001) { return(false); } double g = F.Surface.Base.BaseX.length(); double h = F.Surface.Base.BaseY.length(); xyz AA = F.Surface.Base.Absolut(_A); xyz BB = F.Surface.Base.Absolut(_B); if (AA.dist(Curve3d.A) > 0.001) { return(false); } } if (E.EdgeCurve.Neighbors[0] == E.EdgeCurve.Neighbors[1]) { return(false); } if (!FaceList.Contains(E.EdgeCurve.Neighbors[0])) { } if (!FaceList.Contains(E.EdgeCurve.Neighbors[1])) { return(false); } double d = Face.GetDualEdge(F, j, k + 0.01, ref OutLoop, ref FF); } } } return(true); }