Inheritance: MonoBehaviour
Ejemplo n.º 1
0
        private void BuildGrid()
        {
            grid = LineGrid <SpriteCell>
                   .BeginShape()
                   .Segment(300)
                   .EndShape();

            map2D = new ArchimedeanSpiralMap(CellDimensions, grid)
                    .AnchorCellMiddleCenter()
                    .WithWindow(ExampleUtils.ScreenRect)
                    .AlignMiddleCenter(grid);

            map = map2D
                  .To3DXY();

            foreach (var point in grid)
            {
                var cell = Instantiate(cellPrefab);

                Vector3 worldPoint = map[point];

                cell.transform.parent        = root.transform;
                cell.transform.localScale    = Vector3.one;
                cell.transform.localPosition = worldPoint;

                cell.Color = ExampleUtils.Colors[ColorFunction(point)] + Color.white * 0.2f;
                cell.name  = point.ToString();

                grid[point] = cell;
            }

            voronoiMap = new VoronoiMap <LinePoint>(grid, map2D);
            ExampleUtils.PaintScreenTexture(plane, voronoiMap, ColorFunction);
        }
Ejemplo n.º 2
0
        public void TestAddRange()
        {
            var sites = new[] {
                new Site {
                    Point = new Point {
                        X = 1, Y = 2
                    }
                },
                new Site {
                    Point = new Point {
                        X = 1, Y = 1
                    }
                },
                new Site {
                    Point = new Point {
                        X = 3, Y = 2
                    }
                }
            };

            var map = new VoronoiMap();

            map.AddRange(sites);

            Assert.AreEqual(sites.Count(), map.Count());
        }
Ejemplo n.º 3
0
	private void BuildGrid()
	{
		grid = LineGrid<SpriteCell>
			.BeginShape()
			.Segment(300)
			.EndShape();

		map2D = new ArchimedeanSpiralMap(CellDimensions, grid)
			.AnchorCellMiddleCenter()
			.WithWindow(ExampleUtils.ScreenRect)
			.AlignMiddleCenter(grid);

		map = map2D
			.To3DXY();

		foreach (var point in grid)
		{
			var cell = Instantiate(cellPrefab);

			Vector3 worldPoint = map[point];

			cell.transform.parent = root.transform;
			cell.transform.localScale = Vector3.one;
			cell.transform.localPosition = worldPoint;

			cell.Color = ExampleUtils.Colors[ColorFunction(point)] + Color.white * 0.2f;
			cell.name = point.ToString();

			grid[point] = cell;
		}

		voronoiMap = new VoronoiMap<LinePoint>(grid, map2D);
		ExampleUtils.PaintScreenTexture(plane, voronoiMap, ColorFunction);
	}
Ejemplo n.º 4
0
        private void BuildGrid()
        {
            var pointList = PoissonDisk.GeneratePoisson(ExampleUtils.ScreenRect, cellDimensions.magnitude, 10);

            grid = LineGrid <SpriteCell> .BeginShape().Segment(pointList.Count).EndShape();

            var map2D = VoronoiMap <LinePoint> .MakeMap(pointList);

            voronoiMap = map2D.To3DXY();

            foreach (var point in grid)
            {
                var     cell       = Instantiate(cellPrefab);
                Vector3 worldPoint = voronoiMap[point];

                cell.transform.parent        = root.transform;
                cell.transform.localScale    = Vector3.one;
                cell.transform.localPosition = worldPoint;

                cell.Color = ExampleUtils.Colors[ColorFunction(point)] + Color.white * 0.1f;
                cell.name  = point.ToString();

                grid[point] = cell;
            }

            ExampleUtils.PaintScreenTexture(plane, voronoiMap.To2D(), ColorFunction);
        }
