Essays.club - Получите бесплатные рефераты, курсовые работы и научные статьи
Поиск

Алгоритм Брезенхейма

Автор:   •  Январь 25, 2021  •  Контрольная работа  •  1,657 Слов (7 Страниц)  •  287 Просмотры

Страница 1 из 7

Алгоритм Брезенхейма

Алгоритм Брезенхейма

Один из наиболее быстрых алгоритмов вычерчивания отрезка. В вычислениях используется только сложение и вычитание.

Обрамим отрезок прямоугольником шириной C и высотой B. Для простоты положим  C  B. Пусть отрезок проходит слева направо, поднимаясь снизу вверх.

[pic 1]

Зажмём отрезок между парой соседних вертикальных точек. Будем сдвигать пару слева направо, изображая ту из точек, которая ближе к прямой линии.

При смещении пары на 1 точку вправо она поднимется вверх на расстояние [pic 2]. За k сдвигов пара поднимется на величину [pic 3]. Выделим целую и дробную части

[pic 4]

где n – целое, и A < C. Чтобы узнать, какую из точек пары надо изображать (нижнюю - основную, или верхнюю – альтернативную), надо сравнить дроби

[pic 5] , что равносильно [pic 6]

Обозначим координаты нижней точки через ( x, y ).

If A < C - A Then Pixels[ x, y ]

Else Pixels[ x, y+1 ]

Затем надо увеличить H на величину h и повторить вычисления.

Заметим, что

[pic 7]

Поэтому, если величина [pic 8] меньше 1, то новое значение A находится по формуле

 A := A + B,

если величина оказывается больше или равной 1, то

A := (A + B) - C

В любом случае координата x обеих точек пары увеличивается на 1, а во втором случае увеличивается и координата y.

x := x + 1;

A := A + B;

If A >= C Then

Begin

  A := A – C;  y := y + 1;

End;

Перед началом алгоритма требуется положить A = 0 и присвоить переменным x, y координаты начала отрезка. Алгоритм необходимо продолжать до тех пор, пока x, y не сравняются с координатами конца отрезка.

unit Lin;

interface

uses

  Math,

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, ExtCtrls;

type

  TForm1 = class(TForm)

    Image1: TImage;

    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;

      Shift: TShiftState; X, Y: Integer);

    procedure FormCreate(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

var

  Form1: TForm1;

implementation

{$R *.dfm}

Var

  PX:Integer=-10; PY:Integer=0;        //Начало отрезка не определено

//====================================

//Инициализация

//====================================

procedure TForm1.FormCreate(Sender: TObject);

begin

  With Image1.Canvas Do

  Begin

    Brush.Color:=clWhite;

    FillRect(ClientRect);                       //Чистим окно

  End;

end;

//====================================

//Обработка нажатия мыши

//====================================

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Integer);

Var

  A,B,C,                                                 //Оценка и размеры области

  TX,TY,                                                 //Внутренняя точка отрезка

  dx,dy,                                                  //Главные приращения координат

  ex,ey:Integer;                                     //Альтернативные приращения координат

Begin

  If Button=mbLeft Then                     //Если нажата левая кнопка, то

  With Image1.Canvas Do

  Begin

    Pen.Width:=5;                                  //Полагаем размер точки

    If PX>=0 Then                                  //Если начало отрезка определено, то

    Begin

      Pen.Color:=clWhite;                      //стираем старое начало

      MoveTo(PX,PY); LineTo(PX,PY);

    End;

    PX:=X; PY:=Y;                                  //Устанавливаем новое начало

    Pen.Color:=clRed;                           //Рисуем новое начало

    MoveTo(PX,PY); LineTo(PX,PY);

    Exit;                                                  //Завершаем

  End;

...

Скачать:   txt (7.4 Kb)   pdf (238.8 Kb)   docx (72.1 Kb)  
Продолжить читать еще 6 страниц(ы) »
Доступно только на Essays.club