public void AddEdge(GeoEdge edge) { if (!ContainsEdge(edge)) { outerEdges.Add(edge); } }
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); } }
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); }
public bool ContainsEdge(GeoEdge edge) { for (int i = 0; i < outerEdges.Count; i++) { if (outerEdges[i].CompareTo(edge) == 0) { return(true); } } return(false); }
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); } } } }
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); }
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); } }
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); }
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)); }
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); }
public PolyConnection(int a, int b, GeoEdge connectionEdge) { A = a; B = b; this.ConnectionEdge = connectionEdge; }