Example #1
0
        public static HexGrid CreateHexMap(float edgeLength, float area)
        {
            var temp = new HexGridElement(Vector.Zero, edgeLength);

            return new HexGrid(CreateHexMap(
                new Vector(temp.Width / 2f, temp.Height / 2f),
                edgeLength,
                new RectangleInt(0, 0, (int)area, (int)area)));
        }
 public bool Equals(HexGridElement other)
 {
     if (ReferenceEquals(null, other)) return false;
     if (ReferenceEquals(this, other)) return true;
     return other.Center.Equals(this.Center) && other.EdgeLength.Equals(this.EdgeLength) && other.Position.Equals(this.Position);
 }
Example #3
0
        public static IEnumerable<HexGridElement> CreateHexMap(Vector startingCenter, float edgeLength, RectangleInt areaRectangle)
        {
            var hexRadius = MathUtil.CalcHypotenuseSide(edgeLength * 2, edgeLength);
            var angles = new[] { -30, 30, 90 };
            var hexCenters = new HashSet<HexGridElement>();
            var toExplore = new HashSet<HexGridElement> { new HexGridElement(startingCenter, edgeLength, areaRectangle.Location) };

            while (toExplore.Any())
            {
                var currentHex = toExplore.First();
                toExplore.Remove(currentHex);

                foreach (var angle in angles)
                {
                    var position = Point.Zero;
                    switch (angle)
                    {
                        case -30:
                            position = currentHex.Position.Translate(new Point(1, currentHex.Position.X % 2 == 0 ? -1 : 0));
                            break;
                        case 30:
                            position = currentHex.Position.Translate(new Point(1, currentHex.Position.X % 2 == 0 ? 0 : 1));
                            break;
                        case 90:
                            position = currentHex.Position.Translate(new Point(0, 1));
                            break;
                    }

                    var adjacent = currentHex.Center
                        .TranslatePolar(MathUtil.ToRadians(angle), hexRadius)
                        .RoundTo(1);

                    var adjacentHex = new HexGridElement(adjacent, edgeLength, position);
                    if (areaRectangle.Contains(adjacentHex.Position))
                    {
                        if (!toExplore.Contains(adjacentHex) && !hexCenters.Contains(adjacentHex))
                            toExplore.Add(adjacentHex);
                    }
                }

                hexCenters.Add(currentHex);
            }

            return hexCenters;
        }
Example #4
0
        public static int HexDistance(HexGridElement first, HexGridElement second)
        {
            var deltaX = second.Position.X - first.Position.X;
            var deltaY = second.Position.Y - first.Position.Y;

            var adj = first.Position.X % 2 == 0 ? 0.5 : -0.5;
            var adx = Math.Abs(deltaX);
            var ady = Math.Abs(deltaY + (adx % 2 * adj));

            if (adx >= 2 * ady) return adx;
            return (int)(adx + ady - adx / 2.0);
        }