Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2018, 08:46   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Движение объекта по прямой траектории

Ещё раз здравствуйте.
Сегодня я задался целью, научить картинку перемещаться, и мне нужно перемещение по прямой. У меня есть две координаты - начало и конец движения. Нужно построить траекторию, и двигаться по ней с определённой скоростью (скорость будет постоянной, и регулироваться на глаз).

Первое, что мне пришло в голову - построение массива координат с помощью волнового алгоритма, но у меня может быть несколько десятков объектов, и мне кажется, что такое решение будет весьма увесистым, а потому - малоэффективным.
Я тут нагуглил, существует некое уравнение прямой, и вспомнил, что где то и когда то я уже решал такую задачу, только вот где и когда - не помню. Вполне возможно, что даже на этом форуме я задавал вопрос по этой теме, но поиск ничего полезного мне не показал.

Что можете подсказать по теме ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 10.03.2018, 09:58   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

http://www.eduspb.com/node/1665
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 10.03.2018, 11:21   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Я тут нагуглил, существует некое уравнение прямой
Я вам больше скажу - можно нагуглить само уравнение прямой!
Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Нужно построить траекторию
И в чем проблема? Движение по прямой на плоскости можно разложить на движение по оси Х и движении по оси У. Нарисуйте прямоугольный треугольник и представьте себе, что вам надо двигаться по гипотенузе.
waleri вне форума Ответить с цитированием
Старый 10.03.2018, 11:30   #4
Alar
Александр
Администратор
 
Аватар для Alar
 
Регистрация: 28.10.2006
Сообщений: 17,758
По умолчанию

А сделать таймер и перемещать X+1 по таймеру по условию if X<B

Скорость движения устанавливается интервалом таймера.
Alar вне форума Ответить с цитированием
Старый 10.03.2018, 15:09   #5
kvitaliy
Участник клуба
 
Регистрация: 17.05.2011
Сообщений: 1,660
По умолчанию

Цитата:
Сообщение от Alar Посмотреть сообщение
А сделать таймер и перемещать X+1 по таймеру по условию if X<B
Как частный случай, если движение вдоль системы координат, то можно прибавлять 1.
Но на практике угол движения может быть различным, и поэтому к начальным координатам Х0 и У0 надо прибавлять различные значения, в зависимости от угла движения.
Вначале по известной формуле рассчитывается расстояние между координатами, где Xo и Yo начало, а X и Y конец отрезка
Dal = Sqr((Xo - X) ^ 2 + (Yo - Y) ^ 2) ; в VB Sqr это квадратный корень!

затем рассчитываются приращения к координатам
Xd = (X - Xo) / (Dal / Hag)
Yd = (Y - Yo) / (Dal / Hag)
где Hag это расстояние в пикселях, которое пройдет тело за одно срабатывание таймера. Отвечает за плавность движения.

Пока X1 и Y1 не равны X и Y выполнять в таймере:
X1 = Xo + Xd:
Y1 = Yo + Yd:
Print Тело (X1, Y1) ; Рисуем тело с новыми кординатами
Xo = X1: Yo = Y1

Вот и всё.
kvitaliy вне форума Ответить с цитированием
Старый 10.03.2018, 15:32   #6
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,322
По умолчанию

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
Первое, что мне пришло в голову - построение массива координат с помощью волнового алгоритма, но у меня может быть несколько десятков объектов, и мне кажется, что такое решение будет весьма увесистым, а потому - малоэффективным.
Я правильно понимаю, что можно представить себе клетки (матрица, как тетрадный лист в клетку), где в некоторых клетках находятся объекты - несколько десятков на всём поле. У каждого объекта есть целевая клетка, куда он должен придти. Объекты могут двигаться только по прямой, то есть по диагонали нельзя перебраться из клетки в клетку. Объекты не могут оказаться в одной клетке одновременно.

Последний раз редактировалось 8Observer8; 10.03.2018 в 15:34.
8Observer8 вне форума Ответить с цитированием
Старый 10.03.2018, 18:59   #7
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Я вам больше скажу - можно нагуглить само уравнение прямой!
y=kx+b. Вид этого уравнения слишком сырой для применения при решении моей задачи. У меня же две пары чисел (x0;y0, x;y), и что бы в цикле получать dx;dy - что куда пихать по этому уравнению я не обнаружил.

