Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
1 / 1 / 2
Регистрация: 13.11.2012
Сообщений: 23
1

Движение кружка на синусоиде

21.03.2013, 22:59. Показов 2190. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Помогите решить проблему.
Задание такое: нарисовать синусоиду и через таймер показать движение шарика. Он должен как бы "катится по ней", т.е. быть над ней всё время. Т.е. нужно для каждой точки составлять уравнение нормали и через него рассчитывать заново центр кружка с каждым +=dx. Так вот, помогите советами, как это реализовать.

Я сделал так: создал вектор из point'ов. Занёс в него все точки на интервале от 0 до какого-то числа. Нарисовал синусоиду. Попытался составить уравнение нормали, и проверил, как эта нормаль рисуется: оказалось, неправильно

Вот отрывки из кода:

Объявление переменных:
C++
1
2
3
4
static double dx=0.1, curx, cury, curx2, cury2;
static int rad = 15, cntr2;
vector <POINT> crds;
vector <POINT>::iterator cntr1 = crds.begin();
Заношу в вектор координаты
C++
1
2
3
4
5
6
7
8
9
10
11
case WM_CREATE:
        for(curx=0; curx<21; curx+=dx)
        {
            cury = 200+50*sin(curx);
                POINT tmp; 
                tmp.x = 50*curx; 
                tmp.y = cury;
            crds.push_back(tmp);                        
        }
        //SetTimer(hWnd,WM_TIMER,50,NULL);
        return 0;
Вот тут нюанс - мне приходилось умножать как curx, так и cury на большое число, напр. на 50, чтобы график был нормального масштаба. Подозреваю, что проблема может быть из-за этого.

Сам вм_пэинт:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);
 
        // Рисуем синусоиду;
        MoveToEx(hdc,0,200,NULL);
        for(curx=0; curx<21; curx+=dx)
        {
            cury = 200+50*sin(curx);
            LineTo(hdc,50*curx,cury);
        }
                // нормали к графику в точках
        for(int i=9; i<10; i++)   // это просто чтобы показалась только одна нормаль
        {
            for(curx2=crds[i].x;curx2<crds[i].x+30;curx2+=dx)
            {
                cury2 = 200+50*sin(crds[i].x)-(curx2-crds[i].x)/(200+50*cos(crds[i].x));  // y=f(x0)-(x-x0)/f'(x)
                SetPixel(hdc,curx2,cury2,NULL); // рисую не линией, а по точкам
            }
            InvalidateRect(hWnd,NULL,0);
        }
Может быть вы сможете указать на ещё какие-то ошибки? Спасибо!

Добавлено через 6 минут
C++
1
cury2 = 200+50*sin(crds[i].x)-(curx2-crds[i].x)/(cos(crds[i].x));
Вот так уже что-то похожее, но всё равно не то.

Добавлено через 5 минут
Если взять
C++
1
for(int i=10; i<40; i+=5)
т.е. чтобы было видно, как оно строит нормали. То вот как:
Миниатюры
Движение кружка на синусоиде  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.03.2013, 22:59
Ответы с готовыми решениями:

Движение по синусоиде
Разработать программу, моделирующую движение шарика по синусоиде. При ударе о стену шарик должен...

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

Движение по синусоиде
Подскажите, пожалуйста, как реализовать движение спрайта по синусоиде? Сейчас движется только...

Движение спрайта по синусоиде
Подскажите, пожалуйста, как реализовать движение спрайта по синусоиде? Сейчас движется только...

2
Заблокирован
22.03.2013, 07:14 2
Многое зависит от соотношения "размаха" синусоиды и радиуса мячика.

Если посмотреть на рисунок, то g(x) на крутом подъеме и спаде заметно выше, чем в переходных точках. В таком случае есть смысл переходить с g(x) на k(x) при 1<|x|<2 плюс период. При анимации можно подобрать параметры, чтобы переход не был заметен.

С другой стороны, если мячик маленький (движение по m(x)), то он практически на одинаковом расстоянии все время.

Расчет по касательной в каждой точке очень "дорог", аналитической кривой в этом случае на получается (впрочем, над этим еще можно поработать).

Пока что, такие соображения )
Миниатюры
Движение кружка на синусоиде  
0
1 / 1 / 2
Регистрация: 13.11.2012
Сообщений: 23
22.03.2013, 14:13  [ТС] 3
IrineK, всё-таки по заданию требуется вычислять именно через нормаль. Да и шарик должен быть не очень малых размеров (там потом ещё по заданию нужно показать его вращение через поворот видимого радиуса).

Я ещё попробовал сделать как параметрические уравнения:

C++
1
2
3
4
5
6
for(t=0; t<50; t+=1)
        {
            curx = t*20;
            cury = 200+70*sin(50*t);
            LineTo(hdc,curx,cury);
        }
График выглядит вот так:
https://www.cyberforum.ru/atta... 1363946216

Потом для каждой точки пишу уравнение нормали. Для параметрической заданной кривой ведь уравнение такое же?

https://www.cyberforum.ru/cgi-bin/latex.cgi?y = f({x}_{0}) - \frac{x-{x}_{0}}{{f'}_{x}}

Т.е. напр. к точке (crds[i].x, crds[i].y):

C++
1
2
3
4
5
for(curx2=crds[i].x-40;curx2<crds[i].x+40;curx2+=1)
            {
                cury2 = 200+70*sin(crds[i].x)-(curx2-crds[i].x)/(175*cos(50*crds[i].x));
                SetPixel(hdc,curx2,cury2,NULL);
            }
По идее, если я ничего не напутал, всё должно быть нормально. Однако рисует вот такие линии:
https://www.cyberforum.ru/atta... 1363947097
Миниатюры
Движение кружка на синусоиде   Движение кружка на синусоиде  
0
22.03.2013, 14:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.03.2013, 14:13
Помогаю со студенческими работами здесь

Вращение и движение по синусоиде звезды
Нужно нарисовать такую фигурку. что бы она двигалась по синусоиде и вращалась вокруг центра(((...

Движение круга по синусоиде (WinAPI)
Значит задача состоит в том чтобы круг двигался по синусоиде. Пишу на DevC++. Нашел как синусоиду...

Графика, ООП: движение креста по синусоиде слева направо, вперед и назад
Задание : движение креста по синусоиде слева направо, вперед и назад. Я не знаю как делать. Как...

Applet. Произвольное движение кружка
Сделать так, чтобы круг двигался по апплету произвольно. Т.е. ударяется об стенку и двигается....

Движение кружка при помощи таймера
Движение маленького кружка по горизонтали, при достижении границы формы кружок меняет цвет, а...

Движение по синусоиде
Есть анимация солнечной системы. Земля вращается вокруг Солнца, а Луна вокруг Земли. Нужно сделать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru