Отчет по практике: Разработка программы для построения графиков в декартовой и полярной системе координат

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Министерство транспорта Российской Федерации

Федеральное агентство железнодорожного транспорта

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

Омский государственный университет путей сообщения (ОмГУПС (ОмИИТ))

ОТЧЕТ

по учебной практике

Студент

А.А. Штайгер

Омск 2015

Содержание

1. Разработка программы для построения графиков в декартовой системе координат

1.1 Задание

1.2 Листинг программы

1.3 Результат работы программы

2. Разработка программы для построения графиков в полярной системе координат

2.1 Задание

2.2 Листинг программы

2.3 Результат работы программы

3. Разработка программы для построения графиков в полярной системе координат

3.1 Задание

3.2 Листинг программы

3.3 Результат работы программы

4. Работа в графическом режиме (класс TCanvas)

4.1 Задание

4.2 Листинг программы

4.3 Результат работы программы

Заключение

1. Разработка программы для построения графиков в декартовой системе координат

1.1 Задание

Построить график функции f(x) на интервале [a,b].

,

1.2 Листинг программы

unit Unit1;

{$mode objfpc}{$H+}

interface

uses

Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,

StdCtrls, math;

//Функция, которая аналитически определяет график.

function f(x:real):real;

//Функция, которая изображает график.

procedure Graphika(a, b: real);

type

{ TForm1 }

TForm1 = class(TForm)

Button1: TButton;

Image1: TImage;

Image2: TImage;

procedure Button1Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ private declarations }

public

{ public declarations }

end;

var

Form1: TForm1;

//Объявление переменных:

//x0, xk, y0, yk - отступы от границ

//x, y - массивы, определяющие координаты

//точек графика в "бумажной"

//u, v - массивы, определяющие координаты

//точек графика в "компонентной"

//системе координат;

//N - количество точек.

x0, y0, xk, yk, a, b :real;

x, y : array [0..1000] of real;

u, v : array [0..1000] of integer;

N : integer;

implementation

{$R *.lfm}

{ TForm1 }

// функция, которая будет изображена на компоненте Image1

function f (x : real) : real;

begin

if x<-1 then Result:=exp(1/5*(exp(x)+7))

else Result:=x*x-x+2;

end;

//функция, которая рисует график заданной функции на компоненте Image1.

procedure Graphika(a, b: real);

//Kx+1 - количество линий сетки,перпендикулярных оси ОХ.

//Ky+1 - количество линий сетки, перпендикулярных оси ОY.

const Kx=5;Ky=5;

var dx, dy, c, d, g, h, max, min :real;

i, tempx, tempy :integer; s : string;

begin

//Вычисление шага изменения по оси Х.

h:=(b-a)/(N-1);

//Формирование массивов x и y.

x[0]:=a;

y[0]:=f(x[0]);

for i:=1 to N do

begin

x[i]:=x[i-1]+h;

y[i]:=f(x[i]);

end;

//Вычисление максимального и минимального значений массива Y.

max:=y[0]; min:=y[0];

for i:=1 to N do

begin

if y[i]>max then max:=y[i];

if y[i]<min then min:=y[i];

end;

//формирование коэффициентов пересчета из "бумажной" в "компонентную" систему координат.

c:=(Form1.Image1.ClientWidth-x0-xk)/(b-a);

d:=x0-c*x[0];

g:=(Form1.Image1.ClientHeight-y0-yk)/(min-max);

h:=yk-g*max;

//Формирование массивов точек в экранной системе координат.

for i:=0 to N do

begin

u[i]:=trunc(c*x[i]+d);

v[i]:=trunc(g*y[i]+h);

end;

//Form1.Image1.Canvas.Color:= clGray;

Form1.Image1.Canvas .Pen .Mode:= pmNot;

//Рисование графика функции на компоненте Image1.

Form1.Image1.Canvas.MoveTo(u[0],v[0]);

Form1.Image1.Canvas.Pen.Width:= 2;

Form1.Image1.Canvas.Pen.Color:= clGreen;

for i:=1 to N do

Form1.Image1.Canvas.LineTo(u[i],v[i]);

Form1.Image1.Canvas.Pen.Width:= 1 ;

Form1.Image1.Canvas.Pen.Color:= clBlack;

//Рисование осей координат, если они попадают в область графика.

Form1.Image1.Canvas.MoveTo(trunc(x0),trunc(h));

