Практика программирования (Бейсик, Си, Паскаль)

       

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


По умолчанию областью вывода графики является весь экран. 0днако каждая из систем программирования позволяет объявить зоной вывода некоторую прямоугольную область, выход за пределы которой обычно заблокирован, но может быть и разрешен, если вы отключите режим отсечения. Последняя возможность предусмотрена только в рамках BGI-пакета.

В системе QBasic область графического вывода переопределяется оператором VIEW, имеющим две модификации:

VIEW (xl,yl)-(x2,y2),cf,cb

VIEW SCREEN (xl,yl)-(х2,у2),cf,cb

Каждая из них устанавливает прямоугольную область, левая верхняя вершина которой задана экранными координатами (xi,yi), а противоположная вершина — координатами (х2,у2). Попытка задать область, выходящую за пределы экрана (о < х < 639, о < у < 479), системой пресекается. Целые числа cf и сь задают, соответственно, цвет фона и цвет рамки, которая окаймляет область вывода. 0бласть вывода и ее границы сразу же окрашиваются в указанные цвета.

В определенной таким образом области вывода действует одна из двух оконных систем координат. В первой из них начало координат находится в точке с экранными координатами (xi,yi), т. е. в левом верхнем углу окна, ось х направлена вправо, ось у — вниз, абсолютные координаты точек только целочисленные и положительные. Добавка SCREEN переносит начало отсчета координат с таким же взаимным расположением осей в левый верхний угол экрана, т. е. в точку (0,0). В любом случае все, что имеет координаты за пределами области вывода, отображаться не будет.

Приводимый ниже пример сначала объявляет квадратную область вывода, начинающуюся в точке с экранными координатами (10,10), ширина и высота которой равна 200 пикселам. Начало координат в этом окне физически находится в точке с экранными координатами (10,10). Поэтому два следующих оператора LINE строят горизонтальную и вертикальную линии, точно проходящие через середину области. Второй оператор (VIEW SCREEN) объявляет такую же по размерам квадратную область, привязанную своим левым верхним углом к точке с экранными координатами (310,10). 0днако в этой области действует экранная система координат с началом в точке (0,0). И для построения аналогичных прямых, проходящих через центр второй области, их концы приходится задавать в координатах экрана. Выполнив этот пример на компьютере, вы можете убедиться в том, что на одном экране могут одновременно сосуществовать изображения в не перекрывающихся зонах вывода, но в каждый конкретный момент выполнения программы действует только одно окно вывода.




Программа 8_01.bas

RЕМ Демонстрация графических окон

SCREEN 12 :' Переход в графический режим

VIEW (10,10)-(210,210),2,1 : ' 0бъявление графического окна



LINE (0,100)-(200,100)

LINE (100,0)-(100,200)

SLEEP : ' Задержка до нажатия любой клавиши

VIEW SCREEN (310,10)-(510,210),4,14: ' Новое окно

LINE (310,110)-(510,110)

LINE (410,10)-(410,510)

SLEEP

END

В момент создания зоны вывода первого типа (VIEW) текущая точка устанавливается в центр окна, тогда как для области вывода второго типа (VIEW SCREEN) текущая точка переводится в центр экрана и может оказаться за пределами окна. С учетом последнего замечания построения в окне можно вести не только в абсолютных координатах, определяемых описанными выше способами, но и в относительных координатах. Последние задаются в приращениях относительно положения текущей точки и сопровождаются добавкой STEP:

Программа 8_02.bas

RЕМ Построения в относительных координатах

SCREEN 12

VIEW (10,10)-(210,210),2,1

LINE STEP(0,0)-STEP.(-20,0) : ' 0трезок белого цвета

C0L0R 4 : ' Цвет рисования - красный

LINE STEP(0,0)-STEP(0,-20)

C0L0R 2 : ' Цвет рисования - зеленый

VIEW SCREEN (310,10)-(510, 210) , 4,14

LINE STEP(0,0)-STEP(-20,0)

END

В приведенном выше примере первый отрезок белого цвета начинается в центре области (нулевые смещения начальной точки отрезка означают совпадение с положением текущей точки). Конец отрезка смещен на 20 пикселов по горизонтали влево. В эту же точку перемещается СР после построения первого отрезка. Второй отрезок красного цвета начинается из конца первого отрезка

