class_name Hex extends RefCounted ## Hex-Helfer für "odd-r" Offset-Koordinaten (spitze Hexes, ungerade Zeilen versetzt). const NEIGHBORS_EVEN := [ Vector2i(1, 0), Vector2i(0, -1), Vector2i(-1, -1), Vector2i(-1, 0), Vector2i(-1, 1), Vector2i(0, 1), ] const NEIGHBORS_ODD := [ Vector2i(1, 0), Vector2i(1, -1), Vector2i(0, -1), Vector2i(-1, 0), Vector2i(0, 1), Vector2i(1, 1), ] static func to_cube(p: Vector2i) -> Vector3i: var x := p.x - int((p.y - (p.y & 1)) / 2.0) var z := p.y return Vector3i(x, -x - z, z) static func distance(a: Vector2i, b: Vector2i) -> int: var ca := to_cube(a) var cb := to_cube(b) return int((absi(ca.x - cb.x) + absi(ca.y - cb.y) + absi(ca.z - cb.z)) / 2.0) static func neighbors(p: Vector2i) -> Array: var offs: Array = NEIGHBORS_ODD if (p.y & 1) == 1 else NEIGHBORS_EVEN var out := [] for o in offs: out.append(p + o) return out ## Pixelmittelpunkt eines Hex-Feldes. static func to_pixel(p: Vector2i, size: float) -> Vector2: var w := sqrt(3.0) * size var h := 1.5 * size var x := w * (float(p.x) + 0.5 * float(p.y & 1)) var y := h * float(p.y) return Vector2(x, y) ## Eckpunkte eines spitzen Hex um (0,0). static func corners(size: float) -> PackedVector2Array: var pts := PackedVector2Array() for i in 6: var ang := deg_to_rad(60.0 * float(i) - 30.0) pts.append(Vector2(size * cos(ang), size * sin(ang))) return pts