public Region(RegionRule x, int[,] biomeMap) { Id = regionCount++; biome = x.biome; foreach (var edge in x.edges) { foreach (int direction in startDirections(edge.touchPoint, biomeMap)) { calculateBounds(edge, direction, biomeMap); } } Simplify(); if (holes.Count == 0) { foreach (var edge in x.edges) { foreach (int direction in startDirections(edge.touchPoint, biomeMap)) { calculateBounds(edge, direction, biomeMap); } } } outerEdge = holes.First().Border; holes.RemoveAt(0); //holes.ForEach(hole => hole.Border.Reverse()); var options = new ConstraintOptions() { ConformingDelaunay = true }; var quality = new QualityOptions() { MinimumAngle = 25 }; var polygon = getPolygon(); pathMesh = polygon.Triangulate(options, quality); graphicsMesh = polygon.Triangulate(); }
/*public Image Test(int[,] biomeMap) * { * Bitmap map; * buildRegionRules(biomeMap),out map); * return map; * }*/ List <RegionRule> buildRegionRules(int[,] biomeMap)//,out Bitmap map) { int width = biomeMap.GetLength(0); int height = biomeMap.GetLength(1); //map = new Bitmap(width, height); //image = new Bitmap(width, height); RegionRule[,] regionMap = new RegionRule[width, height]; //int regionId = 1; BorderRuleList borderRules = new BorderRuleList(); List <RegionRule> regionRules = new List <RegionRule>(); Queue <Edge> newRegionQueue = new Queue <Edge>(); newRegionQueue.Enqueue(new Edge(new PointInt(0, 0), new PointInt(0, -1))); while (newRegionQueue.Count > 0) { Queue <PointInt> regionExplorationQueue = new Queue <PointInt>(); var startEdge = newRegionQueue.Dequeue(); var startPoint = startEdge.touchPoint; if (regionMap.getValue(startPoint) != null) { continue; } var workRegion = new RegionRule(); regionRules.Add(workRegion); workRegion.biome = biomeMap[startPoint.x, startPoint.y]; regionExplorationQueue.Enqueue(startPoint); if (!(startPoint.x == 0 && startPoint.y == 0)) { var neighbour = regionMap.getValue(startEdge.otherTouchPoint); neighbour.edges.Add(startEdge.Reverse()); } workRegion.edges.Add(startEdge); while (regionExplorationQueue.Count > 0) { var explorationPoint = regionExplorationQueue.Dequeue(); for (int d = 0; d < 6; d++) { Direction dir = new Direction(d); if (regionMap.getBorderValue(explorationPoint, dir) == null) { PointInt neighbourPoint = explorationPoint.Neighbor(dir); if (biomeMap.inBounds(neighbourPoint)) { if (biomeMap.sameAsNeighbor(explorationPoint, dir)) { regionExplorationQueue.Enqueue(neighbourPoint); regionMap[neighbourPoint.x, neighbourPoint.y] = workRegion; } else { if (!dir.Diagonal()) { newRegionQueue.Enqueue(new Edge(neighbourPoint, explorationPoint)); } } } } } } regionMap[startPoint.x, startPoint.y] = workRegion; } return(regionRules); }