Example #1
0
        float CellArea(global::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);
        }
Example #2
0
        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 = 1f / graph.cells.Count * 0.1f;

                for (int iCell = graph.cells.Count - 1; iCell >= 0; iCell--)
                {
                    global::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);
            }
        }
Example #3
0
        Point CellCentroid(global::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));
        }