Задание
Построить график кривой, заданной параметрически: X=(2+0.5cos(8t))cos(t), Y=(2+0.5cos(8t))sin(t) для интервала t от 0 до 2π, нанести на график размеченные оси координат и сделать подпись.
Дополнительные требования: график изобразить тонкой сплошной линией красного цвета на белом фоне, координатные оси (толстая линия) и разметка (тонкая линия) – черного (темно-серого) цвета, подпись – синего цвета под графиком посередине.
Программу составить для EGA и VGA адаптеров (универсальную). Драйвер графического адаптера (с именем EGAVGA.BGI) находится в каталоге C:\TP6\BGI.
Условия, принятые из соображений дизайна:
График будет занимать 60% ширины и высоты экрана. Разметку проводим через 0.5 по Х и Y. График рисуем процедурой LineTo, для 400 точек.
Program Graph_work2;
{ Программа Лабораторной работы N 8
Вариант N 32.
Построение кривой, заданной параметрически.
А.Я.Умненькая, ст. гр. Я-007 }
Uses Graph,Crt; { Print - только при наличии принтера для печати графика с экрана на бумагу }
TYPE
mas=array[0..400] of real;
Var
X,Y:mas; { текущие значения переменных Х и Y }
Xmin,Xmax,t,tmin,tmax, { минимальное и максимальное значения Х на графике }
Ymin,Ymax, { минимальное и максимальное значения Y на графике }
DeltaX,DeltaY, { диапазоны изменения X и Y в пределах рисунка }
Dt,R, { шаг построения графика по t }
Xj,Yi,
Dxs,Dys, { Шаги разметки осей по Х и по Y }
Part,Pole, { Доля экрана, занятая рисунком и доля чистого поля с каждой стороны }
Mx,My {Коэффициенты пересчета Х в J и Y в I}
: real;
Imin,Imax, { координаты экрана, соответствующие Ymin и Ymax }
Jmin,Jmax, { координаты экрана, соответствующие Xmin и Xmax }
J,I,N,k, { текущие значения переменных координат экрана }
JAll,IAll, {Максимальные размеры экрана (в пикселях) по X и Y}
J0,I0, {Координаты на экране точки пересечения осей графика }
DeltaJ,DeltaI { Экранные размеры рисунка по Х и Y в пикселях}
: integer;
Riska : String[5]; { Строка для вывода чисел у рисок осей }
GraphDrv, { Тип графического драйвера }
GraphMode: integer;{ Устанавливаемый графический режим }
Code: word; { Код завершения инициализации графики }
BEGIN { Начало программы }
{1.Задание констант, стандартных значений }
tmin:=0; tmax:=2.0*Pi;
Dxs:=0.5; Dys:=0.5;
Part:=0.6; N:=401;
{4.Расчет характеристик функций }
Dt:=(tmax-tmin)/(N-1);
Xmax:=-100;
Xmin:=100;
Ymax:=-100;
Ymin:=100;
For k:=0 to N-1 do
begin
t:=tmin+Dt*k;
R:=2.0+0.5*cos(8.0*t);
X[k]:=R*cos(t);
Y[k]:=R*sin(t);
if X[k]>Xmax then Xmax:=X[k];
if X[k]<Xmin then Xmin:=X[k];
if Y[k]>Ymax then Ymax:=Y[k];
if Y[k]<Ymin then Ymin:=Y[k];
end;
DeltaX:=Xmax-Xmin;
DeltaY:=Ymax-Ymin;
{5.Открытие графики с проверкой правильности срабатывания}
GraphDrv:=0; {пусть определяет режим сам }
InitGraph(GraphDrv,GraphMode,'C:\voronov\STUD\TP\BGI');
Code:=GraphResult;
if Code<>0 then {если завершение с кодом не 0 - закончить программу}
Begin
writeln('Ошибка открытия графики с кодом: ',Code);
Halt; { Останов программы }
End;
{6.Настройка фона}
SetBkColor(15); {Фон белый }
ClearDevice; {Очистка экрана}
{7.Расчет параметров графика на экране}
JAll:=GetMaxX;
IAll:=GetMaxY;
Pole:=(1.0-Part)/2.0;
Jmin:=Round(Pole*JAll);
Jmax:=Round((1.0-Pole)*JAll);
Imin:=Round((1.0-Pole)*IAll);
Imax:=Round(Pole*IAll); { Imin > Imax !!! }
DeltaJ:=Jmax-Jmin;
DeltaI:=Imax-Imin;
{8.Расчет масштабных коэффициентов перехода от X к J и от Y к I}
Mx:=DeltaJ/DeltaX;
My:=DeltaI/DeltaY;
{9.Построение графика функции}
{9.1.Задание характеристик линии}
SetColor(4); { цвет красный }
SetLineStyle(0,0,2);
{9.2.Начальная точка графика}
J:=Jmin+Round((X[0]-Xmin)*Mx);
I:=Imin+Round((Y[0]-Ymin)*My);
MoveTo (J,I);
{9.3.Цикл расчета экранных координат графика (X->J, Y->I) и проведения отрезков}
for k:=1 to N-1 do
Begin
J:=Jmin+Round((X[k]-Xmin)*Mx);
I:=Imin+Round((Y[k]-Ymin)*My);
LineTo(J,I);
End;
{10.Построение осей координат }
SetColor(8); { цвет темно-серый }
SetLineStyle(0,0,3); { сплошная толстая }
J0:=Jmin+Round((0-Xmin)*Mx);
I0:=Imin+Round((0-Ymin)*My);
Line(J0,Imin,J0,Imax); {Построение оси Y (где X=0)}
Line(Jmin,I0,Jmax,I0); {Построение оси Х (где Y=0)}
{11.Разметка осей}
SetLineStyle(0,0,0); { сплошная тонкая }
SetTextStyle(0,0,0); { шрифт стандартный, подпись горизонтальна }
SetTextJustify(1,2); {Размещение текста симметрично, относительно заданной
точки по горизонтали и ниже точки по вертикали}
J:=J0;
Xj:=0;
while J<=Jmax+1 do {от начала координат - вправо }
begin
Line(J,Imin,J,Imax);
Str(Xj:3:1,Riska);
OutTextXY(J,I0+5,Riska);
Xj:=Xj+Dxs;
J:=Jmin+Round((Xj-Xmin)*Mx);
end;
J:=J0;
Xj:=0;
while J>=Jmin do {от начала координат - влево }
begin
Line(J,Imin,J,Imax);
Str(Xj:3:1,Riska);
OutTextXY(J,I0+5,Riska);
Xj:=Xj-Dxs;
J:=Jmin+Round((Xj-Xmin)*Mx);
end;
SetTextJustify(2,1); {Размещение текста симметрично, относительно заданной
точки по вертикали и левее точки по горизонтали }
I:=I0;
Yi:=0;
while I>=Imax-1 do {от начала координат - вверх }
begin
Line(Jmin,I,Jmax,I);
Str(Yi:3:1,Riska);
OutTextXY(J0-10,I,Riska);
Yi:=Yi+Dxs;
I:=Imin+Round((Yi-Ymin)*My);
end;
I:=I0;
Yi:=0;
while I<=Imin do {от начала координат - вниз }
begin
Line(Jmin,I,Jmax,I);
Str(Yi:3:1,Riska);
OutTextXY(J0-10,I,Riska);
Yi:=Yi-Dxs;
I:=Imin+Round((Yi-Ymin)*My);
end;
{12.Подпись графика}
SetColor(1); { цвет синий }
SetTextJustify(1,1); {Размещение текста симметрично, относительно заданной
точки по горизонтали и по вертикали}
I:=Round(IAll*(1-Pole/2)); {середина нижнего поля}
OutTextXY(JAll div 2,I,'X=(2+0.5cos(8t))cos(t), Y=(2+0.5cos(8t))sin(t)');
{13.Задержка графика на экране }
while Not KeyPressed do;
{14. Вывод графика на печать (на принтер) - только если он подключен }
{Pr;}
{14.Закрытие графического режима }
CloseGraph;
END.
Рисунок 11. Результат работы программы 32-го варианта
Варианты заданий
Таблица 29. Варианты заданий лабораторной работы N9