Вопрос изначально возник вне пределов 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
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
27
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
38
Твоя ошибка в том, что speed - это не speed. Скорость выражается в ед/сек, а у тебя оно выражается просто в единицах. Какой-то плохой пример и в итоге не совсем понятно, что дано, а что нужно получить в итоге.
14
ScorpioT1000, иначе говоря, если мы запустим точку по этому алгоритму - каждый тик таймера она будет перемещаться от своей текущей позиции расстояние speed под углом rotationSpeed (от ее текущего поворота).
И траектория ее движения образует окружность, радиус которой и нужно получить.
27
HolyMoon, ты случайно не угловую скорость пытаешься менять?
22
взываю к могуществу гугла и яндекса
точка у нас траекторией своего движения описывает что-то вроде правильного многоугольника. внешний угол
то есть поворот за одну итерацию, по формуле равен 360/число углов, значит углов и ребер N 360/данный угол
далее находим радиус описанной окружности по формуле
R = a/(2 Sin (360/2N)), где a - ребро (скорость за одну итерацию) и n - ранее найденное число ребер
наверняка фигню написал
Загруженные файлы
14
Steal nerves, я пытаюсь придумать способ решить ситуацию, при которой объект с определенной скоростью поворота не может попасть в точку, находящуюся внутри его траектории движения :)
biridius, выглядит логично
Загруженные файлы
38
Просто раздели операции перемещения в пространстве и вращения на 2 разные независимые функции и всё встанет на свои места.
27
biridius, че-то немного не понятно ) почему ты нарисовал другой малый полукруг? что за число a?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.