if (trunc(h)>yk) and

(trunc(h)<trunc(Form1.Image1.ClientHeight-y0))

then

Form1.Image1.Canvas.LineTo(trunc

(Form1.Image1.ClientWidth -xk),trunc(h));

Form1.Image1.Canvas.MoveTo(trunc(d),trunc(yk));

if (trunc(d)>x0) and

(trunc(d)<trunc(Form1.Image1.ClientWidth-xk))

then

Form1.Image1.Canvas.LineTo(trunc(d),

trunc(Form1.Image1.ClientHeight -y0));

//Рисование линий сетки, вычисление расстояния между линиями сетки в "компонентной" системе координат,

//перпендикулярных оси ОХ

dx:=(Form1.Image1.ClientWidth -x0-xk)/KX;

//Выбираем тип линии для линий сетки,

for i:=0 to KX do

begin

//первую и последнюю линии сетки рисуем обычной сплошной линией,

if (i=0) or (i=KX) then

Form1.Image1.Canvas.Pen.Style:=psSolid

//остальные - рисуем пунктирными линиями.

else

Form1.Image1.Canvas.Pen.Style:=psDash;

//Рисование линии сетки, перпендикулярной оси Ох.

Form1.Image1.Canvas.MoveTo(trunc(x0+i*dx),

trunc(yk));

Form1.Image1.Canvas.LineTo(trunc(x0+i*dx),

trunc(Form1.Image1.ClientHeight -y0));

end;

//Вычисление расстояния между линиями сетки, перпендикулярными оси ОY, в "компонентной" системе координат.

dy:=(Form1.Image1.ClientHeight -y0-yk)/KY;

for i:=0 to KY do

begin

//Первую и последнюю линии сетки рисуем обычной сплошной линией,

if (i=0) or (i=KY) then

Form1.Image1.Canvas.Pen.Style:=psSolid

//остальные - рисуем пунктирными линиями.

else

Form1.Image1.Canvas.Pen.Style:=psDash;

//Рисование линии сетки, перпендикулярной оси ОY.

Form1.Image1.Canvas.MoveTo(trunc(x0),trunc(yk+i*dy));

Form1.Image1.Canvas.LineTo(trunc

(Form1.Image1.ClientWidth-xk),trunc(yk+i*dy));

end;

Form1.Image1.Canvas.Pen.Style:=psSolid;

//Вывод подписей под осями, определяем dx - расстояние между выводимыми под осью ОХ значениями.

dx:=(b-a)/KX;

tempy:=trunc(Form1.Image1.ClientHeight -y0+10);

for i:=0 to KX do

begin

//Преобразование выводимого значения в строку.

Str(a+i*dx:5:2,s);

//Вычисление х-координаты выводимого под осью ОХ значения в "компонентной" системе.

tempx:=trunc(x0+i*(Form1.Image1.ClientWidth -

x0-xk)/KX)-10;

//Вывод значения под осью ОХ

Form1.Image1.Canvas.TextOut(tempx,tempy,s);

end;

if (trunc(d)>x0) and

(trunc(d)<Form1.Image1.ClientWidth-xk) then

Form1.Image1.Canvas.TextOut(trunc(d)-5,tempy,'0');

//Определяем dy - расстояние между выводимыми левее оси ОY значениями.

dy:=(max-min)/KY;

tempx:=5;

for i:=0 to KY do

begin

//Преобразование выводимого значения в строку.

Str(max-i*dy:5:2,s);

//Вычисление y-координаты выводимого левее оси ОY значения в "компонентной" системе.

tempy:=trunc(yk-5+i*(Form1.Image1.ClientHeight- y0-yk)/KY);

//Вывод значения левее оси ОY.

Form1.Image1.Canvas.TextOut(tempx,tempy,s);

end;

if (trunc(h)>yk) and (trunc(h)<

Form1.Image1.ClientHeight-y0) then

Form1.Image1.Canvas.TextOut(tempx+10,

trunc(h)-5,'0');

tempx:=trunc(x0+i*(Form1.Image1.ClientWidth -x0-xk)/2);

Form1.Image1.Canvas.TextOut(tempx,10,

'График функции');

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

Graphika(a, b);

Form1.Image2.Visible:=true;;

end;

procedure TForm1.FormCreate(Sender: TObject);

var s:string;

kod:integer;

begin

Form1.Image1.Canvas.Brush.Color:=clWhite;

