вторник, 26 октября 2010 г.

Лабораторная работа №4

Тема: Траектория тела
Цель:
Разработать алгоритм и программу решения прикладной задачи – моделирование движения брошенных с земли объектов.


Задание:
Изобразить местонахождение тела, брошенного с земли с начальной скорость U0 под углом к горизонту α, через равные интервалы времени ( N – число равных временных интервалов)


Математическая модель:


U0 - начальная скорость движения тела
α - угол к горизонту под которым брошено тело
N – число равных временных интервалов (между подкидыванием тела)

Координаты произвольной точки траектории движения определяются уравнениями:

Для определения времени полета приравняем у = 0

Тогда длительность временного интервала (шаг по t )

Преобразование системы координат:

Для вычисления масштабных коэффициентов по x и y , необходимо определить максимальную дальность полета и максимальную высоту подъема.

Очевидно, что дальность полета максимальна при α = 45 °. Следовательно, коэффициент масштабирования по х равен:

Максимальная высота подъема определяется из условия, что проекция скорости на ось у в наивысшей точке подъема равна 0. Исходя из этого условия можно определить время подъема:

Таким образом

Очевидно, что высота подъема максимальна при α = 90°. Следовательно, коэффициент масштабирования по у равен:

Таким образом, экранные координаты тела равны:


Алгоритм:

Программа:

Код программы:

var u0, h, n, w, xsc, ysc:integer;
i, a, t, dt, xmax, kx, ky, x, y:real;
const g = 9.8;
begin
Val(Edit1.Text, u0);
Val(Edit1.Text, a);
Val(Edit1.Text, n);

h:=Image1.Height;
w:=Image1.Width;

Image1.Canvas.pen.Color := clWhite;
Image1.Canvas.Rectangle(0 ,0, w, h);
Image1.Canvas.pen.Color := clGreen;

a:= a*pi/180;
t:= 2*u0*sin(a)/g;
dt := t/n;

xmax := u0*u0*sin(2*a)/g;
kx := w/(u0*u0/g);
ky := h/((u0*u0/g)/2);

Image1.Canvas.Moveto(10,h);
i:= 0;

while i <= t do
begin
x:= u0*cos(a)*i;
y:= u0*sin(a)*i - g*i*i/2;
xsc := round(x*kx);
ysc := round(h - y*ky);
Image1.Canvas.Lineto(xsc, ysc);
i := i + dt;
end;

суббота, 16 октября 2010 г.

Лабораторная работа №3

Тема: График функции в среде Lazarus

Цель: Разработать алгоритм и программу решения прикладной задачи – построение графика заданной функции. Научиться переводить декартовые координаты в экранные.


Задание:
Построить график функции y = Ax2 + Bx + C в диапазоне ( x min, y min ) – ( x max, y max ). Постоянные А, В, С, x min , y min , x max , y max вводятся через пользовательский интерфейс.


Математическая модель решения задачи:

y = Ax2 + Bx + C


Преобразование стандартных координат в экранные:

kx= Image1.Width/(xmax-xmin) //
коэффициент масштабирования по оси Ox
ky= Image1.Height/(ymax-ymin)
//
коэффициент масштабирования по оси Oy

xsc= (xmin- x)*kx //экранная координата x
ysc= Image1.Height – (y - ymin )*ky
//экранная координата y


Программа:




Код программы:

procedure TForm1.DrawClick(Sender: TObject);

var h, w, i, xsc, ysc, n, x, y, xmin, xmax, ymin, ymax, ox, oy: integer;
kx, ky, av, bv,cv: real;
begin
Val(Edit1.Text, av);
Val(Edit2.Text, bv);
Val(Edit3.Text, cv);
Val(Edit4.Text, xmin);
Val(Edit5.Text, xmax);
Val(Edit6.Text, ymin);
Val(Edit7.Text, ymax);

h:=Image1.Height;
w:=Image1.Width;

Image1.Canvas.Rectangle(0 ,0, w, h);

kx:= w/(xmax-xmin);
ky:= h/(ymax-ymin);

x:=xmin;
n:=xmax-xmin;

Image1.canvas.MoveTo(xmin,10);
for i:=0 to n do
begin
y:= round(av*x*x+bv*x+cv);
xsc := round((x - xmin)*kx);
ysc := round(h - (y - ymin)*ky);
Image1.Canvas.LineTo(xsc,ysc);
x:=round(x+kx);
end;
ox:=round(-xmin*kx);
oy:=round(-ymin*kx);
Image1.Canvas.Pen.Color := clGreen;
Image1.canvas.MoveTo(ox,0);
Image1.canvas.LineTo(ox,h);
Image1.canvas.MoveTo(0,oy);
Image1.canvas.LineTo(w,oy);
Image1.Canvas.Pen.Color := clBlack;

end;