Компьютер - электронное устройство, которое не заменит человека до тех пор, пока не научится смеяться шуткам начальника и сваливать свои собственные ошибки на соседний компьютер.




истанции
      MOV DI,END_Y ;вычитаем координату начальной
      SUB DI,START_Y ;точки из координаты конечной
      JGE KEEP_Y ;вперед если наклон < 0
      NEG DX ;иначе инкремент равен -1
      NEG DI ;а дистанция должна быть > 0 KEEP_Y: MOV DIAGONAL_Y_INCREMENT,DX ;---вычисление горизонтальной дистанции
      MOV SI,END_X ;вычитаем координату начальной
      SUB SI,START_X ;точки из координаты конечной
      JGE KEEP_X ;вперед если наклон < 0
      NEG CX ;иначе инкремент равен -1
      NEG SI ;а дистанция должна быть > 0 KEEP_X: MOV DIAGONAL_Y_INCREMENT,CX ;---определяем горизонтальны или вертикальны прямые сегменты
      CMP SI,DI ;горизонтальные длиннее?
      JGE HORZ_SEG ;если да, то вперед
      MOV CX,0 ;иначе для прямых x не меняется
      XCHG SI,DI ;помещаем большее в CX
      JMP SAVE_VALUES;сохраняем значения HORZ_SEG: MOV DX,0 ;теперь для прямых не меняется y SAVE_VALUES: MOV SHORT_DISTANCE,DI ;меньшее расстояние
      MOV STRAIGHT_X_INCREMENT,CX ;один из них 0,
      MOV STRAIGHT_Y_INCREMENT,DX ;а другой - 1.

;---вычисляем выравнивающий фактор
      MOV AX,SHORT_DISTANCE ;меньшее расстояние в AX
      SHL AX,1 ;удваиваем его
      MOV STRAIGHT_COUNT,AX ;запоминаем его
      SUB AX,SI ;2*меньшее - большее
      MOV BX,AX ;запоминаем как счетчик цикла
      SUB AX,SI ;2*меньшее - 2*большее
      MOV DIAGONAL_COUNT,AX ;запоминаем ;---подготовка к выводу линии
      MOV CX,START_X ;начальная координата x
      MOV CX,START_Y ;начальная координата y
      INC SI ;прибавляем 1 для конца
      MOV AL,COLOR ;берем код цвета ;---теперь выводим линию MAINLOOP: DEC SI ;счетчик для большего расстояния
      JZ LINE_FINISHED ;выход после последней точки
      MOV AH,12 ;функция вывода точки
      INT 10H ;выводим точку
      CMP BX,0 ;если BX < 0, то прямой сегмент
      JGE DIAGONAL_LINE ;иначе диагональный сегмент ;---выводим прямые сегменты
      ADD CX,STRAIGHT_X_INCREMENT ;определяем инкре-
      ADD DX,STRAIGHT_Y_INCREMENT ;менты по осям
      ADD BX,STRAIGHT_COUNT ;фактор выравнивания
      JMP SHORT MAINLOOP ;на следующую точку ;---выводим диагональные сегменты DIAGONAL_LINE: ADD CX,DIAGONAL_X_INCREMENT ;определяем инкре-
      ADD DX,DIAGONAL_Y_INCREMENT ;менты по осям
      ADD BX,DIAGONAL_COUNT ;фактор выравнивания
      JMP SHORT MAINLOOP ;на следующую точку LINE_FINISHED:


4.4.6 Заполнение областей экрана.



      Тщательное обдумывание позволяет исключить много излишней медлительности, которая свойственна многим программам заполнения областей для графического экрана. Когда заполнение основано на простых вычислениях, которые действуют по очереди для каждой точки, то требуются расходующие много времени битовые операции. Более экономный код может определять все ли битовые позиции опре- деленного байта видеобуфера должны иметь один и тот же цвет и когда это условие выполняется, то этому байту присваивается зара- нее заготовленное значение, которое устанавливает все точки в правильный цвет. При этом нет необходимости повторять операции над одним и тем же байтом, каждый раз устанавливая биты только для одной из точек, информацию о которой содержит данный байт.
      В [4.3.4] объяснено как создать описание символа в виде матри- цы 8*8 точек, имеющего требуемый Вам вид. Хотя такие символы могут выводиться только в стандартные символьные позиции, но их использование может существенно облегчить заполнение графиков. Образец высвечивающий все 8*8 точек может быть выведен в интерва- ле нескольких строк и столбцов, заполняя область намного быстрее, чем это достигается при поточечной зарисовке. Этот тип графичес- ких символов может использоваться совместно с точечной графикой. Псевдографические символы могут использоваться также для вывода вращающихся или колеблющихся объектов.

      Высокий уровень.

      Бейсик предоставляет оператор PAINT для заполнения замкнутой фигуры произвольной формы. Вам необходимо указать только точку внутри области, а об остальном позаботится процедура. Может быть указан цвет палетты, которым надо заполнить область, например, PAINT (100,110),2 заполняет область цветом 2 палетты. Закраска ведется начиная от указанной точки до тех пор, пока не встретятся точки с цветом, отличающимся от фонового. Вы можете, наоборот, указать цвет границы и закраска будет продолжаться во всех нап- равлениях, пока не будут встречены точки указанного цвета. При такой закраске линии других цветов, находящиеся внутри границы, могут быть также закрашены. Код цвета границы следует за кодом цвета заполнения, таким образом PAINT (100,180),2,3 закрашивает область цветом 2 до линий цвета 3. Отметим, однако, что эта про- цедура не заполняет области, находящиеся "за углом", т.е. если вдоль какой-либо горизонтальной или вертикальной траектории встретилась точка, имеющая цвет границы, то все последующие точки вдоль этой траектории не заполняются, даже если фигура имеет причудливую форму и эти точки принадлежат внутренней части фигу- ры. В следующем примере выводятся две перекрывающихся рамки цве- тами циан и магента, а затем последняя рамка заполняется белым цветом. Сегменты первой рамки, которые попадают в закрашенную область также заполняются белым.
100 LINE (50,70)-(270,130),1,B 'рисуем рамку цветом циан 110 LINE (100,30)-(220,170),2,B 'рисуем рамку цветом магента 120 PAINT (101,31),3,2 'заполняем вторую рамку белым

Помните, что команда LINE может сама заполнить рамку, если Вы укажете в качестве параметра 'BF', а не 'B'. Смотрите [4.4.5].
      Оператор PAI