Form1.Image1.Canvas.FillRect(0,0,width,Height);

N:=100;

x0:=40;

xk:=40;

y0:=40;

yk:=40;

repeat

s:=InputBox('График непрерывной функции',

'Введите левую границу','-10');

Val(s,a,kod);

until kod=0;

repeat

s:=InputBox('График непрерывной функции',

'Введите правую границу','10');

Val(s,b,kod);

until kod=0;

end;

1.3 Результат работы программы

На рисунке 1 представлено главное окно программы.

Рисунок 1 - Главное окно программы

На рисунках 2 и 3 изображены окна задания левой и правой границ интервала.

Рисунок 2 - Окно задания левой границы

Рисунок 3 - Окно задания правой границы

На рисунке 4 представлен результат работы программы.

Рисунок 4 - Результат работы программы

2. Разработка программы для построения графиков в полярной системе координат

2.1 Задание

Построить график функции r(б) в полярной системе координат на интервале [б1, б2].

,

где R - длина вектора, м;

F - угол, рад.

2.2 Листинг программы

unit Unit1;

{$mode objfpc}{$H+}

Interface

uses

Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Types;

type

{ TForm1 }

TForm1 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ private declarations }

public

{ public declarations }

end;

var

Form1: TForm1;

n:string;

a,b,kod:integer;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);

const

Scale = 20;

var

R, phi : Double;

X, Y : Integer;

CX, CY : Integer;

begin

CX := CenterPoint(ClientRect).X;

CY := CenterPoint(ClientRect).Y;

repeat

n:= InputBox('График функции в ПСК','Введите левую границу','0');

Val (n, a, kod) ;

until kod =0;

repeat

n:= InputBox ('График функции в ПСК','Введите правую границу','10');

Val(n, b, kod );

until kod =0;

phi := a;

with Self.Canvas do

while phi < b do

begin

R := abs(phi)*sin(phi);

X := CX + Trunc(Scale * R * Cos(phi));

y := CY - Trunc(Scale * R * Sin(phi));

Pixels[x, y] := clRed;

phi := phi + pi / 1800;

end;

Form1.Canvas.Pen.Width:=3;

Form1.Canvas.Pen.Color:=clBlack;

Form1.Canvas.MoveTo(CX,CY); // перемещаем позицию пера

Form1.Canvas.LineTo (width-20,CY); //рисование линии

Form1.Canvas.TextOut(CX,CY,'O');

Form1.Canvas.TextOut(width-20,CY-5,'A');

end;

end.

2.3 Результат работы программы

На рисунке 5 представлено главное окно программы.

Рисунок 5 - Главное окно программа

На рисунках 6 и 7 изображены окна задания левой и правой границ интервала. полярный текстовый редактор шрифт

Рисунок 6 - Окно задания левой границы

Рисунок 7 - Окно задания правой границы

На рисунке 8 представлен результат работы программы:

Рисунок 8 - Результат работы программы

3. Разработка программы для построения графиков в полярной системе координат

3.1 Задание

Создать программу - текстовый редактор (аналог Notepad). В основном меню программы должны присутствовать как минимум следующие команды: создание нового файла, открытие существующего файла, сохранение файла, сохранение файла под новым именем, изменение шрифта. В качестве основы редактора можно использовать компонент ТМемо.

3.2 Листинг программы

unit Unit1;

{$mode objfpc}{$H+}

interface

uses

Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,

Menus, ComCtrls, ColorBox;

type

{ TForm1 }

TForm1 = class(TForm)

ColorDialog1: TColorDialog;

FontDialog1: TFontDialog;

ImageList1: TImageList;

MainMenu1: TMainMenu;

Memo1: TMemo;

MenuItem1: TMenuItem;

MenuItem10: TMenuItem;

MenuItem2: TMenuItem;

MenuItem3: TMenuItem;

MenuItem4: TMenuItem;

MenuItem5: TMenuItem;

MenuItem6: TMenuItem;

MenuItem7: TMenuItem;

MenuItem8: TMenuItem;

MenuItem9: TMenuItem;

OpenDialog1: TOpenDialog;

SaveDialog1: TSaveDialog;

ToolBar1: TToolBar;

ToolButton1: TToolButton;

ToolButton2: TToolButton;

ToolButton3: TToolButton;

ToolButton4: TToolButton;

procedure MenuItem10Click(Sender: TObject);

procedure MenuItem3Click(Sender: TObject);

