Перейти к содержанию
СофтФорум - всё о компьютерах и не только

как сделать анимацию?


Рекомендуемые сообщения

Вопросы для анимации объектов: Как написать уравнение заданного эллипса, перемещающегося параллельно самому себе по кругу с данным радиусом в параметрической форме?

Как написать уравнение движения точки по квадрату с заданными координатами? а) квадрат неподвижен б) он сам вращается по кругу отн. начала координат.

уравнения должны включать время, конечно

Ссылка на комментарий
Поделиться на другие сайты

motorway:

мне нужно просто записать уравнение математически
Ну, программирование обычно пользуется готовыми функциями типа автоматического рисования эллипса. Но если хочется удариться в математику...
Как написать уравнение заданного эллипса, перемещающегося параллельно самому себе по кругу с данным радиусом в параметрической форме?
Это обычное сложение движений. Как у мухи на рогах вола: мы пахали... :D

Параметрическое задание эллипса: x=a cos t; y=b sin t. Это муха. Теперь, центр эллипса ходит по кругу - это вол под мухой ходит: x=r cos t; y=r sin t. Параметры t в первой и второй парах уравнений не обязаны совпадать, муха не обязана делать круг вокруг рогов за то же время, что вол - обходить поле. Поэтому в первом уравнении запишем не t, а kt, чтобы выразить параметр одного движения через параметр другого (так как мы берем в качестве параметра время, то k - это во сколько раз быстрее будет крутиться муха, чем вол): x=a cos kt; y=b sin kt. Теперь складываем движения вола и мухи: x=r cos t + a cos kt; y=r sin t + b sin kt; Теперь учтем еще смещение в начальной фазе движений: муха может начать движение с любой точки рога: x=r cos t + a cos (kt+g); y=r sin t + b sin (kt+g);

Вот и все. k и g - параметры, задающие разницу по частоте и фазе движений мухи и вола, то есть точки на эллипсе и самого эллипса в целом. Их можно брать любыми, соответственно результирующая траектория мухи на поле будет меняться.

Как написать уравнение движения точки по квадрату с заданными координатами? а) квадрат неподвижен б) он сам вращается по кругу отн. начала координат.
"Адресованная другу, ходит песенка по кругу..." Нет, по квадрату. Ладно, сделаем квадрат из круга... Тогда и песенке придется ходить по квадрату.

Для удобства для начала возьмем вписанный в круг квадрат и слегка повернем его, чтобы диагонали квадрата совпадали с координатными осями. Радиус круга пересечет сторону квадрата в точке, расстояние которой от центра меньше, чем радиус круга, в k раз. Чему равно k? Смотрим рисунок:

pp.jpg

В любой точке стороны квадрата будет x/k+y/k=r, а расстояние от этой точки до центра будет r/k (из подобия треугольников). k меняется для разных направлений радиуса, но его легко найти для любой точки на окружности.

Еще раз для ясности: исходную точку мы выгуливаем по кругу, как это принято для уравнений в параметрической форме, меняя значение параметра, и для каждого положения точки на круге находим координаты ее "тени", перемещающейся по сторонам квадрата. Получается параметрическое задание "прогулки" точки-тени по сторонам квадрата. Пока, правда, повернутого на 45°, но это мы исправим потом.

Итак, для нахождения k у нас есть два условия: x/k+y/k=r и x²+y²=r²

Из x/k+y/k=r имеем x+y=kr и (x+y)²=x²+2xy+y²=k²r², а так как x²+y²=r², то r²+2xy=k²r² и, далее, k=√(1+2xy/r²)

Чтобы это годилось для всех сторон квадрата, надо брать модули x и y, итого k=√(1+2|xy|/r²)

Теперь, ведем точку по кругу: x=r cos t; y=r sin t. Соответствующая ей точка с координатами

X=(r /√(1+2|xy|/r²)) cos t =(r /√(1+2|r cos t||r sin t|/r²)) cos t =(r /√(1+|sin 2t|)) cos t;

Y=(r /√(1+2|xy|/r²)) sin t =(r /√(1+2|r cos t||r sin t|/r²)) sin t =(r /√(1+|sin 2t|)) sin t

будет перемещаться при этом по сторонам квадрата.

Да, квадрат-то у нас повернут, надо повернуть его снова на 45°, чтобы стороны были параллельны осям координат. Как обычно при вращении фигуры, для этого координаты точки на нашем квадрате преобразуем по формулам

Xn=X cos 45° + Y sin 45°

Yn=Y cos 45° - X sin 45°

(тут n - просто индекс, чтобы отличить преобразованные значения X и Y от старых).

Упрощая, получаем

Xn=√2/2 *(X+Y)

Yn=√2/2 *(Y-X)

и, в итоге,

Xn=(r/√(2(1+ |sin 2t|))) *(cos t + sin t)

Yn=(r/√(2(1+ |sin 2t|))) *(sin t - cos t)

Вот и все.

Выкладки было лень проверять, так что обещать, что нигде никаких ошибок при преобразованиях не было, не могу. Как говорится во всяких лицензиях на программы, что мог, написал, но ни за что не отвечаю :g: . Давно подмечено, что в своем глазу временами и бревна не замечаешь. Так что, если это действительно нужно, советую выкладки повторить на бумаге самому, расписывая поподробнее.

Теперь еще квадрат должен не то крутиться вокруг своего центра, не то ходить по кругу, что именно, я из условия не понял, но сделать все это можно. Если крутиться, то придется полученные координаты дополнительно преобразовывать по формулам для вращения фигуры, точно так же, как при повороте нашего квадрата на 45°, только угол теперь у нас будет переменный, пропорциональный t с каким-нибудь коэффициентом. Не буду перезаписывать формулы с учетом вращения нашего квадрата, как это делается, уже понятно, а формулы, для поста в форуме, и так уже достаточно громоздки.

Если надо ходить по кругу (сохраняя ориентацию квадрата относительно сторон света, т.е. квадрат ходит по кругу, сам не крутясь), то надо добавлять к координатам точек квадрата координаты смещения центра квадрата при его движении по кругу, точь в точь, как в первом примере. Можно, конечно, и скомбинировать движение квадрата по кругу с его вращением вокруг собственного центра, тогда в конечном счете получится что-то вроде уравнений для движения планет по Птолемею (или вальса), но это вроде бы уже чересчур.

post-1208-1179867990_thumb.jpg

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

А что надо прописать в Делфи, чтобы эллипс вращался?) Сейчас некогда в программинге разбираться, просто хочется на ближайшем уроки информатики удивить народ)

Изменено пользователем Feur_GOR
Ссылка на комментарий
Поделиться на другие сайты

Feur_GOR:

Если плюнуть на эффективность, то просто что-то перемещающееся программируется несложно. Все способы сводятся к стиранию изображения на старом месте и рисованию его на новом. Простейший способ был в топике Подавление эффекта мигания. Но вот чтобы это было быстро и хорошо, существует множество вариантов и ухищрений (предварительная подготовка изображений, "прозрачные" цвета, наложение изображений с использованием логических операций над цветами).

У меня сейчас Delphi не установлен, но код для Delphi для перемещения геометрической фигуры есть, например, тут, немного более эффективный - тут.

В играх это делают с использованием библиотек DirectX или OpenGL.

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...