69 lines
2.1 KiB
GDScript
69 lines
2.1 KiB
GDScript
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) |