procedure MenuItem4Click(Sender: TObject);

procedure MenuItem5Click(Sender: TObject);

procedure MenuItem6Click(Sender: TObject);

procedure MenuItem7Click(Sender: TObject);

procedure MenuItem8Click(Sender: TObject);

procedure MenuItem9Click(Sender: TObject);

private

{ private declarations }

public

{ public declarations }

end;

var

Form1: TForm1;

s:string;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.MenuItem8Click(Sender: TObject); //создать

begin

form1.Memo1.Lines.Clear;

form1.Caption:='Новый файл';

OpenDialog1.FileName:='';

end;

procedure TForm1.MenuItem4Click(Sender: TObject);//открыть

begin

if form1.OpenDialog1.Execute then

form1.Memo1.Lines.LoadFromFile(OpenDialog1.FileName);

form1.Caption:=OpenDialog1.FileName;

end;

procedure TForm1.MenuItem5Click(Sender: TObject); //сохранить

begin

if OpenDialog1.FileName<>'' then

begin

form1.Memo1.Lines.SaveToFile(OpenDialog1.FileName);

showmessage('Файл сохранен');

end

else begin

if form1.SaveDialog1.Execute then

form1.Memo1.Lines.SaveToFile(SaveDialog1.FileName);

form1.Caption:=SaveDialog1.FileName;

OpenDialog1.FileName:=SaveDialog1.FileName;

end;

end;

procedure TForm1.MenuItem6Click(Sender: TObject); //сохранить как

begin

if form1.SaveDialog1.Execute then

form1.Memo1.Lines.SaveToFile(SaveDialog1.FileName);

form1.Caption:=SaveDialog1.FileName;

OpenDialog1.FileName:=SaveDialog1.FileName;

end;

procedure TForm1.MenuItem7Click(Sender: TObject); //выход

begin

if MessageDlg('Сохранить перед закрытием?', mtCustom, [mbYes, mbNO], 0) = mrYes then

begin

if OpenDialog1.FileName<>'' then

begin

form1.Memo1.Lines.SaveToFile(OpenDialog1.FileName);

showmessage('Файл сохранен');

end

else begin

if form1.SaveDialog1.Execute then

form1.Memo1.Lines.SaveToFile(SaveDialog1.FileName);

form1.Caption:=SaveDialog1.FileName;

OpenDialog1.FileName:=SaveDialog1.FileName;

end;

end;

close;

end;

procedure TForm1.MenuItem9Click(Sender: TObject); // шрифт

begin

if form1.FontDialog1.Execute then

form1.Memo1.Font:=form1.FontDialog1.Font;

end;

procedure TForm1.MenuItem10Click(Sender: TObject); //цвет фона

begin

if form1.ColorDialog1.Execute then

Memo1.Color:=ColorDialog1.Color;

end;

procedure TForm1.MenuItem3Click(Sender: TObject); //справка

begin

showmessage('Текстовый редактор v1.3');

end;

end.

3.3 Результат работы программы

На рисунке 9 представлено главное окно программы.

Рисунок 9 - Главное окно программы

На рисунке 10 изображено выпадающее меню файл.

Рисунок 10 - Выпадающее меню «Файл»

На рисунке 11 представлено окно открытия файла.

Рисунок 11 - Окно открытия файла

На рисунке 12 изображено окно программы после форматирования шрифта и фона.

Рисунок 12 - Окно программы после форматирования шрифта и фона

На рисунке 13 изображено окно «Справка».

Рисунок 13 - Окно «Справка»

На рисунке 14 изображено окно выхода из программы.

Рисунок 14 - Окно выхода из программы

4. Работа в графическом режиме (класс TCanvas)

4.1 Задание

Создать программу с имитацией падения снежинок. Снежинки отображать в виде точек. Для каждой снежинки создать запись (или объект) содержащий следующие поля записи:

- x - координата по X;

- y - координата по Y;

- v - скорость.

При запуске программы, создается N снежинок. Для каждой случайным образом определяется положение и начальная скорость падения. По событию таймера, для каждой снежинки определяется новое положение на экране с учетом скорости, после чего скорость опять изменяется случайным образом.

При нажатии на форме левой кнопки мыши, направление движения снежинок изменяется в точку, где была нажата кнопка мышки.

4.2 Листинг программы

unit Unit1;

{$mode objfpc}{$H+}

interface

uses

Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,