Решение задачи построения растрового изображения отрезка, соединяющего заданные точки. Основные недостатки простейших пошаговых алгоритмов представления отрезка, их устранение в алгоритме Брезенхейма. Разработка программы для построения графика функции.
За начало координат принять нижний левый угол области рисования. Вычертить координатную плоскость, подписать оси координат и график функции. Отсюда получаем простейший алгоритм растрового представления отрезка: unit Unit1; Form1.Image1.Canvas.Pixels[x,round(k * x b)]:=color; Form1.Image1.Canvas.Pixels[x,round(y)]:=color;В результате контрольной работы мной была создана программа, которая строит график функции f(x), x 0 [0,2п].
План
Содержание
Введение
Теоретическая часть. Простейший алгоритм растрового представления отрезка
Практическая часть
Заключение
Список использованных источников
Введение
В данной контрольной работе необходимо построить график функции f(x)=tn(x), x0 [0,2?]. За начало координат принять нижний левый угол области рисования. Вычертить координатную плоскость, подписать оси координат и график функции. Вывести полученное изображение на печать.
Данная контрольная работа содержит введение, основную часть, заключение и список используемых источников.
Теоретическая часть. Простейший алгоритм растрового представления отрезка
Растровое представление отрезка. Алгоритм Брезенхейма
Рассмотрим задачу построения растрового изображения отрезка, соединяющего точки A(xa, ya) и B(xb, yb). Для простоты будем считать, что 0 ? yb- ya ? xb- xa.
Тогда отрезок описывается уравнением: y = y<a >
IMG_896f8b6c-4d3f-4ff1-9d9d-8be9a635ee12 (x-xa), ХЄ [xa, xb], илиу = kx b
Отсюда получаем простейший алгоритм растрового представления отрезка: unit Unit1;
{$R *.dfm} procedure line(xa, ya, xb, yb:integer; color: TCOLOR);
vark,b,y:real;
x:word;
begin k:=(yb - ya) / (xb - xa);
b:= ya - k * xa;
x:=xa;
while x<=xb do begin
Form1.Image1.Canvas.Pixels[x,round(k * x b)]:=color;
inc(x);
end;
Вычислений значений функции y = kx b можно избежать, используя в цикле рекуррентные соотношения, так как при изменении x на 1 значение y меняется на k.
//ВАРИАНТ С РЕКУРСИВНЫМ МЕТОДОМ!
{ k:= (yb - ya) / (xb - xa);
x:=xa;
y:=ya;
while x<=xb do begin
Form1.Image1.Canvas.Pixels[x,round(y)]:=color;
inc(x); y:=y k;
end;
} end;
procedure TFORM1.Button1Click(Sender: TOBJECT);
begin line(100,130,200,157,CLRED);
end;
end.
Приведенные простейшие пошаговые алгоритмы построения отрезка имеют ряд недостатков: 1. Выполняют операции над числами с плавающей точкой, а желательно было бы работать с целочисленной арифметикой;
2. На каждом шаге выполняется операция округления, что также снижает быстродействие.
Эти недостатки устранены в следующем алгоритме Брезенхейма.
Как и в предыдущем случае будем считать, что тангенс угла наклона отрезка принимает значение в диапазоне от 0 до 1. Рассмотрим i шаг алгоритма (Рис. 1.). На этом этапе пиксель Pi-1 уже найден как ближайший к реальному отрезку. Требуется определить какой из ПИКСЕЛЕЙТІ или Si будет установлен следующим.
IMG_0ceed429-d5c4-4076-9818-2be28de5d00e
Рис. 1. i шаг алгоритма Брезенхейма
В алгоритме используется управляющая переменная di, которая на каждом шаге пропорциональна разности между S и T. Если S<T, то Si ближе к отрезку, иначе выбирается Ti.
Пусть изображаемый отрезок проходит из точки (x1, y1) в точку (x2, y2). Исходя из начальных условий точка (x1, y1) ближе к началу координат. Тогда перенесем оба конца отрезка с помощью преобразования T(-x1, -y1), так чтобы первый конец отрезка совпал с началом координат. Начальной точкой отрезка стала точка (0, 0), конечной точкой (dx, dy), где dx = x2 - x1, dy = y2 - y1 (Рис. 2).
IMG_9e074c7c-99a9-4752-b0e1-494b370b2a96
Рис. 2. Вид отрезка после переноса в начало координат
Уравнение прямой в этом случае будет иметь вид: y=x
IMG_d453368c-a45e-4997-b4e0-6814dd0a0c2f
Обозначим координаты точки Pi-1 после переноса через (r, q). Тогда Si = (r 1, q) ИТІ = (r 1, q 1).
Помножим левую и правую часть на dx dx (S - T) = 2 dy (r 1) - 2 q dx - dx = 2(r dy - q dx) 2 dy - dx
Величина dx положительная, поэтому неравенство dx (S - T) < 0 можно использовать в качестве проверки при выборе Si. Обозначим di= dx (S - T), тогда di= 2(rdy - qdx) 2 dy - dx
Поскольку r = xi-1 и q = yi-1, то di= 2 xi-1 dy -2 yi-1 dx 2 dy - dx
Прибавляя 1 к каждому индексу найдем di 1 di 1= 2 xi dy -2 yi dx 2 dy - dx
Вычитаяdi изdi 1 получим di 1- di = 2 dy (xi - xi-1) - 2 dx (yi - yi-1)
Известно, что xi- xi-1 = 1, тогда di 1- di= 2 dy - 2 dx (yi -yi-1)
Отсюда выразим di 1 di 1 = di 2 dy - 2 dx (yi -yi-1)
Таким образом, получили итеративную формулу вычисления управляющего коэффициента di 1, по предыдущему значению di. С помощью управляющего коэффициента выбирается следующий пиксель Si или Ti.
Если di ? 0, тогда выбирается Ti и yi = yi-1 1 и di 1 =di 2 (dy - dx). Если di< 0, тогда выбирается Si и yi = yi-1 и di 1 =di 2 dy.
Начальные значения d1 с учетом того, что (x0, y0) = (0, 0) d1 = 2 dy - dx
Преимуществом алгоритма является то, что для работы алгоритма требуются минимальные арифметические возможности: сложение, вычитание и сдвиг влево для умножения на 2.
Реализация этого алгоритма на Паскале выглядит следующим образом.
Procedure MYLINE(x1, y1, x2, y2, c: Integer);
Var dx, dy, inc1, inc2, d, x, y, Xend: Integer;
Begin dx := abs(x2 - x1);
dy := abs(y2 - y1);
d := dy shl 1 - dx;
inc1 := dyshl 1;
inc2 := (dy - dx) shl 1;
If x1>x2 then
Begin x := x2;
y := y2;
Xend := x1;
End
Else
Begin x := x1;
y := y1;
Xend := x2;
End;
Putpixel(x, y, c);
While x <Xend do
Begin
Inc(x);
If d < 0 then d := d inc1 else
Begin
Inc(y);
d := d inc2;
End;
Putpixel(x, y, c);
End;
End;
Если dy>dx, то необходимо будет использовать этот же алгоритм, но пошагово увеличивая y и на каждом шаге вычислять x.
Практическая часть
Построить график функции f(x)=tn(x), x ? [0,2?]. За начало координат принять нижний левый угол области рисования. Вычертить координатную плоскость, подписать оси координат и график функции. Вывести полученное изображение на печать. using System;