Ejemplo n.º 5
0
        public void TestToArray()
        {
            var sites = new IGeometry[]
            {
                new Site {
                    Point = new Point  {
                        X = 40, Y = 60
                    }
                },
                new Site {
                    Point = new Point {
                        X = 20, Y = 40
                    }
                },
                new Site {
                    Point = new Point {
                        X = 60, Y = 40
                    }
                },
                new HalfEdge(new Point {
                    X = 30, Y = 50
                }, new Point {
                    X = 20, Y = 40
                }, new Point {
                    X = 40, Y = 60
                }),
                new Vertex {
                    Point = new Point {
                        X = 40, Y = 40
                    }
                }
            };

            var map = new VoronoiMap();

            map.AddRange(sites);

            var result = map.ToArray();

            Assert.IsNotNull(result);
            Assert.AreEqual(70, result.GetLength(0));
            Assert.AreEqual(70, result.GetLength(1));
            Assert.AreEqual(new Point {
                X = 40, Y = 60
            }, result[45, 65].Point);
            Assert.AreEqual(new Point {
                X = 20, Y = 40
            }, result[25, 45].Point);
            Assert.AreEqual(new Point {
                X = 60, Y = 40
            }, result[65, 45].Point);
            Assert.AreEqual(new Point {
                X = 40, Y = 40
            }, result[45, 45].Point);
        }
Ejemplo n.º 6
0
        public void Start()
        {
            var grid = LineGrid <int>
                       .BeginShape()
                       .Segment(10)
                       .EndShape();

            var map = new ArchimedeanSpiralMap(CellDimensions, grid);

            var voronoiMap = new VoronoiMap <LinePoint>(grid, map);

            ExampleUtils.PaintScreenTexture(plane, voronoiMap, n => GLMathf.FloorMod(n, 12));
        }
Ejemplo n.º 7
0
		public void Start()
		{
			var grid = LineGrid<int>
				.BeginShape()
				.Segment(10)
				.EndShape();

			var map = new ArchimedeanSpiralMap(CellDimensions, grid);

			var voronoiMap = new VoronoiMap<LinePoint>(grid, map);

			ExampleUtils.PaintScreenTexture(plane, voronoiMap, n => GLMathf.Mod(n, 12));
		}
Ejemplo n.º 8
0
        public Bitmap DrawVoronoi(List <VoronoiPoint> pointlist, VoronoiMap voronoimap)
        {
            //var b = new Bitmap(1000, 1000);
            var g       = Graphics.FromImage(b);
            var lrnodes = new List <ceometric.DelaunayTriangulator.Point>();

            foreach (VoronoiSegment seg in voronoimap.graph)
            {
                lrnodes.Add(seg.LeftNode.Point()); lrnodes.Add(seg.RightNode.Point());
            }
            var dlpoints = new DelaunayTriangulation2d().Triangulate(lrnodes);

            foreach (VoronoiSegment seg in voronoimap.graph)
            {
                float imageratio = 100f;
                var   pen        = new SolidBrush(Color.Red);
                var   randomizer = new System.Random();
                var   cornerpen  = new Pen(Color.Green);
                g.FillRectangle(pen, (float)seg.start.X * imageratio, (float)seg.start.Y * imageratio, 2, 2);
                if (seg.completed)
                {
                    g.DrawLine(cornerpen, (float)seg.start.X * imageratio, (float)seg.start.Y * imageratio, (float)seg.end.X * imageratio, (float)seg.end.Y * imageratio);
                }
            }
            foreach (VoronoiPoint pt in pointlist)
            {
                float imageratio = 100f;
                var   pen        = new SolidBrush(Color.Blue);
                var   randomizer = new System.Random();
                var   cornerpen  = new SolidBrush(Color.Blue);
                g.FillRectangle(pen, (float)pt.X * imageratio, (float)pt.Y * imageratio, 2, 2);
            }

            foreach (ceometric.DelaunayTriangulator.Triangle tri in dlpoints)
            {
                tri.Draw(g, Color.Red);
            }
            return(b);
        }
