Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Графика, задача про бильярд


Автор: Alex31kv 20.4.2007, 23:52
Нарисовать бильярдный стол (без луз) и шарик на столе, бьем по шарику кием под углом альфа, угол выбираем сами.
Показать как будет двигаться шарик сохраняя законы физики (угол падения равен углу отражения).
P.S. Должен двигаться шарик, след от него не нужен.

Автор: Alex31kv 29.4.2007, 11:40
подскажите как сделать что бы шарик двигался?

Код

#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
main()
{
int gd=0,gm,x,y,a;
initgraph(&gd, &gm, "D:\\program\\Borland\\TC\\BGI");
  setfillstyle(1,GREEN);
  bar(40,40,600,440);
  setfillstyle(1,RED);
  fillellipse(140,240,10,10);
getch();
closegraph();
}

Автор: dizzy1984 1.5.2007, 13:34
В общем и целом идея такова.
Если шарик двигается равномерно, то в каждый момент времени шарик увеличивает свои координаты на некторое постоянное значение по х и у. При соударении с бортом бильярдного стола та величина, которая не может более увеличивать или уменьшать соответствующую координату меняет свое значение на противоположное. Так шарик двигавшийся вверх столкнувшись с бортом будет двигаться вниз.
Вот псевдокод.

1. Нарисовать стол
2. Нарисовать шарик
3. Модифицировать координаты х и у.
4. Проверить наличие столкновения.
5. В случае наличия инвертировать соответствующую характеристику.
6. Подождать некоторое время
7. Перейти к шагу 1

Автор: En_t_end 1.5.2007, 14:14
Недавно делал.
Клавиши 
'q' - выход
'w' - переместить вверх
'a' - вправо
'd' - влево
's' - вниз
'e - изм. угол
'r' - изм. угол
'+' - сила удара
'-' - сила удара
пробел - начать движение

Добавлено через 2 минуты и 21 секунду
Там есть некоторые недочёты, как то лишний параметр у функции ball_drive.
Тебе нужна именно функция ball_drive

Автор: Alex31kv 4.5.2007, 21:13
En_t_end, 
супер, сделал красиво, вот только с физикой как то не очень, не знаешь как ее доработать?

Автор: En_t_end 6.5.2007, 16:21
Alex31kv, 
Цитата(Alex31kv @  5.5.2007,  01:13 Найти цитируемый пост)
супер, сделал красиво, вот только с физикой как то не очень, не знаешь как ее доработать?

Как раз с физикой там всё нормально smile Ко всему прочему, что там расчитывается равнозамедленное прямолинейнное движение(по гипотенузе), я использую реально измеренные коэффицент трения и средне статистическую силу удара кием, также взята совершенно реальная масса шара.

Доработать её можно и нужно.
1. разберись с расчётом углов отражений.
Я, дабы не заморачиваться разбил задачу на подзадачи. Поясняю, нам изначально неизвестно в какой борт попадёт шар, если разбить плоскость стола на четыре квадранта(относительно угла удара), то теперь мы должны выбирать в какой из двух бортов происходит удар. Чтобы это сделать нужно построить треугольник с гипотенузой от позиции шара до лузы(к этому времени у программы будет всего лишь одна луза для удара) и посмотреть угол образованный этой прямой. Т.е теперь сравнивая угол удара и угол обр. прямой построенной в лузу мы можем однозначно определить в какой борт будет удар.
Ну а дальше просто расчитывается точка пересечения двух прямых : борта и прямой удара.
Проблема: слишком много кода для решения данной подзадачи.
Проблема: ошибки расчета угла отражения при углах удара(после преобразования к углу определенного квадранта) близких к 90 градусам и 0 градусов. У меня есть предположение, что в этом виноваты реализации тригонометрических функций в старых либах, они вообще ИМХО 16 разрядные smile
2. Следующая задача - это движение шара по прямой с учётом законов физики.
а)узнаешь длину отрезка движения(по двум точкам)
б)прогоняешь цикл с итерациями(итератор i) от 0 до длины отрезка.
Расчёт текущей точки отрисовки шара выполняешь по следуюшим формулам:
x = A1.x(+-)i*cos(alfa)
y = A1.y(+-)i*sin(alfa)
alfa - угол между прямой паралельной оси 0x и прямой удара.
Т.е узнаешь абсциссу и ординату текущей точки отрисовки шара.
Далее, приращение i - есть ускорение a.
a = (F_удара - F_тр)/m.
В конце каждой итерации ускорение перерасчитывается.
Здесь проблема в том, как определить приращение итератора, как напрямую добавлять ускорение или подвергнуть ускорение ещё каким-то преобразованиям.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)