Как вычислить приращения по осям координат?
|
|
Alkosha | Дата: Понедельник, 20 Октября 2014, 09:29 | Сообщение # 1 |
участник
Сейчас нет на сайте
| Как расчитать dx и dy, зная начальные координаты объекта X1Y1 и конечные X2Y2 (куда этот объект должен переместиться) ?
|
|
| |
daun | Дата: Понедельник, 20 Октября 2014, 15:48 | Сообщение # 2 |
постоянный участник
Сейчас нет на сайте
| буц
|
|
| |
karuy | Дата: Понедельник, 20 Октября 2014, 16:06 | Сообщение # 3 |
заслуженный участник
Сейчас нет на сайте
|
|
|
| |
-l33t-h4xx- | Дата: Понедельник, 20 Октября 2014, 16:09 | Сообщение # 4 |
участник
Сейчас нет на сайте
| ... dX = X2 - X1, dY = Y2 - Y1
Как правильно задавать вопросы
|
|
| |
OpenGOO | Дата: Понедельник, 20 Октября 2014, 16:33 | Сообщение # 5 |
почти ветеран
Сейчас нет на сайте
| Alkosha, ты что вектор скорости хочешь найти?
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
vasua99 | Дата: Понедельник, 20 Октября 2014, 17:47 | Сообщение # 6 |
GNU follower
Сейчас нет на сайте
| Если надо найти вектор перемещения - то dx = x2-x1, вy = y2-y1(Построй два вектор начального положения s0 и конечного s1, а потом проекцию вектора s1-s0 на координатную плоскость и все поймешь). А вектор перемещения - если это прямолинейное равноускоренное движение - то vx=dx/t vy=dy/t. Если с ускорением, то там можно посчитать только мгновенную и среднюю скорость. Как то так)
Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
Сообщение отредактировал vasua99 - Понедельник, 20 Октября 2014, 17:47 |
|
| |
Alkosha | Дата: Понедельник, 20 Октября 2014, 18:17 | Сообщение # 7 |
участник
Сейчас нет на сайте
| Цитата OpenGOO ( ) ты что вектор скорости хочешь найти?
Хотел найти переменные, которые нужны для инкремента\декремента текущего значения X и Y объекта таким образом, чтоб при каждом проходе в цикле он из пункта А в пункт B переместился по кратчайшему пути, то бишь по отрезку, изображённому выше.
float X,Y; // координаты объекта float X1,Y1; // координаты конечной позиции calculate() { ... // тут считаем dx, dy }
for (;;) { X+=dx; Y+=dy; ... }
|
|
| |
OpenGOO | Дата: Понедельник, 20 Октября 2014, 19:27 | Сообщение # 8 |
почти ветеран
Сейчас нет на сайте
| (x1, y1) - пункт отправления (x2, y2) - пункт назначения speed - скорость объекта
Начинаем вычислять искомый вектор
Код auto vx = x2 - x1; auto vy = y2 - y1;
Нормализуем полученный вектор
Код auto len = sqrt(vx*vx + vy*vy); // находим длину вектора // нужна проверка что длина не равна нулю vx = vx/len; vy = vy/len;
затем умножаем его на скорость. Полученный вектор и будет то что ты ищешь
Код auto dx = vx * speed; auto dy = vy * speed;
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
daun | Дата: Понедельник, 20 Октября 2014, 19:41 | Сообщение # 9 |
постоянный участник
Сейчас нет на сайте
| Код k=1000; // количество шагов до цели dx=(x1-x)/k; dy=(y1-x)/k;
|
|
| |
Alkosha | Дата: Понедельник, 20 Октября 2014, 20:34 | Сообщение # 10 |
участник
Сейчас нет на сайте
| Пасиба. Версия daun'a, на мой взгляд, менее замудрённая и безо всякой тригонометрии и проверок. Вроде бы пашет корректно.Добавлено (20.10.2014, 20:34) --------------------------------------------- правда там равнозамедленное движение... ну в принципе и так сойдёт.
|
|
| |
daun | Дата: Понедельник, 20 Октября 2014, 21:15 | Сообщение # 11 |
постоянный участник
Сейчас нет на сайте
| Если просто перемещение объекта в заданную точку, самое простое и классическое. Код {в рабочем цикле} угол=-math.ArcTan2(x-цельX,y-цельY)/pi*180; // по углу легко поворачивать спрайт x=x+sin(угол*pi/180)*скорость; y=y-cos(угол*pi/180)*скорость;
|
|
| |
OpenGOO | Дата: Понедельник, 20 Октября 2014, 23:04 | Сообщение # 12 |
почти ветеран
Сейчас нет на сайте
| Если воспользоваться ООП, то код будет очень простым
Код auto v = p2 - p1; v.normalize(); v *= speed;
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
Alkosha | Дата: Вторник, 21 Октября 2014, 15:29 | Сообщение # 13 |
участник
Сейчас нет на сайте
| Чёто непонятная шляпа какая-то получается (впрочем, как и всегда).
По первому предложенному варианту Код { auto endpointx=pers->x+250, endpointy=pers->y-100; auto vx = endpointx - x; auto vy = endpointy - y; auto len = sqrt(vx*vx + vy*vy); if(len!=0){ vx = vx/len; vy = vy/len;
auto dx = vx * 20; auto dy = vy * 20; } else {dx=0; dy=0;}
если переменная speed = 10 - то объект движется строго прямо куда-то в бесконечность ( значительно дальше endpoint'ов), при speed = 15 - уже под скос вперёд\вниз. при 20 - вообще в диаметрально противоположном направлении.
Во втором варианте корректно движется только вперёд. Код int endpointx=pers->x+250, endpointy=pers->y-100; dx=(endpointx-x)/5; dy=(endpointy-y)/5; if(x>=endpointx-2&&x<=endpointx+2)trigger=RETURN;
Вот это срабатывает по триггеру в состоянии RETURN Код if(trigger==RETURN) { int endpointx=pers->x, endpointy=pers->y; dx=(endpointx-x)/5; dy=(endpointy-y)/5;
if(x>=endpointx-10&&x<=endpointx+10)trigger=IDLE; }
И именно когда срабатывает RETURN, то тоже непонятно куда назад улетает, хотя курс правильный. Вот только в состояние IDLE он переходит аж далеко-о-о за тем значением endpoint'a, при котором он должен вернутся.
А если в теле триггера RETURN указать endpoint, например, int endpointx=pers->x+350, endpointy=pers->y-150; То именно в ту точку он правильно переместится.
Это пока ещё не пробовал. Цитата Если просто перемещение объекта в заданную точку, самое простое и классическое.
Добавлено (21.10.2014, 15:23) --------------------------------------------- Код {в рабочем цикле} угол=-math.ArcTan2(x-цельX,y-цельY)/pi*180; // по углу легко поворачивать спрайт x=x+sin(угол*pi/180)*скорость; y=y-cos(угол*pi/180)*скорость;
Смущает тригонометрия в цикле. Может её как-то можно обойти для оптимизации ?
Добавлено (21.10.2014, 15:29) --------------------------------------------- Хотя тут достаточно единожды высчитать dx dy до следующего изменения конечной позиции. Но если конечная точка динамически будет менятся, и траэкторию нужно расчитать для целого массива объектов (предположим, будут куча самонаводящихся ракет на игрока), то лишняя тригонометрия будет давать о себе знать, наверное.
Хотя на нынешних гигагерцах может и не будет. Не знаю.
Сообщение отредактировал Alkosha - Вторник, 21 Октября 2014, 15:31 |
|
| |
MrNesh | Дата: Вторник, 21 Октября 2014, 16:27 | Сообщение # 14 |
Воин добра и света
Сейчас нет на сайте
| "Учат в школе, учат в школе, учат в школе." Постараюсь быть оригинальным Один раз находим как надо менять x и y, а потом этот результат прибавлять Только надо будет добавить ещё 1 действие...чтоб при разных фпс все нормально было
Сообщение отредактировал MrNesh - Вторник, 21 Октября 2014, 16:36 |
|
| |
daun | Дата: Вторник, 21 Октября 2014, 16:56 | Сообщение # 15 |
постоянный участник
Сейчас нет на сайте
| Цитата Alkosha ( ) Смущает тригонометрия в цикле. Может её как-то можно обойти для оптимизации ? не в For а где вся логика циклится Цитата Alkosha ( ) то лишняя тригонометрия будет давать о себе знать, наверное. Пользовательский атлон + 500 метров оперативки.
для 3D: Код x:=startX+poz*cos(kamP-(pi*2+pi/2))*cos(kamN-(pi*2)); y:=startY+poz*sin(kamP-(pi*2+pi/2))*cos(kamN-(pi*2)); z:=-startZ+poz*sin(kamN-(pi*2)); result:=(x*xx+y*yy+z*zz)/((sqrt(sqr(x)+sqr(y)+sqr(z))+sqrt(sqr(xx)+sqr(yy)+sqr(zz)))); result:=sqrt(sqr(v.x)+sqr(v.y)+sqr(v.z)); result:=sqrt(sqr(xx-x)+sqr(yy-y)); result:=sqrt(sqr(xx-x)+sqr(yy-y)+sqr(zz-z)); x:=kamx+r*cos(kamp-ug); y:=kamy+r*sin(kamp-ug); просчет коллизий массив на 500 пуль куча логики ... пережевывается без проблем.
|
|
| |
Alkosha | Дата: Вторник, 21 Октября 2014, 18:08 | Сообщение # 16 |
участник
Сейчас нет на сайте
| Цитата MrNesh ( ) Один раз находим как надо менять x и y, а потом этот результат прибавлять
Это в случае если пункт назначения статический. В динамике нужно каждый раз обновлять.
|
|
| |
MrNesh | Дата: Вторник, 21 Октября 2014, 20:21 | Сообщение # 17 |
Воин добра и света
Сейчас нет на сайте
| Цитата Alkosha ( ) Это в случае если пункт назначения статический. В динамике нужно каждый раз обновлять. А там динамика? если одна из точек изменилась => пересчитать)
|
|
| |
OpenGOO | Дата: Среда, 22 Октября 2014, 09:15 | Сообщение # 18 |
почти ветеран
Сейчас нет на сайте
| Цитата Alkosha ( ) Код auto endpointx=pers->x+250, endpointy=pers->y-100; auto vx = endpointx - x; auto vy = endpointy - y; Вот здесь ошибка. У тебя начальная точка там где находится pers, а вычитаешь какие то x и y.
Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
[GameMaker: Studio v1.4.9999]
|
|
| |
Archido | Дата: Среда, 22 Октября 2014, 11:14 | Сообщение # 19 |
Сэнсэй
Сейчас нет на сайте
| Alkosha
Цитата daun ( ) пережевывается без проблем. Ужас какой.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
Alkosha | Дата: Пятница, 24 Октября 2014, 00:11 | Сообщение # 20 |
участник
Сейчас нет на сайте
| Цитата OpenGOO ( ) Вот здесь ошибка. У тебя начальная точка там где находится pers, а вычитаешь какие то x и y.
Это X и Y того объекта, который должен добраться до оффсета относительно персонажа.Добавлено (24.10.2014, 00:11) ---------------------------------------------
Цитата OpenGOO ( ) У тебя начальная точка там где находится pers, Начальная точка там, где находится X Y, а не pers->X pers->Y
|
|
| |