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

       

Отрезки прямых и прямоугольники


В системе QBasic для построения отрезков прямых и прямоугольников используется один и тот же оператор LINE по той причине, что обе эти фигуры могут быть определены двумя точкам — началом и концом отрезка или координатами противоположных вершин в прямоугольнике. Более того, на этот же оператор в Бейсике возложили функцию отображения залитого прямоугольника:

LINE (x1,y1l)-(х2,у2)[,[col][,mask] :' 0трезок прямой

LINE (x1,y1)-(x2,y2)[,[col] В [,mask] :' Контур прямоугольника

LINE (x1l,y1)-(x2,y2)[,[col] BF :' Залитый прямоугольник

В приведенных выше форматах оператора LINE координаты точек заданы как абсолютные оконные или экранные координаты. Если построению предшествовало задание границ изменения координат (WIND0W), то координаты точек задаются в терминах физических единиц задачи.

Если координатам точек предшествует добавка STEP, то в скобках задаются приращения относительно позиции текущей точки. Координаты первой точки могут отсутствовать (LINE - (х2,у2) ...), и тогда построение начнется с текущей точки.

Необязательный параметр col определяет цвет рисования, который может отличаться от цвета, установленного по оператору C0L0R.

Если отрезок прямой или контуры прямоугольника проводятся сплошной линией, то параметр mask не задается. Его функция заключается в том, чтобы в последовательности из очередных 16 пикселов линии определить, какие пикселы будут окрашены цветом линии, а какие будут окрашены цветом фона, т. е. останутся невидимыми. Значение mask представляет собой 16-битовую шкалу, в которой единичные разряды соответствуют видимым пикселам линии, а нулевые — невидимым. Например, для построения штриховой линии, у которой длина штриха равна длине пробела и состоит из 8 пикселов, достаточно указать mask = &HFF00.

В BGI-пакете функции построения отрезков прямых, границ прямоугольников и залитых прямоугольников четко разделены:

  • moveto (х, у); — перемещение СР в точку (х, у);

  • moverel (dx,dy) ; -- перемещение СР в точку (CP.x+dx,CP.y+dy) ;

  • lineto (х, у); — соединение СР отрезком с точкой (х, у);






  • linerel(dx,dy); — соединение СР отрезком с точкой (cp.x+dx,cp.y+dy);

  • line(x1,y1,x2,y2); — соединение отрезком точек (xi,yi) и (х2,у2);

  • rectangle (xl, yl,x2, у2); — построение контура прямоугольника;

  • bar (x1,y1,x2,y2); — построение залитого прямоугольника без обводки границ;

  • bar3d(x1,y1,x2,y2,d,b); — построение параллелепипеда.

    Перемещение СР (moveto, moverel) не оставляет следов на экране, иными словами — проводится невидимый отрезок. Это необходимо для перехода к очередной несвязной фигуре. Может показаться странным, что в QBasic в явном виде нет аналогичных операций. На самом деле, это не совсем так. Перевод СР в точку с заданными координатами (х,у) или смещение ее по известным приращениям без построения видимого отрезка осуществляется с помощью оператора PRESET:

    PRESET (x,y) ИЛИ PRESET STEP(dx,dy)

    Однако, если до этого точка с координатами (х,у) была окрашена в цвет, отличный от цвета фона, то после оператора PRESET она будет перекрашена. Чтобы не затереть прежний цвет точки (х,у), можно предварительно опросить ее код цвета, а потом повторить его в одном из операторов PSET или

    PRESET:

    col=P0INT(x,y) : PSET (x,y),col

    или

    PSET (х, у), P0INT (х, у)

    После построения видимых отрезков СР перемещается в конец отрезка. Построение прямоугольника также переводит СР в точку с координатами (х2,y2).

    BGI-пакет располагает точно такой же возможностью по управлению видимостью пикселов линии с помощью 16-битовой маски. Но функция setiinestyle, определяющая стиль линии, несколько удобнее:

    setlinestyle(style,mask,t);

    Первый ее аргумент позволяет установить одну из нескольких заранее подготовленных системных масок, не перелагая на пользователя подбор соответствующего двоичного кода. Аргумент style — целое число из диапазона [0,4], которое удобно задавать в виде мнемонической константы:

    ТС: S0LID_LINE TP: SolidLn 0 — сплошная линия

    D0TTED__LINE DottedLn 1 — пунктирная линия

    CENTER_LINE CenterLn 2 — штрих-пунктирная линия

    DASHED_LINE DashedLn 3 — штриховая линия



    USERBIT_LINE userBitLn 4 — маска пользователя

    Если ни одна из четырех системных масок вас не устраивает, то при style = 4 в качестве маски используется значение параметра mask, подбираемое экспериментальным путем.

    Последний параметр t может принимать только два значения 1 или 3, он задает толщину линии в пикселах. Две соответствующие" мнемонические константы дляСи — N0RM_WIDTH и THICK_WIDTH, для паскаля— NormWidth И ThickWidth.

    В составе BGI-пакета присутствует еще одна функция, не имеющая аналога в QBasic. 0на позволяет обвести границы многоугольника, заданного координатами точек его вершин:

    drawpoly(k,xy);

    Здесь k — количество точек, координаты которых хранятся в целочисленном массиве ху — x1, y1, х2, у2, ... . Дополнительное удобство этой процедуры заключается в том, что, в случае необходимости, она сама осуществляет замыкание контура, соединяя последнюю точку массива с первой. В эту же точку перемещается и СР после построения многоугольника.

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

    setcolor(0);

    setbkcolor(15);

    line{0,0,100,100);

    ни к какому результату не приводит. На белом фоне линия "рисуется" белым же цветом и поэтому не видна. В системе QBasic таких проблем просто не возникает. Попробуйте запустить программу:

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

    SCREEN 12

    VIEW (0,0)-(100,100) ,15

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

    END

    В программах на Паскале или на Си приходится "обманывать" графическую систему следующим образом. Код нулевого цвета заносится в регистр палитры с номером, отличным от нуля. Затем содержимое этого регистра назначается в качестве цвета переднего плана.

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

    program black_white;

    { Построение черных линий на белом фоне }

    uses graph;

    var

    gd,gm,x,у:integer; begin



    gd:=0;

    initgraph(gd,gm,'');

    setcolor(0);

    setbkcolor(15);

    line(0,0,100,100);

    { ничего не видно, т. к. рисуем цветом фона}

    readln;

    setpalette(l,0);

    setcolor(1);

    setbkcolor(15);

    line(0,0,100,100); {хорошая черная линия на белом фоне}

    readln;

    closegraph; end.

    Стирание ранее нарисованных отрезков можно осуществить путем повторного построения такого же отрезка в режиме X0R_PUT. BGI-пакет позволяет на некоторое время установить один из двух режимов вывода — CОPY_PUT или X0R_PUT с помощью процедуры setwritemode:

    setwritemode(C0PY_PUT);

    setwritemode(X0R_PUT);

    В первом режиме точки очередного отрезка или окружности будут затирать встречающиеся на их пути пикселы, а во втором — старый и новый цвета взаимодействующих точек будут поразрядно складываться по модулю 2.

    Специфика построения залитых фигур рассматривается в одном из следующих разделов.




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