загрузка...
загрузка...
На головну

Малювання відрізка з нецілочисельне координатами кінців

Будуємо 4-зв'язну лінію.

1 підхід: округлимо координати кінців до цілочисельних, а потім скористаємося алгоритмом для цілочислового випадку.

недолік: Може викликати суттєві викривлення (особливо в разі відрізків невеликої довжини).

2 підхід:


Мал. 6. Малювання відрізка з нецілочисельне координатами кінців.

Перейдемо до нашого канонічного випадку, що тепер характеризується тим, що відрізок лежить в першому Октант, але координати A (x0, y0)в цьому випадку: x0 I [0,1),y0 I [0,1).


Параметрізуем наш відрізок стандартним чином:

(X, y) = A + t * (B-A) / c, T I [0, c], A и B - Наші точки, де c> 0- Якийсь масштабний коефіцієнт.

зробимо C чималим цілим числом, щоб уникнути помилок округлення.

тоді беремо Dh = c / (xb-xa)(Т. Е. Збільшення t, коли ми зрушуємося на 1 піксель по x);

Dv = c / (yb-ya)(Т. Е. Збільшення t, коли ми зрушуємося на 1 піксель по y).

Будемо порівнювати поточні значення h и v , А потім в залежності від цього робити крок за x або yіпрідавать відповідні збільшенняhиv. Алгоритм закінчиться, коли h або v перевищить с.

алгоритм:

x = 0; y = 0; // Канонічний випадок: початкова точка лежить в [0,1) A [0,1)

/ * Прирости t, відповідні зсувам від початкової точки до кордонів

першого пікселя. * /

h = Dh * (1-x0); // Dh0

v = Dv * (1-y0); // Dv0

while ((h

{

plot (x, y);

if (h

{

// Зрушення по горизонталі

x ++; h + = Dh;

}

else if (h> v)

{

// Зрушення по вертикалі

y ++; v + = Dv;

}

else

{

// H == v: Вироджений випадок (див. Рис. 6)

малюємо довільний з 2 можливих пікселів

h + = Dh; v + = Dv;

}

}

Зауваження 1: Алгоритм легко узагальнюється на n - мірний випадок.

Зауваження 2: У разі цілочисельних координат кінців відрізка цей алгоритм також можна зробити цілочисельним.

Алгоритм DDA (Digital Differential Analyzer) «-- попередня | наступна --» Sutherland - Cohen
загрузка...
© om.net.ua