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;
                         }
                     }
                 }
             }
         }
     }
 }