(О л.
Отсюда получаем простейший алгоритм растрового представления отрезка:
// 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;