Алгоритм DDA-лінії растеризує відрізок прямої між початковою та кінцевою точками. В найпростішій реалізації алгоритм інтерполює значення з інтервалів [(xstart, ystart), (xend, yend)] обчислюючи для кожного xi вираз xi = xi−1+1/m, yi = yi−1 + m, де Δx = xend − xstart , Δy = yend − ystart та m = Δy/Δx.
Абревіатура DDA в назві цього алгоритму комп'ютерної графіки походить від англ. Digital Differential Analyzer (цифровий диференціальний аналізатор) — обчислювальний пристрій, що застосовувалося раніше для генерації векторів.
Алгоритм можна реалізувати використовуючи дійсні або цілі числа.
Алгоритм
Нехай відрізок заданий дійсними координатами кінців . Растровими (цілочисельними) координатами кінцевих точок стають округлені значення вихідних координат: .
Більше з двох чисел — або — за абсолютною величиною приймається за кількість кроків циклу растеризації, збільшене на 1.
На початку циклу допоміжним дійсним змінним і присвоюються вихідні координати початку відрізка: . На кожному кроці циклу ці дійсні змінні отримують приріст . Растрові ж координати, віднайдені на кожному кроці, є результатом округлення відповідних дійсних значень і .
Застосування обчислень з дійсними числами і лише одноразове використання округлення для остаточного отримання значення растрової координати зумовлюють високу точність і низьку швидкодію алгоритму.
Далі представлено програмний код реалізації алгоритму DDA-лінії. Значення допоміжних змінних і тут зберігаються у вигляді масивів.
void dda_line (float x1, float y1, float x2, float y2){ int i, L, xstart, ystart, xend, yend; float dX, dY, x[1000], y[1000]; xstart = roundf(x1); ystart = roundf(y1); xend = roundf(x2); yend = roundf(y2); L = max(abs(xend-xstart), abs(yend-ystart)); dX = (x2-x1) / L; dY = (y2-y1) / L; i = 0; x[i] = x1; y[i] = y1; i++; while (i < L) { x[i] = x[i-1] + dX; y[i] = y[i-1] + dY; i++; } x[i] = x2; y[i] = y2; /* Output: -----------------------*/ i = 0; while (i <= L) { plot (roundf(x[i]), roundf(y[i])); /* Draws a point. */ i++; } /* -------------------------------*/ }
Оптимізований алгоритм, замість поділу використовує зсув побітово. sx, sy — початок лінії tx, ty — кінець лінії. Застосовується в разі, якщо використання змінних з плаваючою комою (float, double тощо) неможливо на увазі будь-яких обмежень.
int l, dx, dy; int xr = Math.abs(tx-sx); int yr = Math.abs(ty-sy); if(xr > yr) {l=xr;} else {l=yr;} int px = (sx<<12)+(1<<11); // 1<<11 аналогично 0.5 у float int py = (sy<<12)+(1<<11); int ex = (tx<<12)+(1<<11); int ey = (ty<<12)+(1<<11); if(l != 0) { dx = (ex-px) / l; dy = (ey-py) / l; } else { dx = 0; dy = 0; } for(int i=0; i<=l; i++) { drawpoint(px>>12, py>>12); px += dx; py += dy; }
Модифікований алгоритм DDA-лінії застосовується для растеризації кіл.
Примітки
- Взагалі кажучи, якщо дійсні координати кінців відрізка задані в деякій логічній системі координат, то відповідні їм растрові координати визначаються на підставі правил перерахунку, встановлених для конкретної пари систем координат: логічної і екранної.
Див. також
Джерела
- Растеризація відрізка. Алгоритм DDA-лінії. (рос.) [ 7 грудня 2014 у Wayback Machine.]
- McCrea P. G., Baker P. W. On DDA circle generation for computer graphics. IEEE Trans. on Computers. — 1975. — V. C-24. — P. 1109–1110
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Algoritm DDA liniyi rasterizuye vidrizok pryamoyi mizh pochatkovoyu ta kincevoyu tochkami V najprostishij realizaciyi algoritm interpolyuye znachennya z intervaliv xstart ystart xend yend obchislyuyuchi dlya kozhnogo xi viraz xi xi 1 1 m yi yi 1 m de Dx xend xstart Dy yend ystart ta m Dy Dx Abreviatura DDA v nazvi cogo algoritmu komp yuternoyi grafiki pohodit vid angl Digital Differential Analyzer cifrovij diferencialnij analizator obchislyuvalnij pristrij sho zastosovuvalosya ranishe dlya generaciyi vektoriv Algoritm mozhna realizuvati vikoristovuyuchi dijsni abo cili chisla AlgoritmNehaj vidrizok zadanij dijsnimi koordinatami kinciv x 1 y 1 x 2 y 2 displaystyle x 1 y 1 x 2 y 2 Rastrovimi cilochiselnimi koordinatami kincevih tochok stayut okrugleni znachennya vihidnih koordinat x s t a r t round x 1 y s t a r t round y 1 displaystyle x mathrm start operatorname round x 1 y mathrm start operatorname round y 1 x e n d round x 2 y e n d round y 2 displaystyle x mathrm end operatorname round x 2 y mathrm end operatorname round y 2 Bilshe z dvoh chisel x e n d x s t a r t displaystyle x mathrm end x mathrm start abo y e n d y s t a r t displaystyle y mathrm end y mathrm start za absolyutnoyu velichinoyu prijmayetsya za kilkist krokiv L displaystyle L ciklu rasterizaciyi zbilshene na 1 Na pochatku ciklu dopomizhnim dijsnim zminnim x displaystyle x i y displaystyle y prisvoyuyutsya vihidni koordinati pochatku vidrizka x x 1 y y 1 displaystyle x x 1 y y 1 Na kozhnomu kroci ciklu ci dijsni zminni otrimuyut pririst x e n d x s t a r t L y e n d y s t a r t L displaystyle x mathrm end x mathrm start L y mathrm end y mathrm start L Rastrovi zh koordinati vidnajdeni na kozhnomu kroci ye rezultatom okruglennya vidpovidnih dijsnih znachen x displaystyle x i y displaystyle y Zastosuvannya obchislen z dijsnimi chislami i lishe odnorazove vikoristannya okruglennya dlya ostatochnogo otrimannya znachennya rastrovoyi koordinati zumovlyuyut visoku tochnist i nizku shvidkodiyu algoritmu Dali predstavleno programnij kod realizaciyi algoritmu DDA liniyi Znachennya dopomizhnih zminnih x displaystyle x i y displaystyle y tut zberigayutsya u viglyadi masiviv void dda line float x1 float y1 float x2 float y2 int i L xstart ystart xend yend float dX dY x 1000 y 1000 xstart roundf x1 ystart roundf y1 xend roundf x2 yend roundf y2 L max abs xend xstart abs yend ystart dX x2 x1 L dY y2 y1 L i 0 x i x1 y i y1 i while i lt L x i x i 1 dX y i y i 1 dY i x i x2 y i y2 Output i 0 while i lt L plot roundf x i roundf y i Draws a point i Optimizovanij algoritm zamist podilu vikoristovuye zsuv pobitovo sx sy pochatok liniyi tx ty kinec liniyi Zastosovuyetsya v razi yaksho vikoristannya zminnih z plavayuchoyu komoyu float double tosho nemozhlivo na uvazi bud yakih obmezhen int l dx dy int xr Math abs tx sx int yr Math abs ty sy if xr gt yr l xr else l yr int px sx lt lt 12 1 lt lt 11 1 lt lt 11 analogichno 0 5 u float int py sy lt lt 12 1 lt lt 11 int ex tx lt lt 12 1 lt lt 11 int ey ty lt lt 12 1 lt lt 11 if l 0 dx ex px l dy ey py l else dx 0 dy 0 for int i 0 i lt l i drawpoint px gt gt 12 py gt gt 12 px dx py dy Modifikovanij algoritm DDA liniyi zastosovuyetsya dlya rasterizaciyi kil PrimitkiVzagali kazhuchi yaksho dijsni koordinati kinciv vidrizka zadani v deyakij logichnij sistemi koordinat to vidpovidni yim rastrovi koordinati viznachayutsya na pidstavi pravil pererahunku vstanovlenih dlya konkretnoyi pari sistem koordinat logichnoyi i ekrannoyi Div takozhAlgoritmi pobudovi vidrizka Algoritm Brezenhejma Algoritm VuDzherelaRasterizaciya vidrizka Algoritm DDA liniyi ros 7 grudnya 2014 u Wayback Machine McCrea P G Baker P W On DDA circle generation for computer graphics IEEE Trans on Computers 1975 V C 24 P 1109 1110