19.4.4. Построение прямоугольников и ломаных

We use cookies. Read the Privacy and Cookie Policy

Для построения прямоугольника достаточно вызвать процедуру

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 -