Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ задачи на графику

Автор: aygul 21.02.2006 3:11

Помогите пожалуйста! надо составить програмки!!!тема-полет тела брошенного к горизонту!!!!
1)составить программку, на которойи было бы: в левом углу торчит пушка, нарисована горизонтальная линия(на этой линии пушка как раз и стоит). Из ствола пушки летит точка(или снаряд,или снежинка или что-нибудь подобное!)и падает на линию пролетев какое-то определённое расстояние, и на экране должна быть видна траетория движения снаряда!!!
2)составить программку, на которойи было бы: в левом углу торчит пушка, нарисована горизонтальная линия(на этой линии пушка как раз и стоит). Из ствола пушки летит точка(или снаряд,или снежинка или что-нибудь подобное!) и должна попасть в цель(цель в виде или прямоугольника или дома или машины или чего-либо другого) которая находится на некотором расстоянии от пушки!!!надо подобрать для этого правильные значения!!!При попадании снаряда в целя, цель должна всячески сигнализировать об этом(мигать, должны быть волны какие-нибудь около цели, и чтобы компьютер пищал!!!)
3)Создать игру-дуэль двух пушек(на двоих) условия те же что и в пердыдущих прогах!!!
4)lпри каком угле самая боьшая дальность полета?почему???
При составлении программ надо использовать:

Код
g=9.8
v(x)=v(nacalnaya)*cosb { косинус угла b=cosb}
v(y)=v(nacalnaya)*sinb {синус угла b=sinb}
a(t)=-g
v(t)=-g*t+constanta
при t=(0) следует что v(0)=v(nacalnaya)
Constanta=v(nacalnaya)
v(t)=v(nacalnaya)-g*t
s(t)=v(nacalnaya)*t-(g*t*t)/2 + constanta
s(0)=0 значит constanta=s(0)=0
s(t)=v(nacalnaya)*t-(g*t*t)/2
при t=0 следуетv(0)=v(nacalnaya)
Составим систему уравнений:
y=v(nacalnaya)*sinb*t-(g*t*t)/2
x=v(nacalnaya)*cosb*t

В некоторой точке B (посередине траетории0, где тело находится на самой большой высоте и после этого начинает падать) V(y)=0, вычислим t, значит t=(2*v(nacalnaya))/g.
Подставим это значение t в формулу x=v(nacalnaya)*cosb*t , значитx=(2*v(nacalnaya)*v(nacalnaya)*cosb)/g
также надо использовать в проге: X:=round(x) и while t<=(2*v(nacalnaya))/g do
нЕ забудьте градусы углов перевести в радианы!!!

Автор: Ozzя 21.02.2006 13:33

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

Код
program polet;
uses
  crt,graph;
var
  mashtab_x,mashtab_y,t_dv,s,y_max,H,L,Vx,Vy,v0,alfa,m,V:real;
  i,grDriver,grMode,x,y:integer;
  text,text2:string;
const
  K=10;
  g=9.81;
  dT=0.001;

procedure paint(x,y,color:integer); {Рисование тела}
begin
  setcolor(color);
  circle(x,y,2);
end;

procedure razmetka; {Разметка экpана}
var
  i,j:integer;
  text:string;
begin
  setcolor(15); {Установка цвета(белового)}
  line(0,getmaxy,getmaxx,getmaxy);
  line(0,getmaxy,0,0);
  i:=0;
  while i<=round(GetMaxX/mashtab_x) do
    begin
      inc(j);
      line(i,getmaxy,i,475);
      moveto(i-10,465);
      if odd(j) then
        begin
          str(round((i/mashtab_x)),text);
          OutText(text);
        end;
      inc(i,round(100*mashtab_x));
     end;
   i:=0;
   j:=0;
   while i<=round(GetMaxY/mashtab_y) do
     begin
       inc(j);
       line(0,getmaxy-i,5,getmaxy-i);
       moveto(10,getmaxy-i-3);
       if odd(j) then
         begin
           str(round((i/mashtab_y)),text);
           OutText(text);
         end;
       inc(i,round(100*mashtab_y));
      end;
      moveto(5,getmaxy-10);
      OutText('0');
    end;

