Real-integer (промежуточный алгоритм)

Real (без целочисленной арифметики)

Т.к. для прямой линии

Обозначим

k=(float)(x2-x1)/(float)(y2-y1);

for (x=x1; x<=x2;x++) {

y=y1+(int)(k*(x-x1)+0.5);

point(x, y);

}

Операция (int) (k*(x-x1)+0.5) производит математическое округление (а не отсечение дробной части)

Если внимательно посмотреть на изменений y, то можно увидеть, что он или остается тем же, или увеличивается на 1. Выбор должен осуществлятся таким образом, чтобы новая точка сетки (x, y) располагалась по возможности ближе к прямой линии, проходящей через T1 и T2. Это означает, что расстояние по вертикали между новой выбранной точкой и этой линией не должно превышать значение 0.5. Введем d для обозначения этого расстояния и потребуем, чтобы –0.5 <= d <= 0.5. Это неравенство обеспечивает условие для определения необходимости давать приращение переменной y.

k=(float)(x2-x1)/(float)(y2-y1);

d=0;

y=y1;

for (x=x1; x<=x2;x++) {

point(x, y);

d+=k;

if (d>0.5) {y++; d--;}

}

Поскольку d обозначает насколько ниже точной линии лежит вычисленная точка, то значение d увеличивается на значение наклона k, если x увеличивается на 1, и если y остается без изменений. Это условие не выполняется, если значение переменной d превышает значение 0.5. В этот момент нужно увеличить y на 1. Очевидно, что в этот момент отклонение d должно быть уменьшено на 1.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: