![]() |
Равнозамедленное движение по ломаной
В общем задача такая: Необходимо визуализировать равнозамедленное движение точки по ломаной линии (динамичеки задаваемой массивом точек). Составляющие отрезки по длине различны. Может быть кто-то видел готовое решение или близкое (например равномерное движение по ломаной)?
Поиск я использовать умею... |
Используй Tween.
|
Tween, к сожалению, не годиться. Ищу портируемое на другие языки решение. Я представляю как это нужно сделать, но алгоритм нетривиальный достаточно. Вот думаю может готовое найдется.
|
Я бы задумался над классом Point и его методами (например, normalize)
|
Первое что пришло в голову. Значит, есть массив координат.
Есть объект который движется по ломанной, заданной этими координатами. У объекта есть скорость и текущее положение (просто вещественное число). Для начала найдем длину ломанной. То есть сумму длин всех отрезков. Причем длину каждого отрезка нам также нужно хранить в массиве. Надеюсь школьные формулы все помнят (: Далее нам потребуется ещё один массив. Он по размеру будет такой же как массив координат. Только содержать будет не координаты, а длину ломанной от начала до данной точки. То есть с помощью него мы сможем зная пройденный путь(наше текущее положение) определить на каком из отрезков мы находимся. Надеюсь с этим всё понятно. Главное подготовить эти данные, остальное всё просто. Потом происходит анимация. К нашей координате всё время прибавляется скорость, и скорость уменьшается на какой-то коэфициент(равнозамедленное, ага). После того как расчитали новое значение нашей координаты, определим на каком отрезке мы находимся. Это просто, мы же знаем на каком участке пути какое расстояние будет пройдено. Далее нам нужен нормализованный вектор текущего отрезка. Назовем его V. Потом найдем разность между пройденным нами расстоянием и расстоянием до начала текущего отрезка. Фактически это будет расстояние, которое мы прошли по текущему отрезку. Если мы это расстояние поделим на длину текущего отрезка, получим некий коэфициент. Он всегда будет от 0 до 1. Назовем его k. Так вот, наша текущая координата будет определяться формулой pos = x0 + V * L * k где pos - это координата начала отрезка, x0 - начальная координата отрезка, V - нормальзованный вектор, полученный из этого отрезка(находить по типу normalize(x1-x0)) L - длина отрезка, K - коэфициент от 0 до 1. Векторную алгебру все помнят? (: Описал как всегда смутно. ИМХО реализуется всё очень просто, нужно только немного подумать. |
У меня два варианта:
1. Если Вы хорошо разбираетесь в математике, то по данным узловых точек можно "состряпать" линейный сплайн и потом и пользоваться для указания направления движения точки; 2. Tween для равнозамедленного движения - роскошь, которую могут позволить себе не многие, поэтому проще локально опысывать траекторию движения точки линейными уравнениями, получаемыми из значений координат двух ближайших узловых точек ломаной линии. В реализации данный вариант еще проще, чем на словах, поэтому не привожу здесь код. Думаю, Вы без труда его реализуете. |
Спасибо за внимание))
Может кому-нибудь в будущем понадобится этот код Натуральным языком алгоритм описан Division, только что там про коэффициент K значит я так и не понял. Alex_beginer, Что в данном случае подразумеваете под термином линейный сплайн? Опишите Ваш алгоритм натуральным языком? Код:
//создадим объект, который будет двигаться равнозамедленно по ломаной |
Цитата:
Линейный сплайн (кусочно-линейное интерполирование) представляет собой, некое уравнение, которое позволяет описывать ломаную линию. Как известно из основных постулатов Теории численных методов, полином стпени N может иметь N-1 локальный максимум и минимум и график может раскачиваться, чтобы пройти через точки ломаной линии. Поэтому, N-полиномиальное описание такой ломаной негодится, в принципе. Для описания такой линии лучше использовать линейный сплайн - уравнение, построенное по значениям узловых точек. Как правило, для описания такой кусочно-линейной кривой используют полином Лагранжа. Более детально, об этом можно прочитать в специализированной литературе по математике, имеющейся на пыльных полках многих букинистичеких магазинов.:) |
K - коэфициент от 0 до единицы. То есть мы знаем длину текущего отрезка(по которому движемся в данный момент). Знаем, какое расстояние мы по нему уже прошли. Делим это расстояние на длину отрезка, получаем коэфициент K (: Если прошли половину отрезка, K будет равен 0.5. Если находимся в начале отрезка - 0. В конце - ближе к единице. Короче если умножить нормализованный вектор полученный из текущего отрезка, на K, потом к начальной точке отрезка прибавить полученный вектор, то получим наши текущие координаты.
UPD: Чет я втыкаю (: А ведь действительно, можно просто умножить нормализованный вектор на пройденное по отрезку расстояние. И не нужно никаких коэфициентов... Да, и ещё... Если curspeed*=0.97, то такое движение не равнозамедленное (: |
Теперь поговорим более подробно о методе со сплайнами.
Порядок такой: 1. Рассчитываете все коэффициенты сплайна по данным узловых точек; 2. Известно, что расстояние между двумя ближайшими точками рассчитывается как: R = корень_квадратный((x2-x1)^2+(y2-y1)^2); где x1,y1 - координаты предыдущей рассчитаной точки на предыдущей итерации. R - расстояние между двумя ближайшими точками; Таким образом, на текущей итерации для данного уравнения неизвестны только x2,y2; 3. Предполагается, что если расстояние проходимое точкой на всех отрезках ломаной для каждой итерации будет одинаковым, то движение точки можно назвать равномерным, т.е. точка движется с постоянной скоростью. Теперь, если расстояние проходимое точкой в каждой итерции будет изменяться по линейному закону, то такое движение можно назвать равнозамедленным, либо равноускоренным, в соответсвующих случаях 4. Уравнение сплайна представляет собой функцию y=f(x), а приведенное выше уравнение, также может быть представлено в виде y=f(x) (здесь y=y2; x=x2). В результате мы имеем систему уравнений из двух уравнений и двух неизвестных, найдти корни которой в общем ввиде несоставит труда, если пользоваться методом подстановки. 5. Теперь используя коэффициент R как постоянную в каждой итерации мы получаем равномерное движение. Изменяем его по линейному закону получаем равнозамедленное или равноускоренное движение. 6. Вот, собственно, и вся теория. |
2Alex_beginner
Насколько мне известно при равнозмедленном движении, скорость за определенный промежуток времени уменьшается на одно и то же значение. Но "на одно и то же" и "в одно и то же" - разные вещи (: |
Alex_beginner Мудрено уж больно для меня.
По сути Вы предлагаете искать R для каждого участка ломаной? А R - это расстояние от начало участка до рассчитываемого текущего положения точки? Так, в принципе, в приведенном выше коде и делается. Division А как Вы предлагаете изменять текущую скорость? Вот так корректнее: Код:
//создадим объект, который будет двигаться равнозамедленно по ломаной |
Цитата:
Цитата:
Его рассчитывать нужно по линейному закону (R=k*x+b), в случае равнозамедленного (равноускоренного) движения и оно же является константой, в случае равномерного движения. Будет время, постраюсь эту теорию выразить в практическом примере. |
| Часовой пояс GMT +4, время: 11:44. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.