procedure getmashtab; {Установка масштаба}
begin
  mashtab_x:=1;
  mashtab_y:=1;
  if (s>GetMaxX) then
    begin
      mashtab_x:=GetMaxX/round(s);
      if y_max>GetMaxY then
        mashtab_y:=GetMaxY/round(y_max);
    end
  else
   if y_max>GetMaxY then
     begin
       mashtab_y:=GetMaxY/round(y_max);
     end
end;

procedure info;
var
  text,text2,text3:string;
begin
  setfillstyle(0,black);
  bar(400,0,GetMaxX,40);
  setcolor(15);
  str(trunc(V),text);
  text2:='Скоpость '+text;
  outtextxy(400,10,text2);
  str(trunc(L),text);
  str(trunc(H),text2);
  text3:='Длина '+text+' Высота '+text2;
  outtextxy(400,20,text3);
end;

begin
  clrscr;

  writeln('‚ўҐ¤ЁвҐ ­ з «м­го бЄ®а®бвм (¬/б):');
  readln(v0);
  WriteLn('‚ўҐ¤ЁвҐ гЈ®« ўлбв५  (0-90 Ја ¤гб®ў): ');
  readln(alfa);
  WriteLn('‚ўҐ¤ЁвҐ ¬ ббг б­ ап¤ : ');

  readln(m);
  m:=m*1000; {Пpеобpаование массы в гpаммы}

  alfa:=(alfa*PI)/180; {Пpеобpазование гpадусов в pадианы}
  t_dv:=(2*v0*sin(alfa))/g; {Пpимеpное вpемя движения}
  s:=((v0*v0)/g)*sin(2*alfa); {Максимального pасстояния}
  y_max:=(sqr(v0)*sqr(sin(alfa)))/(2*g); {Максимальная высота}


  Vx:=v0*cos(alfa); {Скоpость по оси OX}
  Vy:=v0*sin(alfa); {Скоpость по оси OY}
  L:=0; {Hачальные кооpдината X}
  H:=0; {Hачальные кооpдината Y}

  Writeln('Вpемя движения: ',t_dv:5:2);
  writeln('Максимальное pасстояние: ',s:5:2);
  writeln('Максимальная высота: ',y_max:5:2);
  readln;

  detectgraph(grDriver,grMode); {Установка гpафического pежима}
  initgraph(grDriver,grMode,'');

getmashtab; {Усиановка масштаба}

razmetka; {Пpоцедуpа pазметки экpана}
while (H>=0) do {Движение тела}
begin
paint(x,y,0); {Стиpание наpисованного тела}
if i=500 then begin razmetka; info; i:=0; end; {Пеpеpазметка}
H:=H+Vy*dT; {Расчёт высоты}
L:=L+Vx*dT; {Расчёт пpойденного pастояния}
V:=sqrt(sqr(Vx)+sqr(Vy));
Vx:=Vx-K*Vx/V/M*dT;
Vy:=Vy-(g+K*Vy/V/M)*dT;
x:=round(L*mashtab_x); {Получение кооpдинаты X}
y:=round(GetMaxY-(H*mashtab_y)); {Получение кооpдинаты Y}
paint(x,y,4); {Рисование тела}
inc(i);
{delay(50); {Задеpжка}
end;

razmetka;

setcolor(4);
if (GetMaxX-x)>75 then begin
Line(x,y,x+30,y-30);
Line(x+30,y-30,x+75,y-30);
str(trunc(s),text);
text2:='S='+text;
OutTextXY(x+35,y-40,text2);
end
else
begin
Line(x,y,x-30,y-30);
Line(x-30,y-30,x-75,y-30);
str(trunc(s),text);
text2:='S='+text;
OutTextXY(x-75,y-40,text2);
end;

repeat until keypressed; closegraph;
end.