Ejemplo n.º 9
0
    void Start()
    {
        if (mapgeneratoractive)
        {
            if (ItemSpawns.Sum(i => i.ItemSpawnCountPerSquareSize) > SquareSize)
            {
                throw new System.Exception("Die Globale ItemSpawnCountPerSquareSize variable darf nicht größer wie der SquareSize sein");
            }
            foreach (var tileType in TileTypes)
            {
                if (tileType.UniqueItemsForTileType.Sum(i => i.ItemSpawnCountPerSquareSize) > SquareSize)
                {
                    throw new System.Exception("Die ItemSpawnCountPerSquareSize variable für das Tile '" + tileType.TypeSprite.name + "' darf nicht größer wie der SquareSize sein");
                }
            }

            float totalitemSpawns = ItemSpawns.Sum(i => i.ItemSpawnCountPerSquareSize) + TileTypes.Sum(t => t.UniqueItemsForTileType.Sum(i => i.ItemSpawnCountPerSquareSize));
            if (totalitemSpawns > mapWidth * mapHeight)
            {
                throw new System.Exception("Die gesamte Item spawn Anzahl ist zu hoch");
            }

            cameraTransform = Camera.main.transform;

            Vector3 cameraP1 = Camera.main.ScreenToWorldPoint(Vector3.zero);
            Vector3 cameraP2 = Camera.main.ScreenToWorldPoint(new Vector3(Camera.main.pixelWidth, Camera.main.pixelHeight));
            screenWidth  = (int)(Mathf.Abs(cameraP2.x - cameraP1.x) / spriteGroesse) + 5;
            screenHeight = (int)(Mathf.Abs(cameraP2.y - cameraP1.y) / spriteGroesse) + 5;

            //Erstelle eine gerade anzahl an SpriteRenderer auf der map
            screenWidth  += screenWidth % 2 == 0 ? 0 : 1;
            screenHeight += screenHeight % 2 == 0 ? 0 : 1;

            if (ShowWholeMap)
            {
                screenWidth  = mapWidth + 20;
                screenHeight = mapHeight + 20;
            }

            spriteRenderer = new SpriteRenderer[screenWidth, screenHeight]; //Speicher für SpriteRenderer

            int halfScreenWidth  = screenWidth / 2;                         //erstellen der Sprites
            int halfScreenHeight = screenHeight / 2;
            for (int x = 0; x < screenWidth; x++)
            {
                for (int y = 0; y < screenHeight; y++)
                {
                    GameObject NewTile = GameObject.Instantiate(tile, new Vector3((spriteGroesse * x - halfScreenWidth * spriteGroesse), (spriteGroesse * y - halfScreenHeight * spriteGroesse), 0), Quaternion.identity, parent);
                    spriteRenderer[x, y] = NewTile
                                           .GetComponent <SpriteRenderer>(); //Instantiert ein neues Objekt mit SpriteRender, und speichert diesen im SpriteRendererArray
                }
            }

            sprites = new Sprite[TileTypes.Length + 1];
            for (int i = 1; i < TileTypes.Length + 1; i++)
            {
                sprites[i] = TileTypes[i - 1].TypeSprite;
            }
            sprites[0] = BorderSprite;

            availableSpawnPoints = new byte[mapWidth, mapHeight];

            VoronoiMap voronoiMap = new VoronoiMap(TileTypes);

            Dictionary <VoronoiPoint, List <Vector2> > regions;
            map = voronoiMap.GenerateMap(mapWidth, mapHeight, VoronoiPointCount, out regions);

            //GenerateBorder();

            SpawnItems(regions);
            refreshScreen(); //SpriteRenderer erneuern

            // Wassertile Colider hinzufügen, nicht passierbar machen und fischbar machen
            int childcounterM = Tilemap.transform.childCount;
            for (int i = 0; i < childcounterM; i++)
            {
                Transform      Tile     = Tilemap.transform.GetChild(i);
                SpriteRenderer Renderer = Tile.gameObject.GetComponent <SpriteRenderer>();
                if (Renderer.sprite.name == "water")
                {
                    Tile.GetComponent <BoxCollider2D>().enabled   = true;
                    Tile.GetComponent <BoxCollider2D>().isTrigger = false;
                    Tile.GetComponent <BoxCollider2D>().size      = new Vector2(0.2f, 0.2f);
                    Tile.gameObject.AddComponent <Fishable>();
                }
            }
        }
    }
Ejemplo n.º 10
0
 public PolyMap(VoronoiMap voronoimap, List <VoronoiPoint> basepoints)
 {
     this.voronoimap = voronoimap;
     this.basepoints = basepoints;
     GenerateMainGraph();
 }
