Вращение точки вокруг круга - PullRequest
1 голос
/ 27 июня 2019

Я пытаюсь создать своего рода «вращающуюся миникарту» для «игры», у меня два набора координат для двух игроков, один из которых будет игроком, а другой - целью, а также направление Игрок лицом к плоскости. Они расположены в двухмерной плоскости, каждая из которых имеет свои координаты (например, A (56,25, 23,44), B (50,17, 33,57)).

Итак, я хочу в основном превратить статическую «миникарту» во вращающуюся, надеясь, что игрок (A) будет центром, якорь, вокруг которого B будет вращаться в соответствии с направлением, в котором находится игрок

В математических (?) Терминах это означало бы, что я хочу повернуть точку B вокруг круга, центр которого является точкой A на угол (Я ни в коем случае не эксперт и даже не адепт в какой-либо области, я научил себя всему, что знаю, поэтому прими мои определения и термины с недоверием)

Вид основной идеи ; Где A - игрок или исходная точка, B - цель или точка, которую необходимо переместить, а B '- точка, в которую она будет перемещена. Линия, проходящая через B ', будет направлением, под которым игрок находится под заданным углом альфа

Этот момент был задан на этих форумах и, я думаю, решен, я видел , видел их, и я не до конца понимаю их, и они не решают мою проблему

А именно, в некоторых сообщениях говорится, что формулы для B '(X, Y) были бы X = hyp * cos(a) (где a - угол и гипотензия гипо) и Y = hyp * sin(a), но по неизвестным (?) Причинам это заставил мой B 'сойти с ума, и он был неприменим, если бы A и B были на одной оси (я не понимаю, как это работает, и почему это не так)

В другом посте говорилось, что формулы должны быть X = Ax * cos(a) - Ay * sin(a) и Y = Ay * cos(a) - Ax * sin(a); Это, к сожалению, не сработало, так что, в конце концов, я не понимаю, почему или как любая из этих работ, и почему ни одна из них не работает, угол был дан как в градусах, так и в радианах

Это код, который я использовал для тестирования (до воплощения в мою идею):

local pX, pY, fX, fY = 10, 20, 10, 40
local playerA = 45
local X, Y = fX - pX, fY - pY
local hyp = math.sqrt((X ^ 2) + (Y ^ 2))
local X2, Y2 = hyp * math.cos(playerA), hyp * math.sin(playerA)
print(X2, Y2, hyp)

(Там, где координаты игрока будут pX и pY, fX и fY цели, радиус или угол гипотенузы playerA) И просто рисуя результирующие координаты с ожидаемым углом, вещи в большинстве случаев казались отключенными

Надеюсь, я достаточно хорошо объяснил проблему и мою работу, спасибо, что прочитали и подумали!

Редактировать: я уже решил мою проблему, преобразовав пару координат цели в полярную, добавив угол, по которому я хочу, чтобы он перемещался, и преобразовав обратно в декартову, это пока выглядит многообещающе, но все же вопрос выше беспокоит меня; Для любого любопытного или ищущего похожий ответ это «решение» было протестировано так:

local x, y = 20, 20
local hyp = math.sqrt((x ^ 2) + (y ^ 2))
local a = math.atan(y / x)
print(hyp, math.deg(a))
a = a + math.rad(135)
local x2 = hyp * math.cos(a)
local y2 = hyp * math.sin(a)
print("(" .. x2 .. ", " .. y2 .. ")")
local hyp = math.sqrt((x2 ^ 2) + (y2 ^ 2))
local a = math.atan(y2 / x2)
print(hyp, math.deg(a))

1 Ответ

1 голос
/ 27 июня 2019

Ваш код в основном правильный, но необходимо внести некоторые исправления: lua trig. Функции работают с аргументами в радианах, поэтому вы должны преобразовать 45 градусов в радианы (я дал два пути). И ваши рассчитанные позиции относительно игрока, поэтому для абсолютных координат вы должны добавить позиции игрока:

local pX, pY, fX, fY = 10, 20, 10, 40

local playerA = 45 * math.Pi / 180
  or
local playerA  = math.rad(45)

local X, Y = fX - pX, fY - pY
local hyp = math.sqrt((X ^ 2) + (Y ^ 2))

local X2, Y2 = pX + hyp * math.cos(playerA), pY + hyp * math.sin(playerA)

print(X2, Y2, hyp)
...