Вопрос изначально возник вне пределов jass, но это особо не важно.
Есть точка, движущаяся с фиксированной скоростью speed, и каждую итерацию поворачивающаяся на угол rotationSpeed. Вопрос - как, имея эти данные, получить радиус окружности, являющейся траекторией движения точки?
примерный код, описывающий движение точки, как это выглядело бы в jass-е

// udg_Facing - текущий угол поворота;
// udg_Location - перемещаемая точка;
// MoveIteration() вызывается из таймера, т.е. циклична.

function MoveIteration takes nothing returns nothing
	local real currentX = GetLocationX(udg_Location)
	local real currentY = GetLocationY(udg_Location)
	local real speed = 3
	local real rotationSpeed = 6
		set udg_Facing = udg_Facing + rotationSpeed
		call MoveLocation (udg_Location, currentX, currentY, speed, udg_Facing)
endfunction

function MoveLocation takes location loc, real xPos, real yPos, real speed, real angle returns nothing
		call SetLocationX(loc, xPos + speed * Cos (angle * bj_DEGTORAD))
		call SetLocationY(loc, yPos + speed * Sin (angle * bj_DEGTORAD))
endfunction

Принятый ответ

проверил, все работает, всем спасибо)
в коде будет примерно такой вид:
function getTrajectoryRadius takes real speed, real rotationSpeed returns real
	local real  N = 360 / rotationSpeed		// количество сторон вписанного многоугольника
		return speed / (2 * (Sin (PI / N)))
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
27
5 лет назад
Отредактирован MpW
0
xPos, yPos - центр окружности (начало точки)

по идеи радиус это speed
конечная точка:
xPos + speed * Cos (angle * bj_DEGTORAD)
yPos + speed * Sin (angle * bj_DEGTORAD)

длина между центром и конечной точкой (берем BJ-функцию и под себя переделываем):
function DistanceBetweenPoints takes location locA, location locB returns real
local real dx = GetLocationX(locB) - GetLocationX(locA)
local real dy = GetLocationY(locB) - GetLocationY(locA)
return SquareRoot(dx * dx + dy * dy)
endfunction
2
37
5 лет назад
2
Твоя ошибка в том, что speed - это не speed. Скорость выражается в ед/сек, а у тебя оно выражается просто в единицах. Какой-то плохой пример и в итоге не совсем понятно, что дано, а что нужно получить в итоге.
0
14
5 лет назад
Отредактирован HolyMoon
0
ScorpioT1000, иначе говоря, если мы запустим точку по этому алгоритму - каждый тик таймера она будет перемещаться от своей текущей позиции расстояние speed под углом rotationSpeed (от ее текущего поворота).
И траектория ее движения образует окружность, радиус которой и нужно получить.
0
27
5 лет назад
Отредактирован MpW
0
HolyMoon, ты случайно не угловую скорость пытаешься менять?
3
20
5 лет назад
Отредактирован biridius
3
взываю к могуществу гугла и яндекса
точка у нас траекторией своего движения описывает что-то вроде правильного многоугольника. внешний угол
то есть поворот за одну итерацию, по формуле равен 360/число углов, значит углов и ребер N 360/данный угол
далее находим радиус описанной окружности по формуле
R = a/(2 Sin (360/2N)), где a - ребро (скорость за одну итерацию) и n - ранее найденное число ребер
наверняка фигню написал
Загруженные файлы
0
14
5 лет назад
Отредактирован HolyMoon
0
Steal nerves, я пытаюсь придумать способ решить ситуацию, при которой объект с определенной скоростью поворота не может попасть в точку, находящуюся внутри его траектории движения :)
biridius, выглядит логично
Загруженные файлы
2
37
5 лет назад
2
Просто раздели операции перемещения в пространстве и вращения на 2 разные независимые функции и всё встанет на свои места.
0
27
5 лет назад
Отредактирован MpW
0
biridius, че-то немного не понятно ) почему ты нарисовал другой малый полукруг? что за число a?
0
37
5 лет назад
0
Из статей вот это советую xgm.guru/p/wc3/mathmov
0
14
5 лет назад
0
Steal nerves, а - это speed в моей функции. Про окружность - да, не понятно)
2
20
5 лет назад
Отредактирован biridius
2
радиус описанной окружности равен расстоянию от центра многоугольника до каждого угла
его и считаем за приближенный радиус "окружности" которую у нас описывает движущаяся точка
я ниче не рисовал, картинка с сайта по геометрии для школьников. нужен там только внешний угол формулу которого 360/N взял оттудаж
3
14
5 лет назад
Отредактирован HolyMoon
3
проверил, все работает, всем спасибо)
в коде будет примерно такой вид:
function getTrajectoryRadius takes real speed, real rotationSpeed returns real
	local real  N = 360 / rotationSpeed		// количество сторон вписанного многоугольника
		return speed / (2 * (Sin (PI / N)))
endfunction
Принятый ответ
6
27
5 лет назад
Отредактирован MpW
6
короче подумал зря рисовал мини-обзорчик. ладно, зато понял
скрин
см. ниже скрин,
у меня почему-то компас выдал обычный угол 6-ного многоугольника = 120°
а по формуле должен получится 60°
Ищу то не А-центральный, а обычный. Все понял, это называется внутренний угол. попутал
Загруженные файлы
Чтобы оставить комментарий, пожалуйста, войдите на сайт.