- •Лабораторная работа № 27-28 Работа с графикой в Pascal
- •Теоретическая часть
- •1.1.Вывод точек и линий
- •1.2.Вывод многоугольников
- •1.3.Вывод дуг, окружностей, эллипсов
- •1.4.Вывод текста
- •Варианты заданий
- •Графика в Турбо Паскале
- •InitGraph( gd, gm,’ указывается путь к драйверу, чем подробнее, тем лучше’);
- •Базовые процедуры и функции
- •Процедуры модуля Graph
- •Функции модуля Graph
- •Экран и окно в графическом режиме
- •Вывод простейших фигур Вывод точки
- •Цветовая шкала
- •Вывод линии
- •Построение прямоугольников
- •Построение многоугольников
- •Построение дуг и окружностей
- •Работа с текстом Вывод текста
- •Вывод численных значений
- •Выравнивание текста
- •Построение графиков функций
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Циклы в графике. Построение случайных процессов
- •Создание иллюзии движения
Вариант 1
program f;
uses graph;
var gd, gm: integer;
x, y: real;
begin
gd:= detect;
initgraph( gd, gm, ‘c:\ bp’);
SetColor(5);
Line(0, 240, 640, 240);
Line(320, 0, 320, 480);
x:= -20;
While x<=20 do
begin
y:= -Sqr(x);
PutPixel(round( x *5) + 320, round(y*5) +240, 15);
x:=x + 0.01;
end;
end.
Вариант 2
program f;
uses graph, crt;
var gd, gm: integer;
x, y, mx, my, m,x1, x2, y1, y2,h: real;
function f(x:real): real;
begin
f:= Sqr(x);
end;
clrscr;
Write(‘Введите границы отрезка’);
Read(x1, x2);
y1:=f(x1);
mx:=640 /(x2 –x1);
my:=480 / (y1 – 0);
If mx< my Then m:=mx
else m:= my;
h:= 1/m; x:=x1;
gd:= detect;
initgraph(gd, gm, ‘c:\ bp’);
SetColor (5);
Line(0, 240, 640, 240);
Line(320, 0, 320, 480);
While x<= x2 do
begin
y:= -f(x);
PutPixel(round(x *m) +320, round(y*m) +240, 15);
x:= x+ h;
end;
end.
Для перевода текущих координат точки из декартовой системы координат в систему устройства можно воспользоваться формулами:
nx:=round((x-xmin)/(maxx-minx)*nx_max);
ny:=round((y-ymax)/(maxy-miny)*ny_max);
где: x,y – координаты текущей точки;
xmax, xmin – диапазон изменения x в декартовой системе координат;
ymax, ymin - диапазон изменения y в декартовой системе координат;
nx_max – количество пиксел по ширине экрана, можно получить при помощи функции Getmaxx;
ny_max - количество пиксел по высоте экрана, можно получить при помощи функции Getmaxy;
Их удобно оформить в виде функций. Заданную формулу для графика тоже лучше оформить в виде функции, тогда получится универсальная программа.
Вариант 3
program grafik;
uses graph,crt;
var xmin,xmax,ymin,ymax:real;
x,dx:real;
grDriver: Integer;
grMode: Integer;
ErrCode: Integer;
function nx(x:real):integer;
begin nx:=round((x-xmin)/(xmax-xmin)*getmaxx) end;
function ny(y:real):integer;
begin ny:=round((y-ymax)/(ymax-ymin)*getmaxy) end;
function y(x:real):real;
begin y:=sqr(x) end;
begin
grDriver := Detect;
InitGraph(grDriver, grMode,'u:\win95\bp7\bgi');
ErrCode := GraphResult;
if ErrCode = grOk then
begin
xmax:=5;xmin:=-5;
ymax:=5;ymin:=-5;
dx:=0.1;
setcolor(14);
Line(GetMaxX div 2,0, GetMaxX div 2, GetMaxY);
Line(0,GetMaxY div 2, GetMaxX, GetMaxY div 2);
setcolor(13);
x:=-4;
while x<=4 do
begin line(nx(x),-ny(y(x)),nx(x+dx),-ny(y(x+dx)));
x:=x+dx
end;
Readln;
CloseGraph;
end
else
Writeln('Graphics error:', GraphErrorMsg(ErrCode));
end.
Замечание: Лучше для рисования графика использовать процедуру line, а не putpixel, т.к. график получится без разрывов.
Рассмотрим построение графика функции, заданной параметрически. В отличие от функции, заданной в явном виде y=f(x), параметр х в этом случае также является функцией, зависящей от некоторого значения.
Пример.
Построить график функции (кардиоида)
x = a cos t ( 1+ cost), y = a sin t( 1+cost), a > 0, t [0, 2 )
Приведем фрагмент программы:
SetColor (5);
Line(0, 240, 640, 240);
Line(320, 0, 320, 480);
t:=0; a:=3;
While t<= 3.1415 do
begin
x:=a*cos(t)*(1+cos(t));
y:= - a sin(t)*(1+cos(t));
PutPixel(x*5 +320, y*5 +240, 15);
x:= x+ 0.01;
end;