В процессе. Исправление отображение карты для граничных областей

This commit is contained in:
sasha80
2023-11-24 09:02:55 +03:00
parent 80f462261c
commit 6e00101e82
6 changed files with 73 additions and 23 deletions

View File

@@ -40,6 +40,21 @@ class Tile:
return false
func _bound_index(index: int) -> int:
var mi: int = 2 ** self.z
if index < 0:
index *= -1
index %= mi
index = mi - index
else:
index %= mi
return index
func fix_xy():
self.x = _bound_index(self.x)
self.y = _bound_index(self.y)
## Пара долготы и широты.
class LngLat:
var lng: float = 0.0 ## Долгота в десятичных градусах восточной долготы.
@@ -287,18 +302,43 @@ func lnglat(x: float, y: float, truncate: bool = false) -> LngLat:
## [/codeblock]
func neighbors(tile: Tile) -> Array:
var tiles: = []
var hi = 2 ** tile.z - 1
for i in [-1, 0, 1]:
for j in [-1, 0, 1]:
if i == 0 and j == 0:
continue
elif (tile.x + i) < 0 or (tile.y + j) < 0:
continue
elif (tile.x + i) > hi or (tile.y + j) > hi:
continue
var t = Tile.new(tile.x + i, tile.y + j, tile.z)
if t.is_valid():
tiles.append(t)
t.fix_xy()
tiles.append(t)
return tiles
## Возвращает все плитки вокруг заданной плитки
func get_allaround_tiles(tile: Tile, mr: int = 1) -> Array:
var xys = {}
var mi: int = 2 ** tile.z
for r in mr:
for a in range(0, 360, 180 / mi):
var ra = radians(a)
var ix = int(roundf(r * cos(ra))) + tile.x
var iy = int(roundf(r * sin(ra))) + tile.y
var t = Tile.new(ix, iy, tile.z)
t.fix_xy()
xys[[t.x, t.y]] = false
var tiles = []
for txy in xys.keys():
tiles.append(Tile.new(txy[0], txy[1], tile.z))
return tiles
## Возвращает все плитки по периметру заданной плитки
func get_perimetr_tiles(tile: Tile, mr: int = 1) -> Array:
var tiles = []
for i in range(-mr, mr + 1):
for j in range(-mr, mr + 1):
if i == 0 and j == 0: continue
var t = Tile.new(i + tile.x, j + tile.y, tile.z)
t.fix_xy()
tiles.append(t)
return tiles

View File

@@ -3,6 +3,10 @@ extends Node
## Простые часто используемые функции
## Возвращает округлённое значение [param v] с точностью [param a]
func round_to(v: float, a: float) -> float: return snappedf(v, -a if v < 0 else a)
## Возвращает true, если val число, false - если иначе
func type_is_num(val) -> bool: return (typeof(val) == TYPE_INT) or (typeof(val) == typeof(0.0))