private void ComputePD() { List <DualSite3d> list = new List <DualSite3d>(); foreach (Site site in sites) { list.Add(site.ToDualSite()); } for (int i = 0; i < externalEdgePoints.Count; i++) { list.Add(externalEdgePoints[i].ToDualSite()); } CheckPositions(list); ConvexHull <DualSite3d, ConvexFaceExt <DualSite3d> > convexHull = CreateHull(list, 1E-10); foreach (ConvexFaceExt <DualSite3d> face in convexHull.Faces) { if (!(face.Normal[2] >= (double)(0f - Mathf.Epsilon))) { DualSite3d[] vertices = face.Vertices; foreach (DualSite3d dualSite3d in vertices) { if (!dualSite3d.site.dummy && !dualSite3d.visited) { dualSite3d.visited = true; List <Vector2> list2 = new List <Vector2>(); List <ConvexFaceExt <DualSite3d> > list3 = TouchingFaces(dualSite3d, face); dualSite3d.site.neighbours = GenerateNeighbors(dualSite3d, face); foreach (ConvexFaceExt <DualSite3d> item in list3) { Vector2 dualPoint = item.GetDualPoint(); list2.Add(dualPoint); } Polygon polygon = PolyForRandomPoints(list2); Polygon polygon2 = polygon.Clip(bounds, ClipType.ctIntersection); if (polygon2 == null) { polygon.DebugDraw(Color.yellow, false, 1f, 0f); dualSite3d.site.poly.DebugDraw(Color.black, false, 1f, 2f); DebugExtension.DebugCircle2d(dualSite3d.site.position, Color.magenta, 5f, 0f, true, 20f); } else { dualSite3d.site.poly = polygon2; } } } } } debug_LastHull = convexHull; }
public void Validate() { for (int i = 0; i < cellList.Count; i++) { for (int j = 0; j < cellList.Count; j++) { if (j != i) { if (cellList[i] == cellList[j]) { Debug.LogError("Duplicate cell (class)"); return; } if (cellList[i].position == cellList[j].position) { Debug.LogError("Duplicate cell (position)"); return; } if (cellList[i].node == cellList[j].node) { Debug.LogError("Duplicate cell (node)"); return; } } } } for (int k = 0; k < cornerList.Count; k++) { for (int l = 0; l < cornerList.Count; l++) { if (l != k) { if (cornerList[k] == cornerList[l]) { Debug.LogError("Duplicate corner (class)"); return; } if (cornerList[k].position == cornerList[l].position) { Debug.LogError("Duplicate corner (position)"); return; } if (cornerList[k].node == cornerList[l].node) { Debug.LogError("Duplicate corner (node)"); return; } } } } for (int m = 0; m < edgeList.Count; m++) { for (int n = 0; n < edgeList.Count; n++) { if (n != m) { Edge edge = edgeList[m]; Edge edge2 = edgeList[n]; if (edge == edge2) { Debug.LogError("Duplicate edge (class)"); return; } if (edge.arc == edge2.arc) { Debug.LogError("Duplicate EDGE [" + edge.arc + "] & [" + edge2.arc + "] - (ARC) [" + edge.site0.node.Id + "] & [" + edge.site1.node.Id + "]"); return; } if (edge.corner0 == edge2.corner0 && edge.corner1 == edge2.corner1) { Debug.LogError("Duplicate edge (corner same order)"); return; } if (edge.corner0 == edge2.corner1 && edge.corner1 == edge2.corner0) { Debug.LogError("Duplicate edge (corner different order)"); return; } if (edge.site0 != edge.site1 && edge2.site0 != edge2.site1) { if (edge.site0 == edge2.site0 && edge.site1 == edge2.site1) { Debug.LogError("Duplicate edge (site same order)"); return; } if (edge.site0 == edge2.site1 && edge.site1 == edge2.site0) { Debug.LogError("Duplicate Edge [" + edge.arc.Id + "] -> [" + edge.corner0.node.Id + "<-->" + edge.corner1.node.Id + "] sites: [" + edge.site0.node.Id + " -- " + edge.site1.node.Id + "] and [" + edge2.arc.Id + "] -> [" + edge2.corner0.node.Id + "<-->" + edge2.corner1.node.Id + "] sites: [" + edge2.site0.node.Id + " -- " + edge2.site1.node.Id + "] - (site differnt order)"); Debug.Log("CE 0: " + edge.corner0.position + " 1: " + edge.corner1.position); Debug.Log("OE 0: " + edge2.corner0.position + " 1: " + edge2.corner1.position); Debug.Log("Sites C 0: " + edge.site0.position + " 1: " + edge.site1.position); DebugExtension.DebugCircle2d(edge.site0.position, Color.red, 1f, 15f, true, 4f); DebugExtension.DebugCircle2d(edge.site1.position, Color.magenta, 2f, 15f, true, 4f); Debug.Log("Sites O 0: " + edge2.site0.position + " 1: " + edge2.site1.position); DebugExtension.DebugCircle2d(edge2.site0.position, Color.green, 3f, 15f, true, 4f); DebugExtension.DebugCircle2d(edge2.site1.position, Color.cyan, 4f, 15f, true, 4f); } else { if (edge.site0.node == edge2.site0.node && edge.site1.node == edge2.site1.node) { Debug.LogError("Duplicate edge (site node same order)"); return; } if (edge.site1.node == edge2.site0.node && edge.site0.node == edge2.site1.node) { Debug.LogError("Duplicate edge (site node differnt order)"); return; } } } } } } }