Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача про движение в пространстве
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
CHELovek
Есть такое задание:

’’Составить укрупненный алгоритм и программу на языке высокого уровня для решения задачи по своему варианту. Язык программирования TPascal.
В текстовом файле имеются данные для N воздушных целей, определенных станцией слежения в момент времени T0
alpha(i)-направление движения, V гор(i) - гор. скорость, V вер(i) - верт. скорость, phy(i) - азимут, H(i) - высота,L(i) - расстояние до цели (гориз.)
(число целей заранее не известно)
Параметры движения постоянны. Составить программу для расчета траектории движения целей и определения величин, указанных в таблице для своего варианта.
Программа должна визуализировать начальное положение целей и траекторию их движения, а также основные показатели целей, включая расчетные значения по своему варианту’’

Составил я прогу, которая задает цели и их параметры. Другая прога рисует еллипс (типа радар) рисует цели (пользовался полярными координатами)... но стопор состоит в том, что не могу их заставить двигаться =0)

Вот то, что я намонстрячил:
1. Задаю количество целей и их параметры
Код

program zadanie_znacheniy;

 var
   kc, counter: integer;
   alpha, vgor, vver, phy, h, l: word;
   kcfile: text;
   znfile: text;

 begin
   randomize;
   writeln('Vvedite kolichestvo celey'); readln(kc);
   counter:=1;

   assign(kcfile, 'kc.dat');
   assign(znfile, 'zn.dat');

   rewrite(kcfile);
     writeln(kcfile, kc);
   close(kcfile);

   while counter<=kc do
     begin
       alpha:=random(361);
       vgor:=random(101);
       vver:=random(101);
       phy:=random(361);
       h:=random(501);
       l:=random(201);

       if counter=1 then
         begin
           rewrite(znfile);
           close(znfile);
         end;
       append(znfile);
         writeln(znfile,alpha,' ',vgor,' ',vver,' ',phy,' ',h,' ',l);
       close(znfile);

       counter:=counter+1;
     end;

 end.


