Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2012, 11:58   #1
tmr
Пользователь
 
Регистрация: 05.03.2012
Сообщений: 11
По умолчанию Не понимаю как постоить график

В универе дали задание.Составить программу, иллюстрирующую полет баллистической ракеты в зависимости от начальной скорости и начального направления вектора скорости (угла тангажа). Участок разгона ракеты и сопротивление атмосферы не учитывать.
Я обращался за помощью по поводу формул вычисления, с ними разобрался все работает. Но теперь встал вопрос как построить график движения баллистической ракеты. Вообще не понимаю как строить график. Объясните пожалуйста
Код:
function gradtorad(gr:real): real;
begin
  result:= gr*pi/180
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
const
 g = 9.80665;
 var
 s,u1,s1,s2,h1,h2,a1,h,t:real;
begin
  u1 := StrToFloat(LabeledEdit1.Text);
  a1 := gradtorad(StrToFloat(LabeledEdit2.Text));
  memo1.lines.add(floattostr(a1));
  s := (sqr(u1)/g);
  s1:= (sin(2*a1));
  s2:= (S*s1);
  h:= (u1*u1)/(2*g);
  h1:= sqr(sin(a1));
  memo1.lines.add(floattostr(h));
  h2:= (h*h1);
  t:=2*u1*sin(a1)/g ;
 //memo1.lines.add(Inttostr(s));
 memo1.lines.add(floattostr(s2));
 memo1.lines.add(floattostr(h2));
 labeledEdit3.text:= FloatToStr(s2);
 labeledEdit4.text:= floatToStr(h2);
 labeledEdit5.text:= floatToStr(t);
end;

end.
tmr вне форума Ответить с цитированием
Старый 06.03.2012, 14:45   #2
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Думаю, компонент TChart в самый раз.
Вычисляете координату Х, находите высоту Н и передаете их в TChart, а уж он графики строит на любой вкус.
Программирую по необходимости
tsar_ вне форума Ответить с цитированием
Старый 06.03.2012, 16:24   #3
tmr
Пользователь
 
Регистрация: 05.03.2012
Сообщений: 11
По умолчанию

Спасибо, хотел использовать холст, но это вроде лучше. Только проблема в том, что не пойму как вычислить координату Х, а высота найдена((((
tmr вне форума Ответить с цитированием
Старый 06.03.2012, 18:06   #4
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Задача в вашей постановке одинакова что для баллистической ракеты на пассивном участке полета, что для брошенного под углом к горизонту камня (классической задачки механики). Траектория - парабола, в параметрическом виде выглядит так:
Н= Нo+Vo*t*sin(альфа)-g*t^2/2;
X= Xo+Vo*t*cos(альфа);

А вообще посмотрите здесь.
Программирую по необходимости
tsar_ вне форума Ответить с цитированием
Старый 07.03.2012, 11:43   #5
tmr
Пользователь
 
Регистрация: 05.03.2012
Сообщений: 11
По умолчанию

Спасибо tsar_! А нет примера похожего? Пробовал делать не получается
Код:
Var x:Integer; 

function gradtorad(gr:real): real;
begin
  result:= gr*pi/180
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
const
 g = 9.80665;
 var
 s,u1,s1,s2,h1,h2,a1,h,t,Hk,Xk:real;
 y:integer;
begin
  u1 := StrToFloat(LabeledEdit1.Text);
  a1 := gradtorad(StrToFloat(LabeledEdit2.Text));
  memo1.lines.add(floattostr(a1));
  s := (sqr(u1)/g);
  s1:= (sin(2*a1));
  s2:= (S*s1);
  h:= (u1*u1)/(2*g);
  h1:= sqr(sin(a1));
  memo1.lines.add(floattostr(h));
  h2:= (h*h1);
  t:=2*u1*sin(a1)/g ;
 //memo1.lines.add(Inttostr(s));
 memo1.lines.add(floattostr(s2));
 memo1.lines.add(floattostr(h2));
 labeledEdit3.text:= FloatToStr(s2);
 labeledEdit4.text:= floatToStr(h2);
 labeledEdit5.text:= floatToStr(t);

   begin
      PaintBox1.Canvas.Brush.Color:=clWhite;
      PaintBox1.Canvas.FillRect(ClientRect);
       begin
            y:=Round (u1*t*cos(a1));
            x:=Round  (h2+u1*t*sin(a1)-g*t*t/2);
            PaintBox1.Canvas.Pixels[x,y]:=clBlack; // íàðèñîâàòü ÷åðíóþ òî÷êó
         end;
      end;
   end;


end.
Сам принцип построения не могу понять(

Последний раз редактировалось tmr; 07.03.2012 в 14:39.
tmr вне форума Ответить с цитированием
Старый 07.03.2012, 13:06   #6
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

И все же решили на канву выводить...

Ну, принцип примерно такой:
1) Вычислить конечное время t, при котором высота Н равна 0 (т.е. ракета встречается с землей - дальше ведь считать бессмысленно) из уравнения Н(t) (я надеюсь, вы сможете квадратное уравнение решить?);
2) Задаться количеством интервалов n, вычислить временной шаг dt=t/n; чем больше n, тем ессно точнее;
3) Организовать ЦИКЛ (удобно for ... do), в котором на каждом интервале вычислять H(t) и Х(t), и рядом лежащие точки соединять отрезками прямых.

З.Ы. А если TChart использовать, то, конечно, достаточно ему передавать в цикле пары (аргумент, значение).
Программирую по необходимости

Последний раз редактировалось tsar_; 07.03.2012 в 13:08.
tsar_ вне форума Ответить с цитированием
Старый 07.03.2012, 14:58   #7
tmr
Пользователь
 
Регистрация: 05.03.2012
Сообщений: 11
По умолчанию

tsar_ пробовал и TChart, тож не получилось(.
1) Время конечное в принципе у меня вычисляется
Код:
t:=2*u1*sin(a1)/g
время полного полета.
2) мне задавать интервал самому
Код:
(n:=200;)
или рандом?
3)Не могли ли Вы написать цикл?

