public void AddRegion(VoronoiRegion <Vertex2> region) { PolygonRegionIndex ri = new PolygonRegionIndex(); PolygonRegion r = new PolygonRegion(); //添加多边形顶点,计算多边形中心点 Vector3 center = Vector3.zero; foreach (var c in region.Cells) { var z = na.NoiseValue(c.CircumCenter.X, c.CircumCenter.Y); var tmpPoint = new Vector3(c.CircumCenter.X, c.CircumCenter.Y, z); var p = Contain(tmpPoint); center += p; r.Vertexs.Add(p); if (!vertexs.Contains(p)) { vertexs.Add(p); } } r.position = center / region.Cells.Count; ri.center = center / region.Cells.Count; //添加多边形边 foreach (var e in region.Edges) { var pA = Contain(new Vector3(e.From.CircumCenter.X, e.From.CircumCenter.Y)); var pB = Contain(new Vector3(e.To.CircumCenter.X, e.To.CircumCenter.Y)); var edge = Contain(new PolygonEdge(pA, pB)); r.Edges.Add(edge); if (!edges.Contains(edge)) { edges.Add(edge); } } foreach (var e in region.Edges) { var pA = ContainVertexIndex(new Vector3(e.From.CircumCenter.X, e.From.CircumCenter.Y)); var pB = ContainVertexIndex(new Vector3(e.To.CircumCenter.X, e.To.CircumCenter.Y)); var edge = new PolygonEdgeIndex(pA, pB); var index = Contain(edge); if (index == -1) { edgesIndex.Add(edge); index = edgesIndex.Count - 1; } ri.EdgesIndex.Add(index); } regions.Add(r); regionsIndex.Add(ri); }
int Contain(PolygonEdgeIndex edge) { for (int i = 0; i < edgesIndex.Count; i++) { if (edge == edgesIndex[i]) { return(i); } } return(-1); }