https://zingl.github.io/bresenham.html

BresenhamBresenhamzingl.github.io



๋ฌด๋ ค 2012๋…„์— ๋‚˜์˜จ ๋‚˜๋ฆ„ ๋”ฐ๋ˆ๋”ฐ๋ˆํ•œ ๋…ผ๋ฌธ.

๋ธŒ๋ฆฌ์  ํ–„์ด 1962๋…„๋„์— ๋‚˜์˜จ๊ฑฐ๋‹ˆ๊นŒ ์ƒ๋Œ€์ ์œผ๋กœ ์—„์ฒญ ์ตœ๊ทผ ๋…ผ๋ฌธ์ž„. ๋ผ์ธ๋งŒ์„ ์œ„ํ•œ๊ฒŒ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ณก์„ ์„ ์‰ฝ๊ฒŒ ๊ทธ๋ฆฌ๊ธฐ์œ„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ๋ฐ


์ฝ”๋“œ ์ž์ฒด๊ฐ€ ๋„ˆ๋ฌด ๊ฐ„๊ฒฐํ•˜๊ณ  ๊น”๋”ํ•˜๋‹ค.ย 

void plotLine(int x0, int y0, int x1, int y1)

{ int dx = abs(x1-x0), sx = x0<x1 ? 1 : -1; int dy = -abs(y1-y0), sy = y0<y1 ? 1 : -1; int err = dx+dy, e2; /* error value e_xy */ for(;;){ /* loop */ setPixel(x0,y0); if (x0==x1 && y0==y1) break; e2 = 2*err; if (e2 >= dy) { err += dy; x0 += sx; } /* e_xy+e_x > 0 */ if (e2 <= dx) { err += dx; y0 += sy; } /* e_xy+e_y < 0 */ } }


์ด๊ฒŒ ๋ย 


๊ฒฐ๊ตญ abs(dx), abs(dy)๋กœ ํ•ญ์ƒ ๊ธฐ์šธ๊ธฐ๊ฐ€ ์–‘์ˆ˜๊ฐ€ ๋˜๊ฒŒ ํ•˜๊ณ  ํ˜„์žฌ์ ์— ๋Œ€ํ•ด ์œ„,๋Œ€๊ฐ์„ ,์˜ค๋ฅธ์ชฝ 3์ ์ค‘์— ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๊ฒŒ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ๋ฐ


๊ทผ๋ณธ์€ ๋ธŒ๋ฆฌ์  ํ—˜์ฒ˜๋Ÿผ ์—๋Ÿฌ ๋ˆ„์ ํ•ด์„œ ์ ์€ ์—๋Ÿฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Œ.


๊ฐ„๋‹จํžˆ ์• ๊ธฐํ•˜๋ฉด ์ € ๋น„๊ต๋ฌธ์ด๋ž‘ ๋ˆ„์ ํ•˜๋Š” ๋ถ€๋ถ„์€ ๋Œ€๊ฐ์„  ์—๋Ÿฌ๊ฐ’์— ๋Œ€ํ•ด ์œ„์ชฝ ํ”ฝ์…€์˜ ์—๋Ÿฌ๊ฐ’์ด ๋Œ€๊ฐ์„ ๋ณด๋‹ค ๋” ํฌ๋ฉดย ย x+1,ย  ์˜ค๋ฅธ์ชฝ ํ”ฝ์…€๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋Œ€๊ฐ์„  ํ”ฝ์…€์˜ ์—๋Ÿฌ๊ฐ’๊ณผ ๋น„๊ตํ•ด์„œ ์—๋Ÿฌ๊ฐ’์˜ ์ ˆ๋Œ€๊ฐ’์ด ๋Œ€๊ฐ์„ ์ด ๋” ์ ์œผ๋ฉด y+1 ํ•ด์ฃผ๋Š”๊ฑฐ์ž„. ๊ทธ๊ฑธ ์ตœ์ ํ™” ํ•œ๋‹ค๊ณ  ์ฝ”๋“œ๋กœ ์ข€ ๊ผฌ์•„๋†“์€ ๊ฒƒ.


์œ„ ์‚ฌ์ดํŠธ ๊ฐ€๋ณด๋ฉด ์ง์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์žˆ๋Š”๋ฐ 2D๊ฒŒ์ž„์—์„œ Line ๊ฒ€์ƒ‰ ๊ฐ™์€๊ฑฐํ•  ๋•Œ ๋‚˜๋ฆ„ ์œ ์šฉํ•˜์ง€ ์•Š์„๊นŒ ์‹ถ๋„ค.


๋ธŒ๋ฆฌ์  ํ—˜ ์‹ซ์€๊ฒŒ ์ผ€์ด์Šค๋งˆ๋‹ค ๋Œ€์‘ํ•ด์•ผํ•˜๋Š”๊ฒŒ ์ฝ”๋“œ๋„ ๋”๋Ÿฌ์›Œ์ ธ์„œ ์‹ซ์—ˆ๋Š”๋ฐ ์œ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋„ˆ๋ฌด ๊น”๋”ํ•ด์„œ ๋ง˜์—๋“œ๋„ค.