В процессе. Исправление отображение карты для граничных областей
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user