Ejemplo n.º 11
0
        public void TestAddVertex()
        {
            var left = new HalfEdge(new Point {
                X = 74, Y = 139
            }, new Point {
                X = 170, Y = 140
            }, new Point {
                X = 130, Y = 160
            });
            var center = new HalfEdge(new Point {
                X = 61, Y = 139
            }, new Point {
                X = 170, Y = 140
            }, new Point {
                X = 110, Y = 150
            });
            var right = new HalfEdge(new Point {
                X = 49, Y = 149
            }, new Point {
                X = 130, Y = 160
            }, new Point {
                X = 110, Y = 150
            });
            var vertex = new Vertex {
                Point = new Point {
                    X = 136, Y = 121
                },
            };

            vertex.HalfEdges.Add(left);
            left.End = vertex;
            vertex.HalfEdges.Add(center);
            center.Start = vertex;
            vertex.HalfEdges.Add(right);
            right.End = vertex;

            var map = new VoronoiMap();

            map.Add(vertex);

            Assert.AreEqual(4, map.Count());
            Assert.AreEqual(1, map.Count(g => g is Vertex));
            Assert.AreEqual(3, map.Count(g => g is HalfEdge));

            // Found circle event for arcs:
            // Leaf: Point: X: 95, Y: 75, CircleEvent: ,
            // Leaf: Point: X: 130, Y: 160, CircleEvent: Point: X: 146, Y: 46,
            // Leaf: Point: X: 110, Y: 150, CircleEvent: Point: X: 136, Y: 83
            // at Point: Point: X: 146, Y: 46 and Vertex: Point: X: 146, Y: 104
            // Add Vertex: Point: X: 146, Y: 104, Half Edges: Point: X: 85, Y: 74, Point: X: 49, Y: 149, Point: X: 78, Y: 74

            var left2 = new HalfEdge(new Point {
                X = 85, Y = 74
            }, new Point {
                X = 95, Y = 75
            }, new Point {
                X = 130, Y = 160
            });
            var center2 = new HalfEdge(new Point {
                X = 78, Y = 74
            }, new Point {
                X = 95, Y = 75
            }, new Point {
                X = 110, Y = 150
            });
            var right2 = new HalfEdge(new Point {
                X = 49, Y = 149
            }, new Point {
                X = 130, Y = 160
            }, new Point {
                X = 110, Y = 150
            });
            var vertex2 = new Vertex
            {
                Point = new Point {
                    X = 146, Y = 104
                },
            };

            vertex2.HalfEdges.Add(left2);
            left2.End = vertex2;
            vertex2.HalfEdges.Add(center2);
            center2.Start = vertex2;
            vertex2.HalfEdges.Add(right2);
            right2.End = vertex2;

            map.Add(vertex2);

            Assert.AreEqual(7, map.Count());
            Assert.AreEqual(2, map.Count(g => g is Vertex));
            Assert.AreEqual(5, map.Count(g => g is HalfEdge));
        }