2. А эта прога должна данные обработать... после строчки {PALEVO случился заворот мозгов :ypr:

Код

program obrabotka;

 uses CRT, Graph;

 var
   alpha, vgor, vver, phy, h, l: array [1..200] of word;
   napr, xg, yg, x, y, y1, y2, dx0, dy0, dx, dy: array [1..200] of integer;
   gd, gm, kc, co, c, t, tt, h0, rx, ry: integer;
   kcfile, znfile: text;
   vv, vg: array [1..200] of real;
   yr, xr: string;

const
   mn=0.4;
   nm=0.1;
 procedure znacheniya;
  begin
   co:=1;
   assign(kcfile, 'kc.dat');
   assign(znfile, 'zn.dat');
   reset(kcfile);
     read(kcfile,kc);
   close(kcfile);
   reset(znfile);

     while co<=kc do
       begin
         read(znfile,alpha[co],vgor[co],vver[co],phy[co],h[co],l[co]);
         vg[co]:=vgor[co]*nm;
         vv[co]:=vver[co]*nm;
         if alpha[co]>0   then if alpha[co]<90  then napr[co]:=1;
         if alpha[co]>90  then if alpha[co]<180 then napr[co]:=2;
         if alpha[co]>180 then if alpha[co]<270 then napr[co]:=3;
         if alpha[co]>270 then if alpha[co]<360 then napr[co]:=4;
         if alpha[co]=90  then napr[co]:=10;
         if alpha[co]=180 then napr[co]:=20;
         if alpha[co]=270 then napr[co]:=30;
         if alpha[co]=360 then napr[co]:=40;
         if alpha[co]=0   then napr[co]:=40;
         co:=co+1;
       end;

   close(znfile);
  end;

 begin
  znacheniya;
  h0:=h[1];
  gd:=detect;
  gm:=2;
  InitGraph(gd, gm, '.');
    setbkcolor(black);
    setcolor(7);
     ry:=getmaxy; rx:=getmaxx;
     ellipse(rx div 2, ry-(ry div 4), 0, 360 ,230 ,230 div 6);
    setcolor(6);
     line(rx div 2, ry-(ry div 3), rx div 2, ry-(ry div 6));
     line(0, ry-(ry div 4), rx, ry-(ry div 4));
     co:=1;
     while co<=kc do
       begin
         c:=9;

        if h[co]>=h[1] then
           begin

             if h[co]<h[1]+300 then
               begin
                 c:=9;
                 c:=c+5;
                 dx[co]:=round(l[co]*sin(phy[co]));
                 dy[co]:=round(l[co]*cos(phy[co]));
                 x[co]:=dx[co];
                 y[co]:=round(dy[co]/6);
                 xg[co]:=(rx div 2)+x[co];
                 y1[co]:=ry-(ry div 4)+y[co];
                 yg[co]:=y1[co]-round(mn*h[co]);
                 setcolor(2);
                 line(xg[co], y1[co], xg[co], yg[co]);

              end;

         end;

             dx0[co]:=round(l[co]*sin(phy[co]));
             dy0[co]:=round(l[co]*cos(phy[co]));
             x[co]:=dx0[co];
             y[co]:=round(dy0[co]/6);
             xg[co]:=(rx div 2)+x[co];
             y1[co]:=ry-(ry div 4)+y[co];
             yg[co]:=y1[co]-round(mn*h[co]);
         if co=1 then
           begin
             c:=11;
             dx0[co]:=round(l[co]*sin(phy[co]));
             dy0[co]:=round(l[co]*cos(phy[co]));
             x[co]:=dx0[co];
             y[co]:=round(dy0[co]/6);
             yg[co]:=y1[co]-round(mn*h[co]);
           end;

         putpixel(xg[co], yg[co], c);
         co:=co+1;
       end;

{PALEVO...
      while t<>120 do

        begin

          while co<=kc do
            begin
             if napr[co]=1 then
               begin
                dx[co]:=round(l[co]*sin(alpha[co])+vg[co]*t);
                dy[co]:=round(l[co]*cos(alpha[co])-vv[co]*t);
               end;
             if napr[co]=2 then
               begin
                dx[co]:=round(l[co]*sin(alpha[co])+vg[co]*t);
                dy[co]:=round(l[co]*cos(alpha[co])+vv[co]*t);
               end;
             if napr[co]=3 then
               begin
                dx[co]:=round(l[co]*sin(alpha[co])-vg[co]*t);
                dy[co]:=round(l[co]*cos(alpha[co])+vv[co]*t);
               end;
             if napr[co]=4 then
               begin
                dx[co]:=round(l[co]*sin(alpha[co])-vg[co]*t);
                dy[co]:=round(l[co]*cos(alpha[co])-vv[co]*t);
               end;
             if napr[co]=10 then
               begin
                dx[co]:=round(l[co]*sin(alpha[co])-vg[co]*t);
                dy[co]:=round(l[co]*cos(alpha[co])-vv[co]*t);
               end;
             if napr[co]=20 then
               begin
                dx[co]:=round(l[co]*sin(alpha[co])+vg[co]*t);
                dy[co]:=round(l[co]*cos(alpha[co])+vv[co]*t);
               end;
             if napr[co]=30 then
               begin
                dx[co]:=round(l[co]*sin(alpha[co])+vg[co]*t);
                dy[co]:=round(l[co]*cos(alpha[co])+vv[co]*t);
               end;
             if napr[co]=40 then
               begin
                dx[co]:=round(l[co]*sin(alpha[co])+vg[co]*t);
                dy[co]:=round(l[co]*cos(alpha[co])+vv[co]*t);
               end;
               xg[co]:=(rx div 2)+dx[co];
               y2[co]:=ry-(ry div 4)+round(dy[co]/6);
               yg[co]:=y2[co]-round(mn*h[co]);
              line(xg[co], y2[co], xg[co], yg[co]);
              putpixel(xg[co], yg[co], c);

              co:=co+1
            end;
            co:=1;

          t:=t+1
        end;
}
    repeat until keypressed;
  CloseGraph;
 end.
volvo
CHELovek
Есть несколько вопросов:
1. Зачем для задания координат целей пользоваться 2-мя файлами, если можно обойтись одним (может быть были какие-то дополнительные условия, но в том, что приведено не написано что файлов должно быть 2...)

2. Еще более неясно то, зачем для обработки данных помещать каждое из их в отдельный массив array [1..200] of word (то есть, направления хранятся отдельно, скорости отдельно, и т.д.) Не проще ли сделать что-то вроде записи для каждой цели:
Код
Type
 TTarget =
 Record
   alpha, vgor, vver, phy, h, l: Word;
   { Все остальные необходимые данные }
 End;
, организовать массив таких записей:
Код
Var arr: Array[1 .. 200] Of TTarget;
, и потом для обработки одной цели пользоваться данными, хранимыми в одной записи, а не разбросанными по десятку массивов?
CHELovek
volvo
Отвечаю:
1. В задании также не указано откуда берется файл с данными (может он уже будет заведомо создан). Поэтому мною было принято решение эмулировать задание параметров =0) Да и вообще каждый раз задавать новые значения, в сыром варианте, неудобно... Параметры задаются rnd... И поэтому каждый раз будет рисоваться точка со своими параметрами... Но это вообще не важно =0) Это дело творческое =0))

2. Да, ты прав, эта моя "недоразвитость" в Паскале, действует мне на нервы тоже =0) Я еще только начинаю программировать =0) И то что я написал мне тоже кажется монстром =0) Кстати, спасибо за совет =0)
CHELovek
Но вопрос все еще не закрыт...
Попробую конкретнее:
Вот здеся
Код

                dx[co]:=round(l[co]*sin(phy[co]));
                dy[co]:=round(l[co]*cos(phy[co]));

вычисляются x и y в полярной системе координат...
Далее мне нужноначать двигать точку... равномерно прямолинейно
по закону x=x0+v*t учитывая при этом направление (alpha(i))...
Т.е., как я понимаю, я должен перенести начало отсчета в точку, которая у меня получилась, и от нее плясать дальше...
А вот как ето сделать?....

(а здеся как-нить картинки можно вставлять? я бы изобразил =0))
CHELovek
FAQ прочитал, сохранил =0)
но ответа не нашел =0)
volvo
CHELovek
Цитата
Поэтому мною было принято решение эмулировать задание параметров
Прекрасно, но почему по сложному пути? Создавай один файл, в котором будет храниться все вместе (например, одна строка - одна цель)...
Цитата
картинки можно вставлять?
Можно. Нажимай на кнопку "Ответить" (то есть надо отвечать не с помощью быстрого ответа), и там увидишь "Присоединить файл". Но я попытаюсь без картинки тебе рассказать.

Зачем тебе пересчитывать значения прямо в полярной системе координат? Гораздо проще было бы сделать одну функцию, которая переводит координаты из полярной в декартовы, а вторую, которая делает наоборот (из декартовой в полярные). А само изменение координат при прямолинейном и равномерном движении (в декартовой системе) я думаю проблем не вызовет...
CHELovek
Oki =0)
Еще помонстрячу и пооптимизирую =0)
Если не получиться, буду уже спрашивать еще =0)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.