(О л.

Отсюда получаем простейший алгоритм растрового представления отрезка:

// File linel.cpp void line (int xa, int уа, int xb, int yb, int color) {

double k = ((double)(yb-ya))/(xb-xa); double b = ya - k*xa;
for (int x = xa; x <= xb; x++ )
putpixel (x, (int)( k*x + b), color);
}

Вычислений значений функции у = кх + Ъ можно избежать, используя в цикле рек-куррентные соотношения, так как при изменении х на 1 значение у изменяется на&

О // File Iine2.cpp

void line (int xa, int ya, int xb, int yb, int color) {

double k = ((double)(yb-ya))/(xb-xa); double у = ya;

for (int x = xa; x <= xb; x++, у += k ) putpixel ( x, (int) y, color);

}

Однако взятие целой части у может приводить к не всегда корректному изображению (рис. 6.2).

Улучшить внешний вид получаемого отрезка можно за счет округления значений у до ближайшего целого. Фактически это означает, что из двух возможных кандидатов (пикселов, расположенных друг над другом так, что прямая проходит между ними) всегда выбирается тот пиксел, который лежит ближе к изображаемой прямой (рис. 6.3). Для этого достаточно сравнить дробную часть у с 1/2.

Компьютерная графика. Полигональные модели

Пусть х0 = ха, у0, ..., лсп = хь, уп = >'Ь - последовательность изображаемых пик причем х h 1 ~ х, - 1. Тогда каждому значению я/ соответствует число kxt + b. Обозначим через с-х дробную часть соответствующего значения фу

kXj + b - ct = (fcc,- + £>}.

Тогда, если с, ^ 1/2, положим у,- =[кх; +b], в противном случае - yi ~ [kXj + fc] +1.

Рассмотрим, как изменяется величина с4 при переходе от х, к следующем чению х ,41 Само значение функции при этом изменяется на к. Если с\ + к ^ 1/2, то В противном случае необходимо увеличить у на единицу и тогда прихо следующим соотношениям: сж =с,- + 1,уж +1, так как

kxt+b = yt + ct

+ fe = >'Ж + СЖ

a y/+] - целочисленная величина.

Заметим, что с0 = 0, так как точка (хи, у$) лежит на прямой у = fcc + Ъ . Приходим к следующей программе: // File ПпеЗ.срр

void line (int xa, int уа, int xb, int yb, int color) {

double k = ((double)(yb-ya))/(xb-xa); double с = 0; int у = ya;


⇐ Предыдущая| |Следующая ⇒