и продолжается вверх по вертикали на 20 пикселов (в направлении, противоположном оси у). Для второго окна текущая точка оказалась снаружи, поэтому горизонтальный отрезок зеленого цвета мы не увидим.

Программирование перемещений в целочисленных координатах пикселов далеко не всегда бывает удобным с точки зрения прикладной программы. Например, чтобы построить график синусоиды, ее амплитуду придется умножить на достаточно большое число, чтобы увеличить размах по оси у, принудительно увеличить значение функции, чтобы исключить отрицательные координаты точек, растянуть значение координаты х таким образом, чтобы на видимом участке оказались один-два более или менее красивых периода функции, и учесть специфику в направлении оси у (Y = у - уmах). Система QBasic берет все эти хлопоты на себя. Достаточно лишь после объявления области вывода указать пределы изменения координат (х,у) в отображаемых объектах с помощью оператора WIND0W:



WIND0W (XMIN,YMIN)-(XMAX,YMAX)

Построение одного периода синусоиды, например, может выглядеть следующим образом:

Программа 8_03.bas

RЕМ Построение синусоиды

SCREEN 12

VIEW (10,10)-(410,210),2,1

LINE (400,100)- (0,100) ' Построение оси х и возврат СР в ее начало

WIND0W (0,-1)-(б.З,1) ' 0бъявление пределов изменения функции

F0R X=.l Т0 6.3 STEP .1

Y=SIN(X) ' Вычисление значения функции

LINE -(X,Y) ' Проведение отрезка прямой из СР в (X,Y)

NEXT X

END

В пакете BGI область графического вывода устанавливается процедурой

setviewport:

ТС: setviewport(xmin,ymin,xmax,ymax,clip);

TP: SetViewPort(xmin,ymin,xmax,ymax,clip);

Экранные координаты точек (xmin,ymin) и (xmax,ymax) определяют, соответственно, положение левого верхнего и правого нижнего углов прямоугольной области вывода. Система координат в зоне вывода привязана своим началом к левому верхнему углу прямоугольника, и ее ось у, к сожалению, направлена вниз. Параметр clip, который может принимать только два значения (в Си — о или не о, в Паскале — true или false), управляет режи-

мом отсечения графических изображений, выходящих своими частями за пределы области вывода. При clip = о или clip = false отсечение не производится. 0бъявление окна графического вывода в ТС и ТР автоматически чистит окно и переводит текущую точку в начало координат. По умолчанию фон окна черный, а линии рисуются белым цветом.

Программа построения периода синусоиды на Паскаче, например, может выглядеть следующим образом:

Программа 8_03.pas

program sinl;

uses graph; var

gd,gm,xe,ye,k:integer;

x,y,dx:double;

begin

gd:=0;

InitGraph(gd,gm,'');

dx:=0.1;

SetViewPort(10,10,410,210, false) ;

LineTo(0,200); {0бводим границы установленного окна}

LineTo(400,200); LineTo(400,0);

LineTo(0,0);

{Проводим ось х и возвращаем СР в ее начало}

Line(400,100,0,100);

for k:=0 to 63 do

begin

x:=k*dx;

y:=sin(x);

xe:=round(x*400/6.28);

{Преобразуем программные координаты к экранным - хе, уе }

ye:=round(100-y*100);



LineTo(хе,уе) (Соединяем предыдущую точку с новой}

end;

readln;

closegraph;

end.

Для очистки окна вывода в системе QBasic используется оператор CLS, который заливает внутренность окна текущим цветом фона экрана (но не цветом фона, установленным при объявлении окна), зато сохраняет цветную окантовку окна. 0ператор CLS 2 чистит не только текущее окно, но и весь экран, переводя его в окно вывода по умолчанию.

Пакет BGI предлагает две процедуры без параметров — ciearviewport и cieardevice. Первая из них заливает цветом фона область текущего окна вывода и возвращает СР в начало координат, вторая — чистит экран и объявляет его текущей зоной вывода.

Для определения максимальных размеров текущего окна вывода по каждой координате можно использовать функции getmaxx и getmaxy, не требующие параметров. Значениями этих функций удобно пользоваться, когда необходимо привязать то или иное изображение к фиксированному месту в окне вывода. Например, построение окружности, расположенной в центре зоны вывода, выполняется следующим образом:

Circle(GetMaxX div 2,GetMaxY div 2, 50);




Содержание раздела