Компоненты отображения графической информации - Контрольная работа

бесплатно 0
4.5 87
Решение задачи построения растрового изображения отрезка, соединяющего заданные точки. Основные недостатки простейших пошаговых алгоритмов представления отрезка, их устранение в алгоритме Брезенхейма. Разработка программы для построения графика функции.


Аннотация к работе
За начало координат принять нижний левый угол области рисования. Вычертить координатную плоскость, подписать оси координат и график функции. Отсюда получаем простейший алгоритм растрового представления отрезка: 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;

interface uses

Windows, Messages, SYSUTILS, Variants, Classes, Graphics, Controls, Forms, Dialogs, STDCTRLS, EXTCTRLS;

type

TFORM1 = class(TFORM)

Image1: TIMAGE;

Button1: TBUTTON;

procedure Button1Click(Sender: TOBJECT);

private

{ Private declarations } public

{ Public declarations } end;

var

Form1: TFORM1;

implementation

{$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).

Из подобия треугольников на рис 2 можно записать

IMG_f8090c63-5624-4262-9eb9-c3ecf6cb36db

=

IMG_a389a084-cff1-411f-8435-de5c14a26e16

Выразим S

S =

IMG_f9567a9a-b576-4c45-95d5-7f0ca99c58ce (r 1) - q

T можно представить как T = 1 - S. Используем предыдущую формулу

T = 1 - S = 1 -

IMG_7dfc2cc4-5f67-4d6e-9201-2e2e4f3cb0e6 (r 1) - q

Найдем разницу S - T

S - T =

IMG_1b79f27e-a8c2-414a-9675-715a75e84ba3 (r 1) - q - 1

IMG_e234d127-5036-4319-8980-64c0ea0cdeb2 (r 1) - q = 2

IMG_40409b98-b776-418e-b21f-5e89c10c7d6f (r 1) - 2 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;

USINGSYSTEM.Drawing;

using System.Drawing.Drawing2D;

USINGSYSTEM.Windows.Forms;

namespace WINDOWSAPPLICATION1

{ public partial class Form1 : Form

{ public Form1()

{

INITIALIZECOMPONENT();

} private void panel1_Paint(object sender, PAINTEVENTARGS e)

{ float W = panel1.Width, H = panel1.Height;

FLOATHALFW = W / 2, HALFH = H / 2;

// оси координат e.Graphics.DRAWLINE(Pens.Black, HALFW, 0, HALFW, H);

e.Graphics.DRAWLINE(Pens.Black, 0, HALFH, W, HALFH);

// координаты предыдущей точки

INTIXPREV = -1, IYPREV = (int)HALFH;

// тангенс на интервале x=[-Pi..Pi]

// проходим по всем точкам на форме, вычисляем x и y=tg(x) for (int ix = 0; ix < W; ix )

{

// переводим x в диапазон -1..1 float x = (ix - HALFW) / HALFW;

// переводим x в -pi..pi x *= (float)Math.PI;

// получаем tg(x) float y = (float)Math.Tan(x);

// переводим y из -1..1 в пиксели на форме intiy = (int)(HALFH - y * HALFH);

// вуаля e.Graphics.DRAWLINE(Pens.Red, IXPREV, IYPREV, ix, iy);

IXPREV = ix;

IYPREV = iy;

}

}

}

}

Вывод
растровый изображение отрезок алгоритм

В результате контрольной работы мной была создана программа, которая строит график функции f(x), x 0 [0,2п].

Список литературы
1. Фаронов: Программирование C#

2.Савельев А.Я. Основы информатики: Учебник для вузов. - М.: Издательство МГТУ им. Н.Э. Баумана, 2001. - 328 с., ил.

Размещено на .ru
Заказать написание новой работы



Дисциплины научных работ



Хотите, перезвоним вам?