Четверг, 18 Апреля 2024, 14:27

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Программирование » Общие обсуждения программистов » Как вычислить приращения по осям координат?
Как вычислить приращения по осям координат?
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
Воин добра и света
Сейчас нет на сайте
"Учат в школе, учат в школе, учат в школе."
Постараюсь быть оригинальным smile
Один раз находим как надо менять 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
Форум игроделов » Программирование » Общие обсуждения программистов » Как вычислить приращения по осям координат?
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг