Алгоритм Брезенхейма
Автор: zacetavtom11 • Январь 25, 2021 • Контрольная работа • 1,657 Слов (7 Страниц) • 286 Просмотры
Алгоритм Брезенхейма
Алгоритм Брезенхейма
Один из наиболее быстрых алгоритмов вычерчивания отрезка. В вычислениях используется только сложение и вычитание.
Обрамим отрезок прямоугольником шириной 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
...
Доступно только на Essays.club
|