Программирование графики: Рисование линий
Xakep, номер #046, стр. 046-075-2 X1:=10; Y1:=10; X2:=220; Y2:=12; //Вычисляю длину отрезков по оси Х и Y. DX:=X2-X1; DY:=Y2-Y1; //Вычисляю начало отрезка в видеопамяти. Offset:=Y1*desc.lPitch+X1*2; Для вычисления начала отрезка в видеопамяти нужно умножить координату Y1 на ширину экрана (лучше использовать desc.lPitch) и прибавить координату Х1, умноженную на два. Почему умножать нужно именно на 2? Да потому, что у нас одна точка определяется двумя байтами цвета. Если бы у нас был 24-й цвет, то пришлось бы умножать на 3. Алгоритм вывода Код вывода линии будет разбит на несколько блоков. Если координата X1 меньше X2, то линия должна рисоваться слева направо. За это будет отвечать один блок рисования. Если линию надо рисовать справа налево, то тут координату Х нужно уменьшать, и это будет делать отдельный блок. Для ускорения процесса рисования каждый из этих блоков будет разбит еще на два. Если линия ближе к горизонтальной, то это один блок. Если ближе к вертикальной, то это уже другой блок кода. Получается, что у нас будет аж четыре блока кода. В зависимости от типа линии ее будет рисовать один из них. if X1<=X2 then begin if DX>DY then begin //Рисуем слева направо, и Х изменяется чаще end else begin //Рисуем слева направо, и Y изменяется чаще end; end else begin if DX>DY then begin //Рисуем cправа налево, и Y увеличивается чаще end else begin //Рисуем cправа налево, и Y увеличивается реже end; end; В этой статье я распишу только один из этих блоков, а остальные ты должен будешь написать сам. if X1<=X2 then //Рисуем слева направо if DX>DY then begin NS:=DX div 2; for i:=0 to DX do begin PWord (Integer(desc.lpSurface) + Offset)^ := $FFFF; Offset:=Offset+desc.lPitch; NS:=NS-DY; if NS<0 then begin Offset:=Offset+2; NS:=NS+DX; end; end; end Здесь у нас блок, в котором по оси Х длина отрезка больше, чем по Y. Это значит, что в счетчик NS нужно занести большую длину - DX, деленное на 2. После этого запускается цикл от 0 до величины DX (большей длины). Внутри цикла первой же строкой я закрашиваю точку в видеопамяти по адресу Offset белым цветом. Следующей строкой я увеличиваю Offset на величину ширины экрана, чтобы перейти на следующую строку по оси Y. Теперь надо уменьшить счетчик NS на длину отрезка по оси Y. Если счетчик меньше нуля, то надо увеличить Offset, чтобы сместиться по оси Х и прибавить к счетчику длину отрезка по оси X. Второй блок Второй блок я расписывать не буду, потому что он похож на первый, а только дам его код. Попробуй разобраться сам, потому что остальные блоки придется писать самому: //Рисуем слева направо, и Y изменяется чаще begin NS:=DY div 2; for i:=0 to DY-1 do begin PWord (Integer(desc.lpSurface) + Offset)^ := $FFFF; Offset:=Offset+2; NS:=NS-DX; if NS<0 then begin Offset:=Offset+desc.lPitch; NS:=NS+DY; |