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); }
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; }
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); }