19.4.4. Построение прямоугольников и ломаных
Для построения прямоугольника достаточно вызвать процедуру
Rectangle( Х1, Y1, Х2, Y2 : Integer ),
которая изобразит на экране прямоугольник с диагональю (X1, Y1) — (X2, Y2). Для рисования квадрата надо выбрать высоту прямоугольника так, чтобы она равнялась произведению ширины на коэффициент сжатия изображения (см. разд. 19.4.2).
Чтобы построить фигуры с большим количеством вершин (в том числе и незамкнутые), можно воспользоваться процедурой
DrawPoly( NumPoints : Word; VAR PolyPoints )
Она позволяет рисовать на экране дисплея любую ломаную, заданную набором координат некоторого множества точек. Это может быть как сложная геометрическая фигура, так и табличная математическая функция. Параметр NumPoints — это количество точек ломаной (заметим, что если необходимо нарисовать замкнутый многоугольник с N вершинами, то значение NumPoints должно быть на единицу больше числа N, а координата (N+1)-й точки должна быть такой же, как координата первой). Под бестиповым параметром PolyPoints понимается какая-либо переменная, состоящая из наборов двухкомпонентных записей. Поля каждой записи должны содержать координаты X и Y очередной точки. В модуле Graph введен такой тип:
TYPE
PointType = RECORD
X, Y : Integer { координаты точки }
END;
- 431 -
Обычно набор точек организуется как массив из записей типа PointType (и именно к такой структуре приводится значений параметра Poly Point при работе процедуры DrawPoly). Пример построения графика функции с помощью процедуры DrawPoly приведен на рис. 19.14.
USES Graph; { подключен модуль Graph }
{$I initgraf.pas} { процедура инициализации }
CONST
Pi = 3.14151828;** { константа Pi (замещает функцию) }
Pi2 = 2*Pi; { различные производные от Pi... }
Pi001 = 0.01*Pi;
VAR
angle : Real;
sine_func : Array[1..201] of PointType; {массив точек }
maxy, i : Integer;
BEGIN
GrInit; { инициализация графики }
maxy := GetMaxY div 2; { середина экрана по оси Y }
angle := 0.0; { задание стартовых значений }
i := 0; { счетчик точек в sine_func }
repeat { цикл заполнения sine_func }
Inc(i); sine_func[i].x := Round( 100*angle ) + 10;
sine_func[i].y := Round( 100*Sin(angle) ) + maxy ;
angle := angle + Pi001;
until
angle > Pi2;
DrawPoly(i,sine_func); { рисование графика синуса }
ReadLn; { пауза до нажатия ввода }
CloseGraph { закрытие графики }
END.
Рис. 19.14
** Так напечатано. Вообще-то с точностью до 8-го знака после запятой число p=3,14159265.— Ю.Ш.
С помощью DrawPoly можно вывести график части функции. Для этого достаточно указать при передаваемом массиве номер n первого рассматриваемого элемента (т.е. точки), а в первом параметре — количество рассматриваемых точек, начиная с n-й, например
DrawPoly( 20, sine_func[100] );
Такой вызов выведет ломаную по точкам с номерами 100, 101, ..., 119.
При выводе количества точек, соизмеримого со значением GetMaxX, и при несплошном стиле линии может оказаться, что шаг между соседними точками соответствует ширине пробела между пунктиром. В итоге линия может вообще не проявиться на экране. Надо либо уменьшить число точек, либо избрать сплошной тип линии.
- 432 -