P.S. Достал наверно уже Вас((
tmr вне форума Ответить с цитированием
Старый 07.03.2012, 15:34   #8
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Код:
procedure Draw;
var  V0, Vx, Vy1, Vy2, X, Y, Alfa, t, Dt : Real;
begin
   Readln(V0); Readln(Alfa);
   t := 0; Dt := 0,001; X := 0; Y := 0;
   Vx := V0*cos(Alfa); Vy1 := Vo*sin(Alfa);
   Canvas.Moveto(round(X),round(Y));
   repeat
      Vy2 := Vy1  - 9.8*dt;
      Y := Y + dt*(Vy1 + Vy2)/2;
      X := X + Vx*dt;
      Vy1 := Vy2;
      Canvas.Lineto(Round(X), Round(Y));
      T := T + dt;  
   until Y<=0;
end;
примерно так должно работать.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 07.03.2012, 16:07   #9
tsar_
Форумчанин
 
Аватар для tsar_
 
Регистрация: 06.01.2011
Сообщений: 369
По умолчанию

Вот, смастерил на скорую руку минимум для TChart:
Код:
procedure TForm1.Button1Click(Sender: TObject);
const g=9.81;
var H,X,H0,X0,V0,tk,dt,alpha: extended;
    n,i: integer;
begin
  Chart1.Series[0].Clear;

  n:=100;   //сами зададите
  H0:=10;
  X0:=0;
  V0:=5;
  alpha:=1; //~57.3 градусa в радианах

  tk:=V0/g*sin(alpha)+sqrt(sqr(V0/g*sin(alpha))+2*H0/g); //конечное время из H(t)

  dt:=tk/n;

  for i:=0 to n do
    begin
    H:=H0+V0*(i*dt)*sin(alpha)-g*sqr(i*dt)/2;
    X:=X0+V0*(i*dt)*cos(alpha);
    Chart1.Series[0].AddXY(X,H);
    end;

end;
Вложения
Тип файла: rar Example.rar (224.7 Кб, 9 просмотров)
Программирую по необходимости

Последний раз редактировалось tsar_; 07.03.2012 в 16:09.
tsar_ вне форума Ответить с цитированием
Старый 11.03.2012, 11:34   #10
tmr
Пользователь
 
Регистрация: 05.03.2012
Сообщений: 11
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
Код:
procedure Draw;
var  V0, Vx, Vy1, Vy2, X, Y, Alfa, t, Dt : Real;
begin
   Readln(V0); Readln(Alfa);
   t := 0; Dt := 0,001; X := 0; Y := 0;
   Vx := V0*cos(Alfa); Vy1 := Vo*sin(Alfa);
   Canvas.Moveto(round(X),round(Y));
   repeat
      Vy2 := Vy1  - 9.8*dt;
      Y := Y + dt*(Vy1 + Vy2)/2;
      X := X + Vx*dt;
      Vy1 := Vy2;
      Canvas.Lineto(Round(X), Round(Y));
      T := T + dt;  
   until Y<=0;
end;
примерно так должно работать.
Спасибо, работает, но только когда я ставлю угол тангажа(Альфа) 45 градусов(с остальными числами не чертит). И график чертится наверху,а не снизу:
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
var  V0, Vx, Vy1, Vy2, X, Y, Alfa, t, dt : Real;
begin
  V0 := StrToFloat(LabeledEdit1.Text);
  Alfa := StrToFloat(LabeledEdit2.Text);
   //Readln(V0); Readln(Alfa);
   t:= 0;
   dt:= 0.001;
   X:= 0;
   Y:= 0;                     //V0*cos(Alfa)
   Vx:= V0*cos(Alfa);
   Vy1:= V0*sin(Alfa);
   Canvas.Moveto(round(X),round(Y));
   repeat
      Vy2 := Vy1  - 9.8*dt;
      Y := Y + dt*(Vy1 + Vy2)/2;
      X := X + Vx*dt;
      Vy1 := Vy2;
      Canvas.Lineto(Round(x), Round(y));
      T := T + dt;  
   until Y<=0;
end;
//end;

end.
Изображения
Тип файла: jpg Снимок.JPG (31.8 Кб, 109 просмотров)
tmr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ребят завтра пара я незнаю как сделать схему, не понимаю как( Andrusha07 Помощь студентам 5 26.01.2012 00:12
По изолиниям постоить 3D поверхность (интерполяция) (C#) HURRICANE Помощь студентам 3 01.06.2010 20:51
По изолиниям постоить 3D поверхность (интерполяция) HURRICANE Общие вопросы .NET 0 31.05.2010 16:07
Постоить график функций: Паскаль Deis Помощь студентам 5 19.01.2009 09:41