Цитата:
Сообщение от waleri Посмотреть сообщение
Нарисуйте прямоугольный треугольник и представьте себе, что вам надо двигаться по гипотенузе.
А координаты точек гипотенузы где брать ? =)

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Объекты могут двигаться только по прямой, то есть по диагонали нельзя перебраться из клетки в клетку
Не совсем так ... В данном случае под прямой траекторией подразумевается движение по той самой гипотенузе прямоугольного треугольника, о которой упомянул waleri.

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Объекты не могут оказаться в одной клетке одновременно.
Вообще, это не принципиально, но характер движения различных объектов, да и компоненты интерфейса, подразумевают случайные пересечения объектов;
- статичные (вращающиеся) объекты;
- объекты двигающиеся по случайной (прямой) траектории;
- объекты, которые должны двигаться от статичных к движущимся - опять же, по прямой, по гусям с упреждениями целиться не собираюсь.

kvitaliy, весы у вас почему то просят оставить отзыв кому то ещё. Так что от меня простое человеческое словесное спасибо.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 10.03.2018, 21:57   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
У меня же две пары чисел (x0;y0, x;y), и что бы в цикле получать dx;dy
Код:
T:=...;//время за которое надо пройти весь путь
dx:=(x1-x0)/T; // смещение по оси X за одну итерацию
x:=round(x0 +dx*t); // положение "на оси X" в момент времени t
и тоже самое (dy:=...; y:=... ) "для оси Y"
Код:
Код:
dx:=...; dy:=...;// получают раз ДО цикла 
for t:=0 to T do begin
 x:=x0+round(dx*t);
 y:=....
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.03.2018 в 22:03.
evg_m вне форума Ответить с цитированием
Старый 11.03.2018, 02:19   #9
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

На самом деле не всё так радужно. Если шагов много, а линия под нехорошим наклоном, то предварительное вычисление приращений может увести довольно далеко.

Может, имеет смысл посмотреть в сторону алгоритма Брезенхема?
Black Fregat вне форума Ответить с цитированием
Старый 11.03.2018, 02:45   #10
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Black Fregat, о, новое слово ... =)

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
предварительное вычисление приращений может увести довольно далеко
Яж не хочу предварительно вычислять ... Вычислил точку - переместил. Ну и так далее, до тех пор, пока не достигну пункта назначения. Но в любом случае, я когда то уже двигал объект по произвольной прямой траектории, и помню, что двигал именно по уравнению прямой. Но это было давно и неправда, особенно если учесть, что я не помню вообще ничего о том, что именно я двигал. Но точно помню, что у меня всё нормально работало.

Если сейчас сравнивать, что я могу лучше реализовать, новый для меня алгоритм Брезенхема, или знакомый волновой алгоритм - то у меня лучше получится второе; в таком случае у меня сразу же будет готовый массив точек, по которому нужно просто пройтись с определённой скоростью.
Но это на крайний случай. Сначала я попробую как написал kvitaliy.

Цитата:
Сообщение от OmegaBerkut Посмотреть сообщение
А координаты точек гипотенузы где брать ? =)
Как вариант, нарисовать чёрную линию на каком нибудь Bitmap с белым фоном, и выцепить координаты чёрных точек. Это может даже будет работать быстрее волнового алгоритма, ибо всего один проход по матрице. Хотя опять же, так у меня не будет правильного порядка точек; но и это можно учесть, при помощи выбора порядка прохождения по матрице.

P. S. Если сильно по хардкору - можно залезть в исходники дотнета (я на шарпе всё это рисую), и спереть алгоритм функции Graphics.DrawLine().
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 11.03.2018 в 02:56.
OmegaBerkut вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JavaScript:движение объекта по траектории Ayanami Помощь студентам 8 18.11.2014 21:45
Движение объектов по траектории Vladlena Общие вопросы C/C++ 0 19.05.2013 18:38
Движение объекта по квадратной траектории oblomok C# (си шарп) 5 08.07.2012 23:13
Движение объекта по искривленной траектории ZvEr_HaCkEr Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 25.06.2011 05:36