Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2011, 21:32   #1
g4mer
 
Регистрация: 18.04.2011
Сообщений: 3
По умолчанию Проблема реализации отскока шарика.

Здравствуйте, вообщем пишу задачу моделирующую движение шарика в прямоугольнике, посреди прямоугольника имеется стена произвольного размера. Прошу помочь с реализацией отскока именно от этой стены: отскоки от краев формы написал, работают на ура, а вот c этой стенкой проблемы, мячик иногда не под тем углом отлетает от стены, или вообще пролетает сквозь неё.
Алгоритм следующий, в момент удара о стенки просчитываются скорости в данный момент времени и через их отношение находится угол направления скорости в данный момент.
Условия на отскок от краев формы:
Цитата:
if x<=r then
begin
x0:=r;
x:=x0;
y0:=y;
Vx:=round(V*cos(a*pi/180));
Vy:=round(V*sin(a*pi/180)-g*t);
a:=-round(arctan(vy/vx)*180/Pi);
V:=round(sqrt(sqr(Vx)+sqr(Vy)));
t:=0;
Vx:=V*cos(a*pi/180);
Vy:=V*sin(a*pi/180);
end;
if x>=clientwidth-r then
begin
x0:=clientwidth-r;
x:=x0;
y0:=y;
Vx:=round(V*cos(a*pi/180));
Vy:=round(V*sin(a*pi/180)-g*t);
a:=180-round(arctan(vy/vx)*180/Pi);
V:=round(sqrt(sqr(Vx)+sqr(Vy)));
Vx:=V*cos(a*pi/180);
Vy:=V*sin(a*pi/180);
t:=0;
end;
if y<=r then
begin
x0:=x;
y0:=r;
y:=y0;
Vx:=round(V*cos(a*pi/180));
Vy:=round(V*sin(a*pi/180)-g*t);
if round(arctan(vy/vx)*180/Pi)>0 then a:=-round(arctan(vy/vx)*180/Pi)
else a:=180-round(arctan(vy/vx)*180/Pi);
V:=round(sqrt(sqr(Vx)+sqr(Vy)));
Vx:=V*cos(a*pi/180);
Vy:=V*sin(a*pi/180);
t:=0;
end;
Пробовал для стенки вот такие ограничения:
Цитата:
if (x>=round(clientwidth/2)-5-r)and(y>round(clientheight*0.5)-r)and(x<round(clientwidth/2)+r) then begin
x0:=round(clientwidth/2)-r-5;
x:=x0;
y0:=y;
Vx:=round(V*cos(a*pi/180));
Vy:=round(V*sin(a*pi/180)-g*t);
a:=180-round(arctan(vy/vx)*180/Pi);
V:=round(sqrt(sqr(Vx)+sqr(Vy)));
t:=0;

end;
if (x<=round(clientwidth/2)+5+r)and (x>=round(clientwidth/2)-r)and(y>round(clientheight*0.33)-r) then begin
x0:=round(clientwidth/2)+r;
x:=x0;
y0:=y;
V0x:=round(V*cos(a*pi/180));
V0y:=round(V*sin(a*pi/180)-g*t);
a:=-round(arctan(vy/vx)*180/Pi);
V0:=round(sqrt(sqr(Vx)+sqr(Vy)));
t:=0;
Но как писал выше, с такими ограничениями работает не корректно, может кто посоветовать что? Или хотя бы намекнуть....
Вложения
Тип файла: rar test.rar (169.7 Кб, 18 просмотров)
g4mer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема в реализации метода Хаффмана 77sega77 Общие вопросы Delphi 4 06.05.2011 23:53
Движение шарика Stradivarius Паскаль, Turbo Pascal, PascalABC.NET 1 09.04.2010 00:45
проблема с определением параметра при реализации запроса Margarett Помощь студентам 3 14.03.2010 17:56
Проблема реализации Ivan_32 Свободное общение 19 26.06.2009 08:32
Движение шарика в С# mak-mar Общие вопросы .NET 7 13.05.2009 17:59