Пример #1
0
        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();
        }
Пример #2
0
        /*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);
        }