Люди помогите написать отскок шариков….Друг от друга….
Очень нужно…Желательно..чтобы был построен по законам физики…
Вот прога…:
#include
#include
#include
#include
#include
#include
#include
void main()
{
int gdriver=DETECT, gmode=VGAHI, errorcode;
initgraph(&gdriver, &gmode, «C:\\bc5\\bgi»);
errorcode = graphresult();
if (errorcode != grOk)
{
printf(«Graphics error: %s\n», grapherrormsg(errorcode));
printf(«Press any key to halt:»);
getch();
return;
}
int maxx=getmaxx();
int maxy=getmaxy();
int maxcolor=getmaxcolor();
int x1=100,dx1=3;
int y1=100,dy1=3;
int r1=50;
int x2=200,dx2=2;
int y2=400,dy2=4;
int r2=50;
while(!kbhit())
{
setcolor(BLACK); //Øëåéô…åãî öûåò
circle(x1,y1,r1);
x1=x1+dx1;
y1=y1+dy1;
if (x1<=50 || x1+r1>=maxx) dx1=-dx1;
if (y1<=50 || y1+r1>=maxy) dy1=-dy1;
setcolor(GREEN); //öâåò øàðèêà
circle(x1,y1,r1);
setcolor(BLACK); //Øëåéô…åãî öûåò
circle(x2,y2,r2);
x2=x2+dx2;
y2=y2+dy2;
if (x2<=50 || x2+r2>=maxx) dx2=-dx2;
if (y2<=50 || y2+r2>=maxy) dy2=-dy2;
setcolor(YELLOW); //öâåò øàðèêà
circle(x2,y2,r2);
if (sqrt(fabs(x2-x1)*(fabs(x2-x1))+(fabs(y2-y1))*(fabs(y2-y1)))<=(r1+r2))
{
dx1=-dx1;
dx2=-dx2;
dy1=-dy1;
dy2=-dy2;
}
long t=clock();
if (x2%3==0) while(clock()==t);
if (x1%3==0) while(clock()==t);
// if (y1%3==0) while(clock()==t);
}
getch();
closegraph();
}
Вот в это дело нужно вставить…ОТСКОК…ШАРИКОВ ДРУГ ОТ ДРУГА…
Последние комментарии
- OlegL, 17 декабря 2023 года в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
э-э-э а в чём проблема? есть закон сохранения импульса, есть закон сохранения энергии. если считаем что столкновение абсолютно упругое, то надо просто решить систему из четырёх уравнений. может быть если в учебнике физики порыться то даже конкретную формулу можно найти.
хотя… короче:
v1*m1 + v2*m2 = v1\′*m1 + v2\′*m2 — закон сохранения импульса
v1^2*m1/2 + v2^2*m2/2 = v1\′^2*m1/2 + v2\′^2*m2/2 — закон сохранения энергии
v1, v2 — скорости шариков до
v1\′, v2\′ — скорости после;
через эти уя можно найти v1\′ и v2\′, правда только величину — не направления
а направления… по-моему стоит просто рассмотреть первое уравнение как векторное, и всё будет сосчитаться. Т е
v1_x * m1 + v2_x * m2 = v1\′_x * m1 + v2\′_x * m1
v1_y * m1 + v2_y * m2 = v1\′_y * m1 + v1\′_y * m2
ну конечно тут проблемы с тем что время дискретное могут возникнуть… но если тик достаточно мал то ничего сильно антифизического не будет.
PS. turboC, egavga.bgi — детство моё :))
Это все, конечно, хорошо и правильно, но из одних законов сохранения ты взаимодействия не вытащишь. Твои уравнения имеют тривиальное решение
v1 = v1\′
v2 = v2\′
т.е. шарики пролетают друг сквозь друга. Это, явно, не то решение, которое нас интересует, n’est pas? :-)
Good Luck,
UT
блин точно, есть тривиальное решение… Мозг сегодня уже не варит, физику с теормехом я успешно забыл :(. может надо просто отвергнуть это решение, и поискать другое?
А! вспомнил один факт: после абс. упругого столкновения шарики разлетятся под углом в pi/2. то есть v1\′ * v2\′ == v1\′_x * v2\′_x + v1\′_y * v2\′_y == 0
эхх..
вообще-то, если по физике, то надо перейти в систему с суммарным нулевым импульсом и считать отскок в ней.
фактически, если расположить сию картинку (преобразованием поворота) так, чтобы линия, соединяющая центры шаров в момент соударения, была параллельна OY, то тогда горизонтальная скорость (||OX) шаров сохранится, а вертикальная (||OY) — поменяет свой знак.
обратный поворот и преобразование в реальную систему даст реальную картину.
ps: чем-то мне это надпомнило «сколько форумчан надо, чтобы заменить 1 лампочку?»….
в общем, физику учить надо заново…
Ну вот, например, модель, которую я использовал в одном своем проекте. Пусть для простоты массы шариков одинаковы.
v1 — вектор скорости первого шарика
v2 — вектор скорости второго
d12 — вектор, соединяющий центры (позиции) шариков от первого ко второму.
Пусть также Proj_d(V) будет ортогональная проекция вектора V на вектор d (ее просто посчитать).
Тогда после столкновения
v1\′ = v1 — Proj_d12(v1) + Proj_d12(v2)
v2\′ = v2 — Proj_d21(v2) + Proj_d21(v1)
(отнимаем свое, прибавляем чужое)
Эта схема не идеальна, но очень устойчива и реалистична. Неидеальность происходит из того факта, что написана она была для очень конкретной модели, где каждый «шарик» высчитывает свой импульс и позицию самостоятельно, и все они делают это одной и той же функцией.
Good Luck,
UT
Это я и сам понял..что по закону сохранения импулься а на си написать не могу..помоги встроить…в код который там написан…Я думаю тебе это не займент сильно много времени….ПОЖАЛУЙСТА…
Нет.
>>ps: чем-то мне это надпомнило «сколько форумчан надо, чтобы заменить 1 лампочку?»….>>
Один, неленивый второкур:)… ради интереса посчитал.
v1\′ = (m2 / (m1 + m2)) * (v1 — v2) — 2 * (v1cr) + (m1 * v1 + m2 * v2) / (m1 + m2)
v1cr = (m2 / (m1 + m2)) * (v1 — v2) # (r2 — r1) * (r2 — r1) / (r2 — r1) ^ 2;
v1, v2, r1, r2 — векторы — скорость и радиусвект первого и второго непосредственно перед ударом. # — скалярное умножение.
Если заменить везде 1 на 2 то получишь скорость второго шарика после отскока..
UPD: О да! я прочитал это награмождение и оно отахало мне мозг…, незнаю как здесь красивше написать ==)