nixp.ru v3.0

24 января 2017,
вторник,
16:07:54 MSK

Аутсорсинг Linux с компанией «Флант»
anonymous написал 10 декабря 2005 года в 15:19 (624 просмотра) Ведет себя неопределенно; открыл 1814 темы в форуме, оставил 5575 комментариев на сайте.

Люди помогите написать отскок шариков….Друг от друга….

Очень нужно…Желательно..чтобы был построен по законам физики…

Вот прога…:

#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); //&#246;&#226;&#229;&#242; &#248;&#224;&#240;&#232;&#234;&#224;

circle(x1,y1,r1);

setcolor(BLACK); //&#216;&#235;&#229;&#233;&#244;…&#229;&#227;&#238; &#246;&#251;&#229;&#242;

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); //&#246;&#226;&#229;&#242; &#248;&#224;&#240;&#232;&#234;&#224;

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();

}

Вот в это дело нужно вставить…ОТСКОК…ШАРИКОВ ДРУГ ОТ ДРУГА…

rgo

э-э-э а в чём проблема? есть закон сохранения импульса, есть закон сохранения энергии. если считаем что столкновение абсолютно упругое, то надо просто решить систему из четырёх уравнений. может быть если в учебнике физики порыться то даже конкретную формулу можно найти.

хотя… короче:

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 — детство моё :))

Uncle Theodore
rgo
э-э-э а в чём проблема? есть закон сохранения импульса, есть закон сохранения энергии. если считаем что столкновение абсолютно упругое, то надо просто решить систему из четырёх уравнений. может быть если в учебнике физики порыться то даже конкретную формулу можно найти.

хотя… короче:

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 = v1\′

v2 = v2\′

т.е. шарики пролетают друг сквозь друга. Это, явно, не то решение, которое нас интересует, n’est pas? :-)

Good Luck,

UT

rgo

блин точно, есть тривиальное решение… Мозг сегодня уже не варит, физику с теормехом я успешно забыл :(. может надо просто отвергнуть это решение, и поискать другое?

А! вспомнил один факт: после абс. упругого столкновения шарики разлетятся под углом в pi/2. то есть v1\′ * v2\′ == v1\′_x * v2\′_x + v1\′_y * v2\′_y == 0

Genie

эхх..

вообще-то, если по физике, то надо перейти в систему с суммарным нулевым импульсом и считать отскок в ней.

фактически, если расположить сию картинку (преобразованием поворота) так, чтобы линия, соединяющая центры шаров в момент соударения, была параллельна OY, то тогда горизонтальная скорость (||OX) шаров сохранится, а вертикальная (||OY) — поменяет свой знак.

обратный поворот и преобразование в реальную систему даст реальную картину.

ps: чем-то мне это надпомнило «сколько форумчан надо, чтобы заменить 1 лампочку?»….

в общем, физику учить надо заново…

Uncle Theodore

Ну вот, например, модель, которую я использовал в одном своем проекте. Пусть для простоты массы шариков одинаковы.

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

anonymous

Это я и сам понял..что по закону сохранения импулься а на си написать не могу..помоги встроить…в код который там написан…Я думаю тебе это не займент сильно много времени….ПОЖАЛУЙСТА…

myst

Нет.

>>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: О да! я прочитал это награмождение и оно отахало мне мозг…, незнаю как здесь красивше написать ==)

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.