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

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

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

Студворк — интернет-сервис помощи студентам
Здравствуйте. Помогите решить проблему.
Задание такое: нарисовать синусоиду и через таймер показать движение шарика. Он должен как бы "катится по ней", т.е. быть над ней всё время. Т.е. нужно для каждой точки составлять уравнение нормали и через него рассчитывать заново центр кружка с каждым +=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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.03.2013, 22:59
Ответы с готовыми решениями:

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

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

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

2
 Аватар для IrineK
2023 / 1641 / 425
Регистрация: 23.02.2011
Сообщений: 6,002
Записей в блоге: 25
22.03.2013, 07:14
Многое зависит от соотношения "размаха" синусоиды и радиуса мячика.

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

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

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

Пока что, такие соображения )
Миниатюры
Движение кружка на синусоиде  
0
 Аватар для ArtVgd
1 / 1 / 2
Регистрация: 13.11.2012
Сообщений: 23
22.03.2013, 14:13  [ТС]
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.03.2013, 14:13
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru