X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=code%2Fnetwork-generator%2Fnetwork_generation%2Fmodel%2Fpython%2Fhexagon.py;h=555c601bd2a0fdf8a5a2e402b7d23df2f028b069;hb=091313ef66ae97923fd970be160e01d46649a835;hp=5a81c23d42a5cb9272d98bf6bdce89d4a0410b8a;hpb=75e7c88e53a85bad86adef4d0e717c1ef964ac74;p=oam.git diff --git a/code/network-generator/network_generation/model/python/hexagon.py b/code/network-generator/network_generation/model/python/hexagon.py index 5a81c23..555c601 100644 --- a/code/network-generator/network_generation/model/python/hexagon.py +++ b/code/network-generator/network_generation/model/python/hexagon.py @@ -14,7 +14,7 @@ # # inspired by http://www.redblobgames.com/grids/hexagons/ -#!/usr/bin/python +# !/usr/bin/python from __future__ import division, print_function @@ -27,7 +27,7 @@ from network_generation.model.python.point import Point class Hex: - def __init__(self, q: int, r: int, s: int): + def __init__(self, q: float, r: float, s: float) -> None: if round(q + r + s) != 0: raise ValueError("The sum of q, r, and s must be 0.") self.q = q @@ -50,11 +50,11 @@ def hex_scale(a: Hex, k: int) -> Hex: return Hex(a.q * k, a.r * k, a.s * k) -def hex_rotate_left(a) -> Hex: +def hex_rotate_left(a: Hex) -> Hex: return Hex(-a.s, -a.q, -a.r) -def hex_rotate_right(a) -> Hex: +def hex_rotate_right(a: Hex) -> Hex: return Hex(-a.r, -a.s, -a.q) @@ -90,18 +90,18 @@ def hex_diagonal_neighbor(hex: Hex, direction: int) -> Hex: return hex_add(hex, hex_diagonals[direction]) -def hex_length(hex: Hex) -> int: +def hex_length(hex: Hex) -> float: return (abs(hex.q) + abs(hex.r) + abs(hex.s)) // 2 -def hex_distance(a: Hex, b: Hex) -> int: +def hex_distance(a: Hex, b: Hex) -> float: return hex_length(hex_subtract(a, b)) def hex_round(hex: Hex) -> Hex: - qi = int(round(hex.q)) - ri = int(round(hex.r)) - si = int(round(hex.s)) + qi = round(hex.q) + ri = round(hex.r) + si = round(hex.s) q_diff = abs(qi - hex.q) r_diff = abs(ri - hex.r) s_diff = abs(si - hex.s) @@ -115,21 +115,21 @@ def hex_round(hex: Hex) -> Hex: return Hex(qi, ri, si) -def hex_lerp(a: Hex, b: Hex, t: int) -> Hex: # linearly interpolation +def hex_lerp(a: Hex, b: Hex, t: float) -> Hex: # linearly interpolation return Hex( - a.q * (1.0 - t) + b.q * t, - a.r * (1.0 - t) + b.r * t, - a.s * (1.0 - t) + b.s * t, + a.q * (1 - t) + b.q * t, + a.r * (1 - t) + b.r * t, + a.s * (1 - t) + b.s * t, ) -def hex_linedraw(a: Hex, b: Hex) -> list[hex]: - N = hex_distance(a, b) - a_nudge = Hex(a.q + 1e-06, a.r + 1e-06, a.s - 2e-06) - b_nudge = Hex(b.q + 1e-06, b.r + 1e-06, b.s - 2e-06) - results: list[hex] = [] - step = 1.0 / max(N, 1) - for i in range(0, N + 1): +def hex_linedraw(a: Hex, b: Hex) -> list[Hex]: + N: float = hex_distance(a, b) + a_nudge: Hex = Hex(a.q + 1e-06, a.r + 1e-06, a.s - 2e-06) + b_nudge: Hex = Hex(b.q + 1e-06, b.r + 1e-06, b.s - 2e-06) + results: list[Hex] = [] + step: float = 1 / max(N, 1) + for i in range(0, int(N) + 1): results.append(hex_round(hex_lerp(a_nudge, b_nudge, step * i))) return results @@ -140,33 +140,36 @@ EVEN: int = 1 ODD: int = -1 -def qoffset_from_cube(offset: int, hex: Hex) -> OffsetCoord: +def qoffset_from_cube(offset: float, hex: Hex) -> OffsetCoord: col = hex.q - row = hex.r + (hex.q + offset * (hex.q & 1)) // 2 + row = hex.r + (hex.q + offset * (int(hex.q) & 1)) // 2 if offset != EVEN and offset != ODD: raise ValueError("offset must be EVEN (+1) or ODD (-1)") return OffsetCoord(col, row) -def qoffset_to_cube(offset: int, hex: Hex) -> Hex: - q = hex.col - r = hex.row - (hex.col + offset * (hex.col & 1)) // 2 +def qoffset_to_cube(offset: int, offsetCoord: OffsetCoord) -> Hex: + q = offsetCoord.col + r = ( + offsetCoord.row + - (offsetCoord.col + offset * (offsetCoord.col & 1)) // 2 + ) s = -q - r if offset != EVEN and offset != ODD: raise ValueError("offset must be EVEN (+1) or ODD (-1)") return Hex(q, r, s) -def roffset_from_cube(offset: int, hex: Hex) -> OffsetCoord: - col = hex.q + (hex.r + offset * (hex.r & 1)) // 2 +def roffset_from_cube(offset: float, hex: Hex) -> OffsetCoord: + col = hex.q + (hex.r + offset * (int(hex.r) & 1)) // 2 row = hex.r if offset != EVEN and offset != ODD: raise ValueError("offset must be EVEN (+1) or ODD (-1)") return OffsetCoord(col, row) -def roffset_to_cube(offset: int, hex: Hex) -> Hex: - q = hex.col - (hex.row + offset * (hex.row & 1)) // 2 +def roffset_to_cube(offset: float, hex: OffsetCoord) -> Hex: + q = hex.col - (hex.row + offset * (int(hex.row) & 1)) // 2 r = hex.row s = -q - r if offset != EVEN and offset != ODD: @@ -177,15 +180,15 @@ def roffset_to_cube(offset: int, hex: Hex) -> Hex: DoubledCoord = collections.namedtuple("DoubledCoord", ["col", "row"]) -def qdoubled_from_cube(hex: Hex): +def qdoubled_from_cube(hex: Hex) -> DoubledCoord: col = hex.q row = 2 * hex.r + hex.q return DoubledCoord(col, row) -def qdoubled_to_cube(hex: Hex) -> Hex: - q = hex.col - r = (hex.row - hex.col) // 2 +def qdoubled_to_cube(doubledCoord: DoubledCoord) -> Hex: + q = doubledCoord.col + r = (doubledCoord.row - doubledCoord.col) // 2 s = -q - r return Hex(q, r, s) @@ -196,9 +199,9 @@ def rdoubled_from_cube(hex: Hex) -> DoubledCoord: return DoubledCoord(col, row) -def rdoubled_to_cube(hex: Hex): - q = (hex.col - hex.row) // 2 - r = hex.row +def rdoubled_to_cube(doubledCoord: DoubledCoord) -> Hex: + q = (doubledCoord.col - doubledCoord.row) // 2 + r = doubledCoord.row s = -q - r return Hex(q, r, s) @@ -279,284 +282,4 @@ def hex_to_geo_location( layout: Layout, hex: Hex, reference: GeoLocation ) -> GeoLocation: hexPoint: Point = hex_to_pixel(layout, hex) - return GeoLocation(reference).point_to_geo_location(hexPoint) - - -# Tests - - -def complain(name): - print("FAIL {0}".format(name)) - - -def equal_hex(name, a, b): - if not (a.q == b.q and a.s == b.s and a.r == b.r): - complain(name) - - -def equal_offsetcoord(name, a, b): - if not (a.col == b.col and a.row == b.row): - complain(name) - - -def equal_doubledcoord(name, a, b): - if not (a.col == b.col and a.row == b.row): - complain(name) - - -def equal_int(name, a, b): - if not (a == b): - complain(name) - - -def equal_hex_array(name, a, b): - equal_int(name, len(a), len(b)) - for i in range(0, len(a)): - equal_hex(name, a[i], b[i]) - - -def test_hex_arithmetic(): - equal_hex("hex_add", Hex(4, -10, 6), hex_add(Hex(1, -3, 2), Hex(3, -7, 4))) - equal_hex( - "hex_subtract", - Hex(-2, 4, -2), - hex_subtract(Hex(1, -3, 2), Hex(3, -7, 4)), - ) - - -def test_hex_direction(): - equal_hex("hex_direction", Hex(0, -1, 1), hex_direction(2)) - - -def test_hex_neighbor(): - equal_hex("hex_neighbor", Hex(1, -3, 2), hex_neighbor(Hex(1, -2, 1), 2)) - - -def test_hex_diagonal(): - equal_hex( - "hex_diagonal", Hex(-1, -1, 2), hex_diagonal_neighbor(Hex(1, -2, 1), 3) - ) - - -def test_hex_distance(): - equal_int("hex_distance", 7, hex_distance(Hex(3, -7, 4), Hex(0, 0, 0))) - - -def test_hex_rotate_right(): - equal_hex( - "hex_rotate_right", hex_rotate_right(Hex(1, -3, 2)), Hex(3, -2, -1) - ) - - -def test_hex_rotate_left(): - equal_hex( - "hex_rotate_left", hex_rotate_left(Hex(1, -3, 2)), Hex(-2, -1, 3) - ) - - -def test_hex_round(): - a = Hex(0.0, 0.0, 0.0) - b = Hex(1.0, -1.0, 0.0) - c = Hex(0.0, -1.0, 1.0) - equal_hex( - "hex_round 1", - Hex(5, -10, 5), - hex_round(hex_lerp(Hex(0.0, 0.0, 0.0), Hex(10.0, -20.0, 10.0), 0.5)), - ) - equal_hex("hex_round 2", hex_round(a), hex_round(hex_lerp(a, b, 0.499))) - equal_hex("hex_round 3", hex_round(b), hex_round(hex_lerp(a, b, 0.501))) - equal_hex( - "hex_round 4", - hex_round(a), - hex_round( - Hex( - a.q * 0.4 + b.q * 0.3 + c.q * 0.3, - a.r * 0.4 + b.r * 0.3 + c.r * 0.3, - a.s * 0.4 + b.s * 0.3 + c.s * 0.3, - ) - ), - ) - equal_hex( - "hex_round 5", - hex_round(c), - hex_round( - Hex( - a.q * 0.3 + b.q * 0.3 + c.q * 0.4, - a.r * 0.3 + b.r * 0.3 + c.r * 0.4, - a.s * 0.3 + b.s * 0.3 + c.s * 0.4, - ) - ), - ) - - -def test_hex_linedraw(): - equal_hex_array( - "hex_linedraw", - [ - Hex(0, 0, 0), - Hex(0, -1, 1), - Hex(0, -2, 2), - Hex(1, -3, 2), - Hex(1, -4, 3), - Hex(1, -5, 4), - ], - hex_linedraw(Hex(0, 0, 0), Hex(1, -5, 4)), - ) - - -def test_layout(): - h = Hex(3, 4, -7) - flat = Layout(layout_flat, Point(10.0, 15.0), Point(35.0, 71.0)) - equal_hex( - "layout", h, hex_round(pixel_to_hex(flat, hex_to_pixel(flat, h))) - ) - pointy = Layout(layout_pointy, Point(10.0, 15.0), Point(35.0, 71.0)) - equal_hex( - "layout", h, hex_round(pixel_to_hex(pointy, hex_to_pixel(pointy, h))) - ) - - -def test_offset_roundtrip(): - a = Hex(3, 4, -7) - b = OffsetCoord(1, -3) - equal_hex( - "conversion_roundtrip even-q", - a, - qoffset_to_cube(EVEN, qoffset_from_cube(EVEN, a)), - ) - equal_offsetcoord( - "conversion_roundtrip even-q", - b, - qoffset_from_cube(EVEN, qoffset_to_cube(EVEN, b)), - ) - equal_hex( - "conversion_roundtrip odd-q", - a, - qoffset_to_cube(ODD, qoffset_from_cube(ODD, a)), - ) - equal_offsetcoord( - "conversion_roundtrip odd-q", - b, - qoffset_from_cube(ODD, qoffset_to_cube(ODD, b)), - ) - equal_hex( - "conversion_roundtrip even-r", - a, - roffset_to_cube(EVEN, roffset_from_cube(EVEN, a)), - ) - equal_offsetcoord( - "conversion_roundtrip even-r", - b, - roffset_from_cube(EVEN, roffset_to_cube(EVEN, b)), - ) - equal_hex( - "conversion_roundtrip odd-r", - a, - roffset_to_cube(ODD, roffset_from_cube(ODD, a)), - ) - equal_offsetcoord( - "conversion_roundtrip odd-r", - b, - roffset_from_cube(ODD, roffset_to_cube(ODD, b)), - ) - - -def test_offset_from_cube(): - equal_offsetcoord( - "offset_from_cube even-q", - OffsetCoord(1, 3), - qoffset_from_cube(EVEN, Hex(1, 2, -3)), - ) - equal_offsetcoord( - "offset_from_cube odd-q", - OffsetCoord(1, 2), - qoffset_from_cube(ODD, Hex(1, 2, -3)), - ) - - -def test_offset_to_cube(): - equal_hex( - "offset_to_cube even-", - Hex(1, 2, -3), - qoffset_to_cube(EVEN, OffsetCoord(1, 3)), - ) - equal_hex( - "offset_to_cube odd-q", - Hex(1, 2, -3), - qoffset_to_cube(ODD, OffsetCoord(1, 2)), - ) - - -def test_doubled_roundtrip(): - a = Hex(3, 4, -7) - b = DoubledCoord(1, -3) - equal_hex( - "conversion_roundtrip doubled-q", - a, - qdoubled_to_cube(qdoubled_from_cube(a)), - ) - equal_doubledcoord( - "conversion_roundtrip doubled-q", - b, - qdoubled_from_cube(qdoubled_to_cube(b)), - ) - equal_hex( - "conversion_roundtrip doubled-r", - a, - rdoubled_to_cube(rdoubled_from_cube(a)), - ) - equal_doubledcoord( - "conversion_roundtrip doubled-r", - b, - rdoubled_from_cube(rdoubled_to_cube(b)), - ) - - -def test_doubled_from_cube(): - equal_doubledcoord( - "doubled_from_cube doubled-q", - DoubledCoord(1, 5), - qdoubled_from_cube(Hex(1, 2, -3)), - ) - equal_doubledcoord( - "doubled_from_cube doubled-r", - DoubledCoord(4, 2), - rdoubled_from_cube(Hex(1, 2, -3)), - ) - - -def test_doubled_to_cube(): - equal_hex( - "doubled_to_cube doubled-q", - Hex(1, 2, -3), - qdoubled_to_cube(DoubledCoord(1, 5)), - ) - equal_hex( - "doubled_to_cube doubled-r", - Hex(1, 2, -3), - rdoubled_to_cube(DoubledCoord(4, 2)), - ) - - -def test_all(): - test_hex_arithmetic() - test_hex_direction() - test_hex_neighbor() - test_hex_diagonal() - test_hex_distance() - test_hex_rotate_right() - test_hex_rotate_left() - test_hex_round() - test_hex_linedraw() - test_layout() - test_offset_roundtrip() - test_offset_from_cube() - test_offset_to_cube() - test_doubled_roundtrip() - test_doubled_from_cube() - test_doubled_to_cube() - print("test finished") - - -if __name__ == "__main__": - test_all() + return reference.point_to_geo_location(hexPoint)