Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Коссак графіка.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
6 Мб
Скачать
☆

Image(X,y1,colour) % Lighting pixel

end

else if abs(dy) <= abs(dx)

if x2 < x1

t = x1;

x1 = x2;

x2 = t;

t = y1;

y1 = y2;

y2 = t;

end

% 1,4,5 and 8 oktant

if (dy < 0 & dx > 0) | (dy > 0 & dx < 0)

d = 1;

end

dx = abs(dx);

dy = abs(dy);

x = x1;

y = y1;

c1 = 2*dy;

sfalma = 2*dy-dx ;

c2 = sfalma-dx;

while x <= x2

if d == 0

Image(X,y,colour) % Lighting pixel

else

Image(X,y-2*I,colour) % Lighting pixel

end

x = x+1;

if sfalma < 0

sfalma = sfalma+c1;

else

y = y+1;

i = i+1;

sfalma = sfalma+c2;

end

end

else

if y2 < y1

t = x1;

x1 = x2;

x2 = t;

t = y1;

y1 = y2;

y2 = t;

end

% 2,3,6 and 7 oktant

if (dy < 0 & dx > 0) | (dy > 0 & dx < 0)

d = 1;

end

dx = abs(dx);

dy = abs(dy);

x = x1;

y = y1;

c1 = 2*dx;

sfalma = 2*dx-dy ;

c2 = sfalma-dy;

while y <= y2

if d == 0

Image(X,y,colour) % Lighting pixel

else

Image(X-2*I,y,colour) % Lighting pixel

end

y = y+1;

if sfalma < 0

sfalma = sfalma+c1;

else

i = i+1;

x = x+1;

sfalma = sfalma+c2;

end

end

end

end

end

Алгоритм Брезенгейма для кола. Для побудови кіл чи еліпсів нема готової функції, тому насправді рисується багатокутник з великою кількістю сторін, які наближаються до кола чи еліпса. Інколи достатньо використати 40 вершин.

Алгоритм Брезенгейма для побудови кіл такий:

function brescircle(center,r,colour)

x = 0;

y = r;

sfalma = 3 - 2 * r;

hold on

while x <= y

image(x + center(1),y + center(2),colour)

image(y + center(1),x + center(2),colour)

image(x + center(1),-y + center(2),colour)

image(y + center(1),-x + center(2),colour)

image(-x + center(1),y + center(2),colour)

image(-y + center(1),x + center(2),colour)

image(-x + center(1),-y + center(2),colour)

image(-y + center(1),-x + center(2),colour)

x = x + 1;

if sfalma >= 0

y = y - 1;

sfalma = sfalma - 4 * y;

end

sfalma = sfalma + 4 * x + 2;

end

axis equal

Алгоритм Капеллі для еліпса:

function kappel(center,a,b,colour)

hold on

xc = center(1);

yc = center(2);

x = a;

y = 0;

asqr = a ^ 2;

bsqr = b ^ 2;

a22 = 2 * asqr;

b22 = 2 * bsqr;

xslope = b22 * a;

yslope = 0;

fmid = bsqr * (0.25 - x) + asqr;

while (xslope > yslope)

image(x + xc,y + yc,colour)

image(-x + xc,y + yc,colour)

image(x + xc,-y + yc,colour)

image(-x + xc,-y + yc,colour)

y = y + 1;

yslope = yslope + a22;

if fmid >= 0

x = x - 1;

xslope = xslope - b22;

fmid = fmid - xslope;

end

fmid = fmid + yslope + asqr;

end

fmid = fmid -(yslope + xslope) / 2 + 0.75 * (bsqr - asqr);

while(x > =0)

image(x + xc,y + yc,colour)

image(-x + xc,y + yc,colour)

image(x + xc,-y + yc, colour)

image(-x + xc,-y + yc, colour)

x = x - 1;

xslope = xslope - b22;

if fmid <= 0

y = y + 1;

yslope = yslope + a22;

fmid = fmid + yslope;

end

fmid = fmid - xslope + bsqr;

end

axis equal

Застосування алгоритмів. Нехай поставлене завдання побудувати лінію (рис. 5.13), яка проходить через точки (0,0) і (50,70). Для цього використаємо команду

>> blin(0,0,50,70,47)

Для побудови кола з центром у точці (0,0) та радіусом 25 (рис. 5.14), можна використати команду

>> brescircle([0 0],25,56)

За допомогою алгоритму Капеллі будують еліпс з центром у точці (3,8) та осями, які відповідають значенням a= 23 та b=17 (рис. 5.15), використовуючи відповідну команду

>>kappel([3 8],23,17,47),

Рис. 5.13. Лінія Рис. 5.14. Коло Рис. 5.15. Еліпс