Ejemplo n.º 1
0
 public void AddFaces(AKT_MeshFace face)
 {
     this._faces.Add(face);
 }
Ejemplo n.º 2
0
        public List <AKT_Polyline> NakedEdges()
        {
            //IEnumerable<AKT_Polyline> polys = TopologyEdges.Edges.Distinct()
            //    .Select(a => new AKT_Polyline(m_vertices[a.S], m_vertices[a.E]));

            //IEnumerable<AKT_Polyline> polys = TopologyEdges.Edges.GroupBy(a => a, new AKT_MeshEdgePairs.EdgeComparer())
            //    .Where(b => b.Count() == 1)
            //    .Select(a => new AKT_Polyline(m_vertices[a.First().S], m_vertices[a.First().E]));

            List <AKT_MeshEdgePairs> edges = new List <AKT_MeshEdgePairs>();

            foreach (AKT_MeshFace f in Faces.Faces)
            {
                edges.Add(new AKT_MeshEdgePairs(f.A, f.B));
                edges.Add(new AKT_MeshEdgePairs(f.B, f.C));

                if (f.MeshType == MeshTypology.Triangular)
                {
                    edges.Add(new AKT_MeshEdgePairs(f.C, f.A));
                }
                else
                {
                    edges.Add(new AKT_MeshEdgePairs(f.C, f.D));
                    edges.Add(new AKT_MeshEdgePairs(f.D, f.A));
                }
            }

            var polys1 = edges.GroupBy(a => a, new AKT_MeshEdgePairs.EdgeComparer());
            var polys2 = polys1.Where(b => b.Count() == 1);
            var polys3 = polys2.Select(a => new AKT_Polyline(m_vertices[a.First().S], m_vertices[a.First().E]));


            //var polys1Arr = polys1.ToArray();
            //var polys2Arr = polys2.ToArray();
            //var polys3Arr = polys3.ToArray();


            return(AKT_Polyline.JoinPolylines(polys3));

            return(polys3.ToList());

            AKT_Polyline[] polpo = polys3.ToArray();

            //List<List<AKT_MeshEdgePairs>> lll = new List<List<AKT_MeshEdgePairs>>();

            //foreach (var x in TopologyEdges.Edges)
            //{
            //    List<AKT_MeshEdgePairs> ll = new List<AKT_MeshEdgePairs>();

            //    foreach (var y in TopologyEdges.Edges)
            //    {
            //        bool e = x.E == y.E || x.E == y.S;
            //        bool s = x.S == y.E || x.S == y.S;

            //        bool a = e && s;

            //        if (a)
            //        {
            //            ll.Add(y);
            //        }

            //    }

            //    lll.Add(ll);

            //}

            return(AKT_Polyline.JoinPolylines(polys3));



            AKT_Mesh            mesh      = this;
            List <AKT_Interval> intervals = new List <AKT_Interval>();

            bool[] nakedEdgePointStatus = mesh.GetNakedEdgePointStatus();
            int    i = 0;

            while (true)
            {
                if (i >= mesh.m_faces.Count)
                {
                    break;
                }
                AKT_MeshFace face = mesh.m_faces[i];
                int          a    = face.A;
                int          b    = face.B;
                if ((!nakedEdgePointStatus[a] ? false : nakedEdgePointStatus[b]))
                {
                    if (intervals.IndexOf(new AKT_Interval((double)b, (double)a)) != -1)
                    {
                        intervals.Remove(new AKT_Interval((double)b, (double)a));
                    }
                    else if (intervals.IndexOf(new AKT_Interval((double)a, (double)b)) == -1)
                    {
                        intervals.Add(new AKT_Interval((double)a, (double)b));
                    }
                    else
                    {
                        intervals.Remove(new AKT_Interval((double)a, (double)b));
                    }
                }
                a = face.B;
                b = face.C;
                if ((!nakedEdgePointStatus[a] ? false : nakedEdgePointStatus[b]))
                {
                    if (intervals.IndexOf(new AKT_Interval((double)b, (double)a)) != -1)
                    {
                        intervals.Remove(new AKT_Interval((double)b, (double)a));
                    }
                    else if (intervals.IndexOf(new AKT_Interval((double)a, (double)b)) == -1)
                    {
                        intervals.Add(new AKT_Interval((double)a, (double)b));
                    }
                    else
                    {
                        intervals.Remove(new AKT_Interval((double)a, (double)b));
                    }
                }
                if (face.MeshType != MeshTypology.Triangular)
                {
                    a = face.C;
                    b = face.D;
                    if ((!nakedEdgePointStatus[a] ? false : nakedEdgePointStatus[b]))
                    {
                        if (intervals.IndexOf(new AKT_Interval((double)b, (double)a)) != -1)
                        {
                            intervals.Remove(new AKT_Interval((double)b, (double)a));
                        }
                        else if (intervals.IndexOf(new AKT_Interval((double)a, (double)b)) == -1)
                        {
                            intervals.Add(new AKT_Interval((double)a, (double)b));
                        }
                        else
                        {
                            intervals.Remove(new AKT_Interval((double)a, (double)b));
                        }
                    }
                    a = face.D;
                    b = face.A;
                    if ((!nakedEdgePointStatus[a] ? false : nakedEdgePointStatus[b]))
                    {
                        if (intervals.IndexOf(new AKT_Interval((double)b, (double)a)) != -1)
                        {
                            intervals.Remove(new AKT_Interval((double)b, (double)a));
                        }
                        else if (intervals.IndexOf(new AKT_Interval((double)a, (double)b)) == -1)
                        {
                            intervals.Add(new AKT_Interval((double)a, (double)b));
                        }
                        else
                        {
                            intervals.Remove(new AKT_Interval((double)a, (double)b));
                        }
                    }
                }
                else
                {
                    a = face.C;
                    b = face.A;
                    if ((!nakedEdgePointStatus[a] ? false : nakedEdgePointStatus[b]))
                    {
                        if (intervals.IndexOf(new AKT_Interval((double)b, (double)a)) != -1)
                        {
                            intervals.Remove(new AKT_Interval((double)b, (double)a));
                        }
                        else if (intervals.IndexOf(new AKT_Interval((double)a, (double)b)) == -1)
                        {
                            intervals.Add(new AKT_Interval((double)a, (double)b));
                        }
                        else
                        {
                            intervals.Remove(new AKT_Interval((double)a, (double)b));
                        }
                    }
                }
                i++;
            }
            if (intervals.Count > 0)
            {
                List <int> nums  = new List <int>(intervals.Count);
                List <int> nums1 = new List <int>(intervals.Count);
                for (i = 0; i < intervals.Count; i++)
                {
                    AKT_Interval item = intervals[i];
                    nums.Add((int)item.T0);
                    item = intervals[i];
                    nums1.Add((int)item.T1);
                }
            }
            return(null);
            //throw new NotImplementedException();
        }