Exemple #1
0
        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;
        }
Exemple #2
0
        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);
        }