class_name Math static func get_chunk_from_pos(coord) -> Vector2i: return Vector2i( floori(coord.x / (Planet.CHUNK_TILE_SIZE * Planet.TILE_SIZE)), floori(coord.y / (Planet.CHUNK_TILE_SIZE * Planet.TILE_SIZE)) ) static func get_tile_from_pos(coord) -> Vector2i: return Vector2i( floori(coord.x / (Planet.TILE_SIZE)), floori(coord.y / (Planet.TILE_SIZE)), ) static func get_tiles_in_circle(center: Vector2, radius : float) -> Array[Vector2i]: var tiles : Array[Vector2i] = [] for x in range( floori((center.x - radius/2.) / Planet.TILE_SIZE), ceili((center.x + radius/2.) / Planet.TILE_SIZE), ): for y in range( floori((center.y - radius/2.) / Planet.TILE_SIZE), ceili((center.y + radius/2.) / Planet.TILE_SIZE), ): if is_tile_on_circle(Vector2i(x,y), center, radius): tiles.append(Vector2i(x,y)) return tiles static func is_tile_on_circle(tile_coord : Vector2i, circle_center: Vector2, circle_radius : float) -> bool: var absolute_tile_pos : Vector2 = tile_coord * Planet.TILE_SIZE # Loop over tile corners to know if the area collide var corners : Array[Vector2] = [] for x in [0,1]: for y in [0,1]: corners.append( absolute_tile_pos + Vector2.RIGHT * x * Planet.TILE_SIZE + Vector2.DOWN * y * Planet.TILE_SIZE ) # Check if segment touch area for i in range(4): var a = corners[i%4] var b = corners[(i+1)%4] if segment_intersect_circle(a,b,circle_center,circle_radius): return true return false # Stolen here https://stackoverflow.com/questions/1073336/circle-line-segment-collision-detection-algorithm static func segment_intersect_circle( a : Vector2, b : Vector2, c : Vector2, radius: float ) -> bool: var a_circle = c - a var b_a = b - a var proj_point = proj(a_circle,b_a) + a return proj_point.distance_to(c) < radius static func proj(a : Vector2,b : Vector2) -> Vector2: var k = a.dot(b) / b.dot(b) return Vector2(k * b.x, k * b.y)