Перейти к публикации

В ближайшее время постараюсь разобраться с картой сервера/ЛК/бб кодами

  • 0
Asior

Формула для нахождения координат

Вопрос

Прошу помощи в выведении формулы, алгоритма и возможно набросков кода.
Мне необходимо рассчитать координаты по которым будут располагаться некоторые устройства.
Размещаться они будут по кругам. Мне необходимо получить только координаты каждой точки, как уже и чем будут размещены устройства - неважно.

Nqy4T5I.png

Как видно из картинок это приближенное размещение. Дистанция между кругами может быть разной. Но главное, что в 1 круге всегда 8 точек координаты которых необходимо получить, во втором 24, и так далее (48, 81 ...). Обратите внимание, что координаты центральной точки уже известны. Для удобства пусть будут (0; 0).
Я конечно как-то не особо внятно сформулировал задачу, но как-то не пойму как точнее сформулировать задание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

4 ответа на этот вопрос

Рекомендованные сообщения

  • 1
local sides = {
  north = 2,
  south = 3,
  west = 4,
  east = 5,
}

local testN = 22

-- центр, реальные координаты
local startX, startZ = 0, 0

-- кол-во кругов
local radius = 2

-- расстояние между "кругами"
local distance = 1

-- направление взгляда на поле
-- нумерация идёт слева направо и сверху вниз
local orientation = sides.north 

local step = distance + 1
local offset = radius*step
local size = offset*2+1

-- преобразование виртуальной системы координат в реальную

-- Minecraft
--
--            z
--           (-)
--          north
-- x (-) west   east (+) x
--          south
--           (+)
--            z

-- условная система координат
-- 
--
--      (-x)
-- (-z)  ^   (+z)
--      (+x)
-- ^ направление взгляда на поле
-- нумерация идёт слева направо и сверху вниз

local toRealFn = {
  [sides.east] = function(virtX, virtZ) return   startX - virtX, startZ + virtZ end,
  [sides.south] = function(virtX, virtZ) return  startX - virtZ, startZ - virtX end,
  [sides.west] = function(virtX, virtZ) return  startX + virtX, startZ - virtZ end,
  [sides.north] = function(virtX, virtZ) return  startX + virtZ, startZ + virtX end,
}

local d = radius*2+1
local maxN = d^2

local function getCoord(n)
  local xx, zz = math.floor((n-1)/d)*step-offset, math.fmod(n-1, d)*step-offset
  return toRealFn[orientation](xx, zz)
end

local n = 0
for xx = -offset, offset, step do
  for zz = -offset, offset, step do
    n = n + 1
    local x, z = toRealFn[orientation](xx, zz)
    print(n, x, z)
  end
end

print("["..testN.."]".."=", getCoord(testN))

Вот вывод:

radius=2, distance=1
1	-4	-4
2	-2	-4
3	0	-4
4	2	-4
5	4	-4
6	-4	-2
7	-2	-2
8	0	-2
9	2	-2
10	4	-2
11	-4	0
12	-2	0
13	0	0
14	2	0
15	4	0
16	-4	2
17	-2	2
18	0	2
19	2	2
20	4	2
21	-4	4
22	-2	4
23	0	4
24	2	4
25	4	4
[22]=	-2	4


radius=1, distance=1
1	-2	-2
2	0	-2
3	2	-2
4	-2	0
5	0	0
6	2	0
7	-2	2
8	0	2
9	2	2
[8]=	0	2

 

Если не нужна нумерация слева направо и сверху вниз по направлению взгляда, то можно упростить код преобразования координат, захардкодив конкретное направление.

 

Код преобразования координат нужно потестирвать.

 

Изменено пользователем vx13
добавил функцию получения координат по номеру ячейки
  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
47 минут назад, Zer0Galaxy сказал:

Это круги или все таки квадраты?

Квадраты. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

@vx13 огромное тебе спасибо! То что надо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×