Вычислить будущие координаты по направлению объекта #lua

У объекта известны начальные координаты, направление, скорость:

x = 3199.82
y = 505.14
z опустим 
направление = 5.18 (в радианах)
скорость = 3

Как узнать x и y через 1 секунду при заданном направлении и скорости?


Ответы (2 шт):

Автор решения: Harry

И что тут сложного?

введите сюда описание изображения

введите сюда описание изображения

Этого достаточно?

→ Ссылка
Автор решения: shol

Думаю смогу объяснить проще...

Нужен центр поля для начала и число соотношения сторон.

А значит определяем... что у Нас за поле, в вопросе упоминаются радианы, значит по идее круг, но это может быть и квадрат и прямоугольник в котором вписан круг или наоборот, суть данного определения в способе реализации..

если поле квадрат берём либо высоту либо ширину и делим на два. (центр определён для x и y) (число соотношения 1)

если прямоугольник то делаем тоже самое но и для ширины и для высоты отдельно после чего делим большее на меньшее (например у нас обычный монитор, значит ширина больше, значит (ширину / 2) / (высоту / 2) ) и получаем число соотношение, запоминаем его, оно пригодится. (тут мы и центр нашли и число соотношения)

Если наше поле круг то (центр нам известен, так как он же выведен на экран, а кроме центра известен радиус, а так как он равен во всех направлениях то тут как и у квадрата число соотношения 1)

И так, мы имеем центр, нам известно число соотношения сторон поля, мы знаем угол (да, радиан это угол между радиусами)

Что я могу предложить с точки зрения программирования, с учётом быстродействия...

Это разово, составить массив координат вдоль радиуса, какого именно?

Ну смотри... круг (визуальный или нет, в квадрате или прямоугольнике не важно, радиан 0 это вертикальная линия, движение тут по часовой стрелки), значит радиан 5.18 это радиус который 518й по счёту по часовой стрелки))) проще представить часы, 12 часов 5 минут 18 секунд, думаю уже понятно будет в любом случае.

И так, мы определились с радиусом, с той самой линией которая пересикает x и y, всё что нужно это от центра до края найти все пересечения... но какой будет шаг? а шаг будет 0.01 исходя и приведённых координат.

Итак, берём и мутим цикл, шаг итерации 0.01, конец цикла это наш радиус. определяемся с стороной, точнее берём наименьшую (если у на прямоугольник и речь о круге как о представляемом поле)

от точки центра по x (если ширина наименьшая сторона, если наоборот то по y, а в случае квадрата или круга без разницы) прибавляем шаг итерации к выбранной оси и присваиваем другой оси тоже значение но умноженное на единицу соотношения

НАПРИМЕР:

если квадрат или круг то будет так

 var mass1 = [];
 var mass2 = [];
 for (var i = 0, len = радиус; i < len; i + 0.01 ) {
 mass2.push({'x': x+i, 'y': y+i});
 mass1.push({'x': x-i, 'y': y-i});
 if (i == len - 1) { //конец цикла
 var mass_diametr = mass1.concat(mass2); //объединили в общий, узнали по итогу диаметр 
 }
 }

если прямоугольник (допустим ширина больше, y ось за основу)

 var mass1 = [];
 var mass2 = [];
 for (var i = 0, len = радиус; i < len; i + 0.01 ) {
 mass2.push({'x': x+(i * число соотношения сторон), 'y': y+(i * число соотношения сторон)});
 mass1.push({'x': x-(i * число соотношения сторон), 'y': y-(i * число соотношения сторон)});
 if (i == len - 1) { //конец цикла
 var mass_diametr = mass1.concat(mass2); //объединили в общий, узнали по итогу диаметр 
 }
 }

по итогу будет массив вида:

[
{'x': ..., 'y': ...},
{'x': ..., 'y': ...},
{'x': ..., 'y': ...},
{'x': ..., 'y': ...},
{'x': ..., 'y': ...},
{'x': ..., 'y': ...},
{'x': ..., 'y': ...},
 .........
 .........
 ]

где mass_diametr[0] - центр где mass_diametr[mass_diametr .length - 1] - край

И так, грубо говоря мы нашли сторону, куда идёт движение...

Но.. центр поля может быть не равен координатам объекта... (но мы же нашли так сказать путь)))

Значит нужно представить, что центр поля это координаты объекта, мысленно провернуть тоже самое и мы увидим, что обе линии параллельны, а значит делаем следующее

Определяемся с координатой, находим разницу между центром поля и координатами объекта, запоминаем разницу после чего в цикле проходимся по нашему массиву mass_diametr с учётом разницы (для x и y разумеется)

по итогу мы имеем картину в уме на подобие:

примерно так... от руки и по быстрому

далее можем забыть про первый массив так как у нас уже есть диаметр (линия направления относительно самого объекта)

осталось малость, надо узнать за какое время объект пройдёт от например mass_diametr2[0] от своих координат))) до mass_diametr21 это один шаг, одна итерация цикла

тут просто, если 3 вы сказали это мил. сек. то, надо запустить до цикл, поставить таймер и остановить цикл и таймер когда условие будет равно, именно когда координаты объекта совпадут с координатами из mass_diametr21

 if (x == mass_diametr2[1].x && y == mass_diametr2[1].y) {   .........   }

таким образом мы узнаем сколько времени надо для прохождения одной ступени, а зная это мы можем прогнозировать координаты, допустим от

mass_diametr2[0] до mass_diametr21 1 мил.сек (да очень быстрый объект, но это для наглядности) тогда по истечению 3х мил. сек. координаты объекта будут

mass_diametr2[2].x и mass_diametr2[2].y

Времени не так много у меня, надеюсь помог, с кодом уже сам разберёшься

→ Ссылка