Ejemplo n.º 12
0
    void Start()
    {
        if (mapgeneratoractive)
        {
            cameraTransform = Camera.main.transform;

            Vector3 cameraP1 = Camera.main.ScreenToWorldPoint(Vector3.zero);
            Vector3 cameraP2 = Camera.main.ScreenToWorldPoint(new Vector3(Camera.main.pixelWidth, Camera.main.pixelHeight));
            screenWidth  = (int)(Mathf.Abs(cameraP2.x - cameraP1.x) / spriteGroesse) + 5;
            screenHeight = (int)(Mathf.Abs(cameraP2.y - cameraP1.y) / spriteGroesse) + 5;

            //Erstelle eine gerade anzahl an SpriteRenderer auf der map
            screenWidth  += screenWidth % 2 == 0 ? 0 : 1;
            screenHeight += screenHeight % 2 == 0 ? 0 : 1;

            if (ShowWholeMap)
            {
                screenWidth  = mapWidth + 20;
                screenHeight = mapHeight + 20;
            }

            spriteRenderer = new SpriteRenderer[screenWidth, screenHeight]; //Speicher für SpriteRenderer

            int halfScreenWidth  = screenWidth / 2;                         //erstellen der Sprites
            int halfScreenHeight = screenHeight / 2;
            for (int x = 0; x < screenWidth; x++)
            {
                for (int y = 0; y < screenHeight; y++)
                {
                    GameObject NewTile = GameObject.Instantiate(tile, new Vector3((spriteGroesse * x - halfScreenWidth * spriteGroesse), (spriteGroesse * y - halfScreenHeight * spriteGroesse), 0), Quaternion.identity, parent);
                    spriteRenderer[x, y] = NewTile
                                           .GetComponent <SpriteRenderer>(); //Instantiert ein neues Objekt mit SpriteRender, und speichert diesen im SpriteRendererArray
                }
            }

            sprites = new Sprite[TileTypes.Length + 1];
            for (int i = 1; i < TileTypes.Length + 1; i++)
            {
                sprites[i] = TileTypes[i - 1].TypeSprite;
            }
            sprites[0] = BorderSprite;

            VoronoiMap voronoiMap = new VoronoiMap(TileTypes);
            map = voronoiMap.GenerateMap(mapWidth, mapHeight, VoronoiPointCount);

            //GenerateBorder();

            GenerateItemSpawnLotteries();
            SpawnItems();
            refreshScreen(); //SpriteRenderer erneuern

            // Wassertile Colider hinzufügen, nicht passierbar machen und fischbar machen
            int childcounterM = Tilemap.transform.childCount;
            for (int i = 0; i < childcounterM; i++)
            {
                Transform      Tile     = Tilemap.transform.GetChild(i);
                SpriteRenderer Renderer = Tile.gameObject.GetComponent <SpriteRenderer>();
                if (Renderer.sprite.name == "water")
                {
                    Tile.GetComponent <BoxCollider2D>().enabled   = true;
                    Tile.GetComponent <BoxCollider2D>().isTrigger = false;
                    Tile.GetComponent <BoxCollider2D>().size      = new Vector2(0.2f, 0.2f);
                    Tile.gameObject.AddComponent <Fishable>();
                }
            }
        }
    }
Ejemplo n.º 13
0
        public VoronoiMap CreateVoronoiMap(int height, int width, IEnumerable <Site> sites)
        {
            if (sites == null)
            {
                throw new ArgumentNullException("sites");
            }

            if (sites.GroupBy(s => s.Point).Count() != sites.Count())
            {
                throw new ArgumentException("Multiple sites with the same coordinates passed!");
            }

            var siteList = string.Join(", ", sites.Select(s => s.Point.ToString()).ToArray());

            _logger.Log($"Create Voronoi map with sites: {siteList}");

            _eventQueue = new EventQueue();
            _beachLine  = new BeachLine(height);
            var map = new VoronoiMap();

            _eventQueue.Initialize(sites.Select(s => s.Point));
            map.AddRange(sites.Cast <IGeometry>());

            while (_eventQueue.HasEvents)
            {
                var sweepEvent = _eventQueue.GetNextEvent();

                var siteEvent = sweepEvent as SiteEvent;
                if (siteEvent != null)
                {
                    _logger.Log($"Sweepline SiteEvent: {siteEvent.Point}");
                    var halfEdges = _siteEventHandler.HandleEvent(siteEvent, _eventQueue, _beachLine);
                    map.AddRange(halfEdges);

                    foreach (var geo in halfEdges)
                    {
                        _logger.Log($"Add {geo}");
                    }

                    continue;
                }

                var circleEvent = sweepEvent as CircleEvent;
                if (circleEvent == null)
                {
                    throw new InvalidOperationException("SweepEvent is neither SiteEvent nor CircleEvent");
                }

                //_logger.Log($"Sweepline CircleEvent: {circleEvent.Point} for arc {circleEvent.Arc.Site}");
                var circleEventResult = _circleEventHandler.HandleEvent(circleEvent, _eventQueue, _beachLine);

                foreach (var geo in circleEventResult)
                {
                    _logger.Log($"Add {geo}");
                }

                // Add vertex and new half edge
                map.AddRange(circleEventResult);
            }

            _beachLine.FinishEdge(_beachLine.Root, width);

            //map.FinishEdges(width);

            map.ConnectEdges();

            _logger.Log("Finished Voronoi map creation");

            foreach (var edge in map.Where(g => g is HalfEdge).Cast <HalfEdge>())
            {
                _logger.Log(edge.ToString());
            }

            return(map);
        }