
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.3] |
![]() |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Ну вот в принципе она. Вот как бы добавить сетку оцифрованную для строяшегося графика?
![]() ![]() {$N+} Uses Graph,Crt; Type type_mayat=record {tip mayatnika} DlinaNiti:real; MassaNiti:real; MassaSharika:real; RadiusSharika:real; a_begin,a_new,a_old:real; J,w0:real; end; Var p_menu:pointer; Var T, curr_t: Integer; main_mayat:type_mayat; {Maytnik} dT,fT,g,b:real;{Shag po vremeni, Polnoe vremya, g, koef triniya} tmp_1:integer; {svobodnie peremennie} tmp_2,tmp_3,tmp_4,tmp_5:real;{svobodnie peremennie} Key:char; graphtmp2,graphtmp3:integer; {graficheskie peremenie} Procedure GraphOn; {vklyuchenie graphiki} Var Gd,Gm,ErrorCode:integer; Begin Gd:=detect; initgraph(Gd,Gm,'d:\pascal\bgi'); ErrorCode:=GraphResult; if ErrorCode <> grOk then begin WriteLn('oshibka:'); WriteLn(GraphErrorMsg(ErrorCode)); Halt(1); end; End; Procedure GraphOff;{Otklu4enie graphiki} Begin CloseGraph; End; Procedure mayatnik(DlinaNiti_:integer; MassaNiti_,MassaSharika_,RadiusSharika_,a_begin_:real); Begin with main_mayat do begin DlinaNiti:=DlinaNiti_; MassaNiti:=MassaNiti_; MassaSharika:=MassaSharika_; RadiusSharika:=RadiusSharika_; a_begin:=a_begin_; a_new:=a_begin_; J:=(1/3)*MassaNiti*sqr(DlinaNiti)+MassaSharika*(2/5*sqr(RadiusSharika)+ sqr(DlinaNiti)); w0:=sqrt(g*(MassaSharika*DlinaNiti+MassaNiti*DlinaNiti/2)/J); {vi4islenie sobstvennoi 4astoti} end; End; Procedure dvizh_mayat; {phizika mayatnika} Var costmp:double; Begin with main_mayat do begin a_old:=a_new; a_new:=a_begin*cos(w0*fT);{novii ugol mayatnika} if a_begin>0 then begin costmp:=cos(a_begin)+(b*DlinaNiti*sqr(a_new-a_old))/(dT*MassaSharika*g); {vi4islenie novogo cos ugla amplitudi} if (costmp<>0) then a_begin:=arctan(sqrt(1-sqr(costmp))/costmp); {vi4islenie novoi amplitudi} end else a_begin:=0; fT:=fT+dT; end; End; Procedure ris_mayat; {risovanie mayatnika} Var xNow,yNow:real; Begin with main_mayat do begin xNow:=graphtmp2+DlinaNiti*cos(a_new-pi/2); yNow:=21-DlinaNiti*sin(a_new-pi/2); setfillstyle(0,0); bar(graphtmp2-round(DlinaNiti+RadiusSharika),21, graphtmp2+round(DlinaNiti+RadiusSharika),21+round(DlinaNiti+RadiusSharika)); setcolor(7); setlinestyle(0,0,3); line(graphtmp2,21,round(xNow),round(yNow)); setlinestyle(0,0,1); setcolor(1); setfillstyle(1,1); fillellipse(round(xNow),round(yNow), round(RadiusSharika),round(RadiusSharika)); end; End; Begin GraphOFF; writeln('vvedite dlinu niti (recom. 250)'); readln(tmp_1); writeln('vvedite massu niti (recom. 20)'); readln(tmp_2); writeln('vvedite massu sharika (recom. 30)'); readln(tmp_3); writeln('vvedite radis sharika (recom. 15)'); readln(tmp_4); writeln('vvedite ugol otklonenia (recom. 0.5)'); readln(tmp_5); writeln('vvedite shag po vremeni (recom. 0.1)'); readln(dT); GraphOn; b:=0.1; fT:=0; Key:=#0; g:=9.8; GraphOn; graphtmp2:=round(getmaxx/2); graphtmp3:=round(getmaxx/3); cleardevice; mayatnik(tmp_1,tmp_2,tmp_3,tmp_4,tmp_5); setcolor(15); setfillstyle(3,15); bar(graphtmp3,0,2*graphtmp3,20); line(graphtmp3,20,2*graphtmp3,20); repeat if(main_mayat.a_begin<>0)then begin dvizh_mayat; ris_mayat; delay(500); inc(T); if T = 5 then begin T := 0; inc(curr_t); putpixel(curr_t, (getmaxy - 240) + trunc(180 * cos(main_mayat.a_new)), white ); end; end; if keypressed then key:=readkey; until (key=#27); GraphOff; End. |
![]() |
Сообщ.
#17
,
|
|
Arslan, вот так, например (см. аттач)
Кроме этого (для удобства использования твоей программы) я бы тебе посоветовал сделать еще кое-что... Напиши маленькую функцию, которая будет запрашивать у пользователя число, и заносить его в переменную, но если он сразу нажмет Enter - то значение переменной не изменится... А сами tmp_1, tmp_2, ... опиши не как переменные, а как типизированные константы, и задай им некоторое значение по умолчанию... Прикреплённый файл ![]() |
Сообщ.
#18
,
|
|
|
Спасибо volvo877. Я попытаюсь сделать так как ты сказал. Но по ходу могут возникнуть проблемы. Преподователь требует, чтобы на середине нити был якобы забитый гвоздь и когда нить доходит до "гвоздя", то траектория движения шарика естественно меняется относительно гвоздя... Вот это буде самым проблематичным вопросом в программе
|