float CellArea(Voronoi.Cell cell) { float area = 0.0f; Point p1, p2; for (int iHalfEdge = cell.halfEdges.Count - 1; iHalfEdge >= 0; iHalfEdge--) { HalfEdge halfEdge = cell.halfEdges[iHalfEdge]; p1 = halfEdge.GetStartPoint(); p2 = halfEdge.GetEndPoint(); area += p1.x * p2.y; area -= p1.y * p2.x; } area /= 2; return(area); }
void RelaxSites(int iterations) { for (int i = 0; i < iterations; i++) { if (!this.graph) { return; } Point site; List <Point> sites = new List <Point>(); float dist = 0; float p = 1 / graph.cells.Count * 0.1f; for (int iCell = graph.cells.Count - 1; iCell >= 0; iCell--) { Voronoi.Cell cell = graph.cells[iCell]; float rn = Random.value; // probability of apoptosis if (rn < p) { continue; } site = CellCentroid(cell); dist = Distance(site, cell.site); // don't relax too fast if (dist > 2) { site.x = (site.x + cell.site.x) / 2; site.y = (site.y + cell.site.y) / 2; } // probability of mytosis if (rn > (1 - p)) { dist /= 2; sites.Add(new Point(site.x + (site.x - cell.site.x) / dist, site.y + (site.y - cell.site.y) / dist)); } sites.Add(site); } Compute(sites); } }
Point CellCentroid(Voronoi.Cell cell) { float x = 0f; float y = 0f; Point p1, p2; float v; for (int iHalfEdge = cell.halfEdges.Count - 1; iHalfEdge >= 0; iHalfEdge--) { HalfEdge halfEdge = cell.halfEdges[iHalfEdge]; p1 = halfEdge.GetStartPoint(); p2 = halfEdge.GetEndPoint(); v = p1.x * p2.y - p2.x * p1.y; x += (p1.x + p2.x) * v; y += (p1.y + p2.y) * v; } v = CellArea(cell) * 6; return(new Point(x / v, y / v)); }