На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> построение графиков
    Вообщем скоро защита моего проекта - «моделирование физического маятника», но у меня с ней проблемы. Сама модель маятника у меня работает, но я не знаю как сделать так что бы внизу модели выводились разные графики зависимости (например: зависимость угла отклонения от времени,; я точно не знаю какие еще можно графики построить, т.к. мало в этом соображаю :wall: ). Как минимум нужно два графика. Если не сложно помогите пожалуйста… :rolleyes:

    Вот сам маятник…
    ExpandedWrap disabled
      {$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;
         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,'');
           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);
            setcolor(15);
            setfillstyle(3,15);
            bar(graphtmp3,0,2*graphtmp3,20);
            line(graphtmp3,20,2*graphtmp3,20);
            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);
          repeat
              if(main_mayat.a_begin<>0)then
              begin
                dvizh_mayat;
                ris_mayat;
                delay(500);
              end;
               if keypressed then key:=readkey;
           until (key=#27);
          GraphOff;
      End.


    зарание благодарю...
      Цитата Guest @
      но я не знаю как сделать так что бы внизу модели выводились разные графики зависимости (например: зависимость угла отклонения от времени,; я точно не знаю какие еще можно графики построить, т.к. мало в этом соображаю
      Ты покажи формулы этих зависимостей, а мы тебе подскажем как строить графики для них. С ними, как раз, проблем не должно быть.

      Кстати,
      ExpandedWrap disabled
             graphtmp2:=round(getmaxx/2);
             graphtmp3:=round(getmaxx/3);
      можно заменить на
      ExpandedWrap disabled
             graphtmp2 := GetMaxX div 2;
             graphtmp3 := GetMaxX div 3;
      т.к. div выполняет целочисленное деление. ;)
        Цитата Romtek @
        Цитата Guest @
        но я не знаю как сделать так что бы внизу модели выводились разные графики зависимости (например: зависимость угла отклонения от времени,; я точно не знаю какие еще можно графики построить, т.к. мало в этом соображаю
        Ты покажи формулы этих зависимостей, а мы тебе подскажем как строить графики для них. С ними, как раз, проблем не должно быть.

        какие формулы зависимостей? на сколько я поняла графики строятся путем перевода значения физической величины значению экранной координаты....по общей формуле:
        x=x0+(x1-x0)/(i1-i0)*(i-i0)
        y=y0+(y1-y0)/(j1-j0)*(j-j0)
        но я сама точно не знаю :unsure: :'(
          Цитата Guest @
          зависимость угла отклонения от времени

          можно попробовать вывести вот так:
          ExpandedWrap disabled
                 { это для красоты... }
                 setcolor(white);
                 rectangle(10, getmaxy-100, getmaxx-10, getmaxy-10);
                 T := 0; curr_t := 10;
             
                { измени свой Repeat ... Until на этот: }
                repeat
                    if(main_mayat.a_begin<>0)then
                    begin
                      dvizh_mayat;
                      ris_mayat;
                      delay(500);
             
                      inc(T); if T = 10 then begin
                        T := 0; inc(curr_t);
                        putpixel(curr_t,
                          (getmaxy - 240) + trunc(180 * cos(main_mayat.a_new)),
                          red );
                      end;
             
                    end;
                     if keypressed then key:=readkey;
                 until (key=#27);

          Ну, и естественно, объяви
          ExpandedWrap disabled
            Var T, curr_t: Integer;

          Можно и со вторым что-нибудь придумать...

          Добавлено:
          Еще кое-что... В процедуре ris_mayat у тебя постоянно перерисовывается кусок потолка.
          ExpandedWrap disabled
                  setcolor(15);
                  setfillstyle(3,15);
                  bar(graphtmp3,0,2*graphtmp3,20);
                  line(graphtmp3,20,2*graphtmp3,20);

          По-моему, это - лишнее. Эту часть можно смело перенести в основную программу и поставить сразу после вызова процедуры mayatnik:
          ExpandedWrap disabled
                 cleardevice;
                 mayatnik(tmp_1,tmp_2,tmp_3,tmp_4,tmp_5);
                 { Вот сюда }
            спасибо за график :D
            Цитата
            Можно и со вторым что-нибудь придумать...

            я думала сделать график зависимости периода от времни, но по-моему так не получится.....
            а еще подскажите пожалуйста воообще какие еще можно графики зависимости сделать :unsure:
              Цитата Guest @
              а еще подскажите пожалуйста воообще какие еще можно графики зависимости сделать

              Например, зависимость пройденного маятником расстояния от времени.
                Цитата Romtek @
                Цитата Guest @
                а еще подскажите пожалуйста воообще какие еще можно графики зависимости сделать

                Например, зависимость пройденного маятником расстояния от времени.

                и как это сделать :blink: :wacko:
                  Цитата Guest @
                  и как это сделать
                  Ну выведи формулу: как ты без неё собираешься график строить?
                    формулу расстояния я не смогла вывести...т.к. ничего похожего не нашла....
                    я хочу все таки сделать график зависимости периода от времени...
                    формулу периода я знаю... T=2*pi*sqrt(J/m*g*l), но это формула без учета радиуса шарика и массы нити....И я не знаю как её записать правильно....
                    J(- момент инерции) уже выражен через массу шарика, массу нити, длину нити и радиуса шарика...это есть в самом начале моей проги...

                    подскажите как правильно записать эту формулу?

                    пожалуйста помогите, просто о-о-очень срочно надо(завтра уже защита самого проекта :( )
                      ИМХО теме пора в смехогрех.
                        Цитата Pourtous @
                        ИМХО теме пора в смехогрех.
                        Я так не думаю. Помочь можно.

                        Цитата Guest @
                        формулу расстояния я не смогла вывести...т.к. ничего похожего не нашла....
                        я хочу все таки сделать график зависимости периода от времени...
                        формулу периода я знаю... T=2*pi*sqrt(J/m*g*l), но это формула без учета радиуса шарика и массы нити....И я не знаю как её записать правильно....
                        J(- момент инерции) уже выражен через массу шарика, массу нити, длину нити и радиуса шарика...это есть в самом начале моей проги...

                        подскажите как правильно записать эту формулу?
                        Задай этот вопрос в разделе "Алгоритмы". Как только выяснишь формулу, построить график не проблема. ;)
                          volvo877 можешь пожалуйста обьяснить построение графика зависимости угла отклонения от времени :unsure:
                            А в нем как раз ничего сложного нет - все необходимые данные берутся из структуры main_mayat после пересчета маятника, и то не после каждого, а после кратного 10... Смотри:
                            ExpandedWrap disabled
                              inc(T); if T = 10 then begin { только при каждом 10-м пересчете }
                              T := 0; inc(curr_t);  { увеличиваем координату X }
                              { и далее выводим точку: }
                               
                              { с новой координатой по оси времени (ось ОХ) }
                              putpixel(curr_t,
                               
                              { по оси OY - значение cos угла маятника }
                                (getmaxy - 240) + trunc(180 * cos(main_mayat.a_new)),
                               
                              { точка выводится красным цветом }
                                red );


                            Коэффициент 180 при косинусе угла подбирался экспериментально (так же как и 240), чтобы график находился там, где он находится сейчас... Измени 240 на другое число - и график будет отображаться выше или ниже, 180 влияет на амплитуду графика...
                              Вот мне сдавать этот проект в мае насчет маятника! Спасибо вам огромное за советы. А вот когда график рисуется как сделать оцифрованную сетку (т.е. декартовую с-у координат), чтобы можно было смотреть на график и видеть через скока времени какая частота будет... помогите пожалуйста, а то у меня не выходит что-то
                                Присоедини-ка сюда полную свою программу, чтобы не делать двойную работу...

                                Возможно ты что-то добавлял к тому что есть здесь, или убирал...
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0514 ]   [ 15 queries used ]   [ Generated: 28.05.24, 21:11 GMT ]