Брезенхем Линии Рисование Алогритм

В алгоритме с плавающей запятой Брезенхема есть что-то, что меня раздражает.

Алгоритм указан ниже:

void line(x0, x1, y0, y1)
{
int deltax = x1 - x0;
int deltay = y1 - y0;
float error = 0;
float deltaerr = Math.abs((float)deltay / (float)deltax);
int y = y0

for(int x=x0;x<=x1;x++)
{
SetPixel(x,y)
error = error + deltaerr
if (error >= 0.5)
{
y = y + 1
error = error - 1.0
}
}
}

Предположим, мы хотим рисовать Y = 0.6X.
Итак, на первом шаге для x = 0: ошибка будет установлена ​​как 0,6, и мы столкнемся с оператором if и y
будет увеличивается. и ошибка будет установлена ​​на -0,4. как -0.4 поможет нам в следующем шаге?

Итак, моя проблема с этой строкой кода:

error = error - 1.0

Почему мы должны уменьшить ошибку на 1? Я читал, что мы делаем это из-за перенастройки! как это может помочь нам?

0

Решение

Ошибка накапливается. Когда оно больше половины пикселя, линия перемещается на один пиксель, и затем ошибка должна быть исправлена ​​снова на целый пиксель.

Если вы просто обнулите ошибку, вы бы только отменили часть ошибки, и, таким образом, линия снова будет преждевременной и будет иметь неправильный градиент.

В вашем примере для y = 0.6x, если вы вычислили ошибку, но обнулили ее, произойдет следующее:

error = 0;
plot pixel;
increment error. error = 0.6;
error > 0.5, so move over and reset error to 0;
plot pixel;
increment error. error = 0.6;
error > 0.5, so move over and reset error to 0;
plot pixel;
increment error. error = 0.6;
error > 0.5, so move over and reset error to 0;
...

Таким образом, линия на самом деле имеет градиент 1; На самом деле любая линия с градиентом> = 0,5 будет выглядеть одинаково, что, очевидно, не очень полезно.

Если вы делаете это правильно:

error = 0;
plot pixel;
increment error. error = 0.6;
error > 0.5, so move over and subtract one; error = -0.4;
plot pixel;
increment error. error = 0.2;
plot pixel;
increment error. error = 0.8;
error > 0.5, so move over and subtract one; error = -0.2;
...

Линия имеет правильный градиент, потому что ошибка действует как дробная часть вычисления с фиксированной точкой.

5

Другие решения

error является ideal_y-current_y

Когда мы вошли в следующую итерацию цикла, мы увеличили x не касаясь y, error=error+deltaerr это обновление error после этой операции.

Если мы решили увеличить y, мы снова должны обновить error, это то что error=error-1 является.

0

По вопросам рекламы [email protected]