Esempio n. 1
0
 public void AddEdge(GeoEdge edge)
 {
     if (!ContainsEdge(edge))
     {
         outerEdges.Add(edge);
     }
 }
Esempio n. 2
0
 public static bool TryMerge(ref Poly toPoly, Triangle mergeTri, ref GeoEdge sharedEdge)
 {
     if (CouldMerge(ref toPoly, mergeTri, sharedEdge))
     {
         return(Merge(ref toPoly, mergeTri, ref sharedEdge));
     }
     else
     {
         return(false);
     }
 }
Esempio n. 3
0
        public GeoEdge RelatedEdgeExtrude(int p, GeoEdge extrudeEdge)
        {
            for (int i = 0; i < outerEdges.Count; i++)
            {
                if (outerEdges[i].IsRelatedToPoint(p) && (outerEdges[i].CompareTo(extrudeEdge) != 0))
                {
                    return(outerEdges[i]);
                }
            }

            return(null);
        }
Esempio n. 4
0
        public bool ContainsEdge(GeoEdge edge)
        {
            for (int i = 0; i < outerEdges.Count; i++)
            {
                if (outerEdges[i].CompareTo(edge) == 0)
                {
                    return(true);
                }
            }

            return(false);
        }
Esempio n. 5
0
 public void RemoveEdge(GeoEdge edge)
 {
     if (ContainsEdge(edge))
     {
         for (int i = 0; i < outerEdges.Count; i++)
         {
             if (outerEdges[i].CompareTo(edge) == 0)
             {
                 outerEdges.RemoveAt(i);
             }
         }
     }
 }
Esempio n. 6
0
        public List <GeoEdge> RestEdge(GeoEdge edge)
        {
            List <GeoEdge> restEdge = new List <GeoEdge>();

            for (int i = 0; i < outerEdges.Count; i++)
            {
                if (outerEdges[i].CompareTo(edge) != 0)
                {
                    restEdge.Add(outerEdges[i]);
                }
            }

            return(restEdge);
        }
Esempio n. 7
0
        public static bool Merge(ref Poly toPoly, Poly mergeTri, ref GeoEdge sharedEdge)
        {
            List <GeoEdge> restEdge = mergeTri.RestEdge(sharedEdge);

            if (!toPoly.ContainsSomeEdge(restEdge))
            {
                toPoly.RemoveEdge(sharedEdge);
                toPoly.AddEdges(restEdge);
                return(true);
            }
            else
            {
                return(false);
            }
        }
Esempio n. 8
0
        public static bool CouldMerge(ref Poly toPoly, Poly mergeTri, GeoEdge sharedEdge)
        {
            bool    couldmerge = true;
            Vector3 a          = toPoly.RelatedEdgeExtrude(sharedEdge.A, sharedEdge).OtherPoint(sharedEdge.A);
            Vector3 b          = sharedEdge.PointA;
            Vector3 c          = mergeTri.RelatedEdgeExtrude(sharedEdge.A, sharedEdge).OtherPoint(sharedEdge.A);
            Vector3 d          = sharedEdge.OtherPoint(sharedEdge.A);

            couldmerge &= GraphTester2D.TotalAngleForThreeSeg(a, b, c, d) - 180f < 1e-06;

            a           = toPoly.RelatedEdgeExtrude(sharedEdge.B, sharedEdge).OtherPoint(sharedEdge.B);
            b           = sharedEdge.PointB;
            c           = mergeTri.RelatedEdgeExtrude(sharedEdge.B, sharedEdge).OtherPoint(sharedEdge.B);
            d           = sharedEdge.OtherPoint(sharedEdge.B);
            couldmerge &= GraphTester2D.TotalAngleForThreeSeg(a, b, c, d) - 180f < 1e-06;

            return(couldmerge);
        }
Esempio n. 9
0
 private static bool AreEqual(GeoEdge a, GeoEdge b)
 {
     return((a.A == b.A && a.B == b.B) || (a.A == b.B && a.B == b.A));
 }
Esempio n. 10
0
        public void ProcessMeshToGraph()
        {
            Dictionary <Triangle, bool> visited = new Dictionary <Triangle, bool>();

            foreach (Triangle tri in triangles)
            {
                visited.Add(tri, false);
            }
            Queue <Poly> processEdgeQueue = new Queue <Poly>();

            int i = 0;

            componentCount = 0;

            int mergedCout = 0;

            while (triangles.Count > 0)
            {
                componentCount++;                 //整张图的联通分量计数++
                Triangle tri = triangles.First(); //拿出一个三角形
                tri.Index    = i++;               //为这个poly分配索引
                visited[tri] = true;
                processEdgeQueue.Enqueue(tri);
                triangles.Remove(tri);
                foreach (GeoEdge e in tri.Edges)
                {
                    if (edgeTriangleMap.ContainsKey(e.Index) && edgeTriangleMap[e.Index].Contains(tri))
                    {
                        edgeTriangleMap[e.Index].Remove(tri);//移除这个三角形和它的边的映射
                    }
                }

                while (processEdgeQueue.Count > 0)
                {
                    Poly poly = processEdgeQueue.Dequeue();

                    bool hasConnection = false;
                    for (int j = 0; j < poly.Edges.Count; j++)
                    {//对于这个多边形的每一条边
                        GeoEdge e = poly.Edges[j];

                        for (int k = 0; k < edgeTriangleMap[e.Index].Count; k++)
                        {//如果有与之相连的其他三角形
                            Triangle t = edgeTriangleMap[e.Index][k];
                            if (triangles.Contains(t) && t != poly && PolyProcesser.HasSharedEdge(poly, t))
                            {
                                GeoEdge sharedEdge = PolyProcesser.SharedEdge(poly, t);
                                if (PolyProcesser.TryMerge(ref poly, t, ref sharedEdge)) //如果可以成功合并
                                {                                                        //这里ref Poly处理过后,里面就有t的边了
                                    hasConnection = true;
                                    mergedCout++;
                                }
                                else
                                {//相连但不可成功合并,说明是相连的多边形
                                    if (!visited[t])
                                    {
                                        processEdgeQueue.Enqueue(t);
                                        t.Index    = i++;
                                        visited[t] = true;
                                        //设置polyConnection,这里polyConnection还不用计算Weight,因为可能poly和t的顶点都没有全部得到
                                        PolyConnection con = new PolyConnection(poly.Index, t.Index, sharedEdge);
                                        if (!polyConnections.Contains(con))
                                        {
                                            polyConnections.Add(con);
                                            InsertNearPoly(con.A, con);
                                            InsertNearPoly(con.B, con);
                                        }
                                    }
                                }

                                edgeTriangleMap[e.Index].Remove(t);
                                triangles.Remove(t);
                            }
                        }
                    }

                    if (hasConnection)
                    {
                        processEdgeQueue.Enqueue(poly);//说明还有连接,可能这个poly还没有处理完
                    }
                    else
                    {//Poly没有连接了,说明处理完了,对poly做最后的处理
                        if (!polys.ContainsKey(poly.Index))
                        {
                            polys.Add(poly.Index, poly);
                        }
                    }
                }
            }
            //对polyConnection计算权值
            foreach (PolyConnection polyCon in polyConnections)
            {
                Vector3 pointA = CenterPoint(polys[polyCon.A].GetPoints());
                Vector3 pointB = CenterPoint(polys[polyCon.B].GetPoints());
                polyCon.Weight = Vector3.Distance(pointA, pointB);
            }

            Debug.Log("merged count :" + mergedCout);
            Debug.Log("component count :" + componentCount);
        }
Esempio n. 11
0
 public PolyConnection(int a, int b, GeoEdge connectionEdge)
 {
     A = a;
     B = b;
     this.ConnectionEdge = connectionEdge;
 }