
|
отивном случае, по умолчанию берется центр экрана. Основные коды состоят из буквы, за которой следует длина сегмента в точках. Коды следующие: Ux вверх (на x точек) Dx вниз Rx вправо Lx влево Ex по диагонали вверх и вправо Fx по диагонали вниз и вправо Gx по диагонали вниз и влево Hx по диагонали вверх и влево При умеренном разрешении 100 точек по горизонтали и 100 точек по вертикали дают отрезки примерно одинаковой длины (на самом деле отношение y к x равно 5/6). При высоком разрешении горизонтальная линия будет приблизительно вдвое меньше, чем вертикальная. Из-за большего расстояния между точками диагональ прямоугольника содер- жит ровно столько же точек, сколько и максимальная сторона пря- моугольника, хотя сам отрезок длиннее. Для рисования диагоналей с углами, отличными от 45 градусов, используется кодовая буква M. Этот код рисует следующий сегмент линии в абсолютную или относительную позицию экрана. Чтобы ука- зать абсолютную позицию надо указать координаты x и y. DRAW "M50,60" проведет линию в точку, имеющую координаты столбца 50 и строки 60. Для указания относительных координат добавьте знаки + или - перед числами. Если текущее значение координаты x равно 100, то +50 продолжит линию до столбца 150, а -50 - до столбца 50. Чтобы сдвинуться из 100,100 в 120,70 напишите DRAW "M+20,-30". Линия не обязана быть непрерывной. Когда перед кодом указана буква B, то указатель перемещается как указано, но сегмент линии при этом не рисуется. Например, DRAW "L10BU5R10" рисует две пара- ллельные горизонтальные линии. Чтобы из одной точки начиналось несколько сегментов надо указать перед кодом букву N. В этом случае указатель будет возвращаться в начальную точку после выво- да сегмента. Имеется ряд специальных кодов, которые будучи помещенными внутри строки, действуют на все последующие коды (пока следующий аналогичный код не укажет другое действие). Цвет сегмента линии устанавливается буквой C, за которой следует код цвета. DRAW "C2D5" рисует линию, направленную вниз цветом 2. Установка масш- табного фактора меняет масштаб, в котором будет выводиться фигура или ее часть. Надо добавить к строке букву S, за которой следует фактор. Фактор это число, которое для получения масштаба делится на 4. Обычно фактор равен 4, что соответствует масштабу 1:1. Изменение фактора на 8 приведет к тому, что размер выводимой фигуры будет вдвое больше. Для этого напишите DRAW "S8U12D12" и т.д. Используя один их двух кодов Вы можете вращать оси координат- ной системы. Кодовая буква A вращает оси против часовой стрелки с 90-градусными инкриментами. A0 не вращет оси вообще. A1 - повора- чивает их на 90 градусов, A2 - на 180 градусов и A3 - на 270 градусов. Аналогично, код TA поворачивает оси на указанное число градусов от 0 до 360 (против часовой стрелки) и от 0 до -360 (по часовой стрелке). DRAW "A1L10" и DRAW "TA90L10" приведут к тому, что линия, которая должна была быть направленной влево будет вместо этого нарисована повернутой на 90 градусов и направлена вниз. Оператор DRAW может включать строковые переменные, которые состоят из набора допустимых кодов. Это свойство позволяет прог- рамме повторно использовать части фигур в различных рисунках. В операторе DRAW имя строки должно быть помещено за буквой X и за ним должны следовать точка с запятой. Например: 100 S$ = "U12R15U45L32" 110 DRAW "XS$;" В одном операторе DRAW может содержаться несколько строк, переме- жаемых другими кодами. Отметим, что любые числа, используемые с кодами в операторах DRAW могут сами быть переменными. Таким обра- зом с помощью одного оператора DRAW могут выводиться фигуры, отличающиеся по форме, цвету, масштабу и ориентации. Надо помес- тить знак равенства между буквенным кодом и именем переменной, а за именем поместить точку с запятой. Например, чтобы установить код цвета, определяемый переменной, напишите DRAW "C=PCOLOR;". Компилятор Бейсика требует, чтобы ссылка на эти переменные осу- ществлялась с помощью функции VARPTR$. В этом случае такой опера- тор будет иметь вид DRAW "X" + VARPTR$(S$) или DRAW "C=" + VARPTR$(PCOLOR). Сложные рисунки могут быть сохранены в массиве и затем возвращены на экран в любой момент. Обсуждение этого вопро- са см. в [4.4.6]. Низкий уровень. Нижеприведенная процедура использует алгоритм Брезенхэма для вывода прямой линии, соединяющей любые две точки. Она использует функцию BIOS установки точек и ее можно убыстрить если заменить эту функцию на встроенную процедуру, использующую прямое отобра- жение в память. Как и все быстрые алгоритмы данная процедура избегает операций умножения и деления. Линия рассматривается как набор сегментов двух типов: тех которые расположены диагонально и тех, которые расположены горизонтально или вертикально. Для линий с наклоном больше 1 прямые сегменты вертикальны, в противном случае они горизонтальны; первая задача алгоритма состоит в вы- числении наклона. Затем вычисляется выравнивающий фактор, который следит чтобы некоторое число прямых сегментов имело большую дли- ну, чем остальные. И, наконец, сложный цикл поочередно выводит диагональные и прямые сегменты. BX поочередно принимает то поло- жительные, то отрицательные значения, отмечая какой тип сегмента выводится. Ниже готовятся данные для вывода диагонали из одного угла экрана в противоположный: ;---в сегменте данных START_X DW 0 END_X DW 319 START_Y DW 0 END_Y DW 199 COLOR DB 2 DIAGONAL_Y_INCREMENT DW ? DIAGONAL_X_INCREMENT DW ? SHORT_DISTANCE DW ? STRAIGHT_X_INCREMENT DW ? STRAIGHT_Y_INCREMENT DW ? STRAIGHT_COUNT DW ? DIAGONAL_COUNT DW ? ;---установка режима дисплея MOV AH,0 ;функция установки режима MOV AL,4 ;цветной 320*200 INT 10H ;установка режима ;---установка начальных инкрементов для каждой позиции точки MOV CX,1 ;инкремент для оси x MOV DX,1 ;инкремент для оси y ;---вычисление вертикальной д |