Á¦¸ñ : ¾È³çÇϼ¼¿ä Ç㸣¹ÌÀÔ´Ï´Ù. ¿À´ÃÀº Line °ú Circle ¿¡ ´ë Çؼ­ ¾Ë¾Æº¸µµ·Ï ÇÏ°ÚÀ¾´Ï´Ù. Line ÀÇ ¾Ë°í¸®ÁòÀº ¸î°¡Áö°¡ ÀÖÁö ¸¸ °¡Àå Á¢Çϱ⠽¬¿î ¾Ë°í¸®ÁòÀÎ Bresenham's Algorithm À» »ç¿ë ÇÏ¿´À¾´Ï´Ù. ÀÌ ¾Ë°í¸®ÁòÀÇ ÁÖ¿ä Ư»öÀº Çػ󵵰¡ Á¦ÇѵǾî ÀÖ´Â µð½ºÇ÷¹ÀÌ ½Ã½ºÅÛ¿¡¼­ µ¡¼À¸¸À¸·Î ÁÂÇ¥¸¦ °áÁ¤ÇÏ¿© ¼±À» ±×¸±¼ö ÀÖ°Ô ÇØÁֹǷΠºü¸¥ ¼Óµµ¸¦ ±¸ÇöÇÒ ¼ö ÀÖ´Ù´Â ÀåÁ¡ÀÌ ÀÖÀ¾´Ï´Ù. ±×·³ Pseudo Code ¸¦ º¸°ÚÀ¾´Ï´Ù. (x1,y1)~(x2,y2) ±îÁö ¼±À» ±ß´Â ¾Ë°í¸®Áò dx = x2-x1 dy = y2-y1 ix = absolute value of dx iy = absolute value of dy inc = MAX(ix,iy) plotx = x1 ploty = y1 x = 0 y = 0 putpixel(plotx,ploty) for i=0 to inc { x+=ix y+=iy plot=FALSE if (x>inc) { plot=TRUE x-=inc if (dx>0) plotx++ if (dx<0) plotx-- } if (y>inc) { plot=TRUE y-=inc if (dy>0) ploty++ if (dy<0) ploty-- } if (plot) putpixel(plotx,ploty) } Line ·çƾÀ» ¸¸µå´Âµ¥ À־ À§ÀÇ ¾Ë°í¸®ÁòÀ» °ÅÀÇ ±×´ë·Î ±¸Çö Çϴµ¥ ¿ªÁ¡À» µÎ¾úÀ¸¹Ç·Î ÀÌÇØÇϱⰡ ¾î·ÆÁö´Â ¾ÊÀ» µíÇÕ´Ï´Ù. ¾Ë°í¸®Áò ÀÚü¿¡ ´ëÇÑ ¼³¸íÀº ´Ù¼Ò Àü¹®ÀûÀÎ ³»¿ëÀÌ µÉ °Í°°¾Æ¼­ »ý·«Çϵµ·Ï ÇÏ°ÚÀ¾´Ï´Ù.±×·³ ¹®Á¦´Â À§ÀÇ ¾Ë°í¸®ÁòÀ» Inline Assembly ·Î Implement ÇÏ´Â ¹æ¹ýÀÌ µÇ°ÚÀ¾´Ï´Ù. À̰͵µ ¿ª½Ã Çã ŧ·¹½º ¹öÀü°ú VGA ¹öÀüÀÌ Àִµ¥ Á¡À» Âï´Â °Í ÀÚü¸¦ Àú¹ø °­ ÁÂÀÇ hgVPlotXy µîÀ» ÀÌ¿ëÇÏ´Â °ÍÀÌ ¾Æ´Ï°í ³»ºÎ¿¡ Á÷Á¢ Æ÷ÇÔÇÏ °í ÀÖÀ¾´Ï´Ù. ±×·³ ¼Ò½º¸¦ º¸½Ã°ÚÀ¾´Ï´Ù. Â÷·Ê·Î VGA ·çƾ, HERC ·çƾÀÔ´Ï´Ù. * VGA ·çƾ * void hgVLineG(int x1,int y1,int x2,int y2,char color) { int vdx,vdy,vix,viy,vinc; asm mov ax,0a000h /* setment */ asm mov es,ax asm mov dx,03ceh asm mov ax,0205h /* write mode 2 */ asm out dx,ax asm mov ax,x2 /* calculate vdx,vdy,idx,idy */ asm sub ax,x1 asm mov vdx,ax asm test ax,0x8000 asm jz n1 asm neg ax n1: asm mov vix,ax asm mov ax,y2 asm sub ax,y1 asm mov vdy,ax asm test ax,0x8000 asm jz n2 asm neg ax n2: asm mov viy,ax asm mov ax,vix /* vinc is MAX of vix & viy */ asm cmp ax,viy asm jc n3 asm mov vinc,ax asm jmp next2 n3: asm mov ax,viy asm mov vinc,ax next2: asm mov ax,WORD PTR y1 /* calculate bx */ asm mov bx,80 asm mul bx asm mov bx,ax asm mov dx,WORD PTR x1 asm mov ax,dx asm shr dx,1 asm shr dx,1 asm shr dx,1 asm add bl,dl asm adc bh,0 asm and al,07h asm mov cl,al asm mov ah,080h asm shr ah,cl /* ah is bitmask */ asm mov dx,03ceh asm mov al,8 /* first plot */ asm out dx,ax asm mov al,es:[bx] asm mov al,color asm mov es:[bx],al asm mov si,0 /* si is X */ asm mov di,0 /* di is Y */ asm mov cx,vinc /* loop counter */ loops: asm mov al,0 /* al is plot */ asm add si,vix /* x+=ix; */ asm add di,viy /* y+=iy; */ asm cmp si,vinc /* si > inc ? */ asm jle yproc asm mov al,1 /* plot is 1 */ asm sub si,vinc asm cmp WORD PTR vdx,0 asm jle next3 asm shr ah,1 /* plotx++ */ asm jnz yproc asm mov ah,080h /* mask reset */ asm inc bx /* incre offset */ asm jmp yproc next3: asm shl ah,1 /* plotx-- */ asm jnz yproc asm mov ah,01h asm dec bx /* decre offset */ yproc: asm cmp di,vinc asm jle lpend asm mov al,1 /* plot is 1 */ asm sub di,vinc asm cmp WORD PTR vdy,0 asm jle next4 asm add bx,80 /* ploty++ */ asm jmp lpend next4: asm sub bx,80 lpend: asm cmp al,1 asm jnz end asm mov al,8 /* plot */ asm out dx,ax asm mov al,es:[bx] asm mov al,color asm mov es:[bx],al end : asm loop loops } * HERC ·çƾ */ #define ZERO 13 void hgHLineG(int x1,int y1,int x2,int y2,char color) { int vdx,vdy,vix,viy,vinc; unsigned offset=ret_herc_offset(y1); asm mov ax,0b000h /* segment */ asm mov es,ax asm mov ax,x2 /* calculate vdx,vdy,idx,idy */ asm sub ax,x1 asm mov vdx,ax asm test ax,0x8000 asm jz n1 asm neg ax n1: asm mov vix,ax asm mov ax,y2 asm sub ax,y1 asm mov vdy,ax asm test ax,0x8000 asm jz n2 asm neg ax n2: asm mov viy,ax asm mov ax,vix /* vinc is MAX of vix & viy */ asm cmp ax,viy asm jc n3 asm mov vinc,ax asm jmp next2 n3: asm mov ax,viy asm mov vinc,ax next2: asm mov bx,offset asm mov dx,WORD PTR x1 asm mov ax,dx asm shr dx,1 asm shr dx,1 asm shr dx,1 asm add bl,dl asm adc bh,0 asm and al,07h asm mov cl,al asm mov ah,080h asm shr ah,cl /* ah is bitmask */ asm cmp BYTE PTR color,ZERO asm jz n4 asm or es:[bx],ah asm jmp n5 n4: asm not ah asm and es:[bx],ah asm not ah n5: asm mov si,0 /* si is X */ asm mov di,0 /* di is Y */ asm mov cx,vinc /* loop counter */ loops: asm mov al,0 /* al is plot */ asm add si,vix /* x+=ix; */ asm add di,viy /* y+=iy; */ asm cmp si,vinc /* si > inc ? */ asm jle yproc asm mov al,1 /* plot is 1 */ asm sub si,vinc asm cmp WORD PTR vdx,0 asm jle next3 asm shr ah,1 /* plotx++ */ asm jnz yproc asm mov ah,080h /* mask reset */ asm inc bx /* incre offset */ asm jmp yproc next3: asm shl ah,1 /* plotx-- */ asm jnz yproc asm mov ah,01h asm dec bx /* decre offset */ yproc: asm cmp di,vinc asm jle lpend asm mov al,1 /* plot is 1 */ asm sub di,vinc asm cmp WORD PTR vdy,0 asm jle next4 asm add bx,02000h /* ploty++ */ asm cmp bx,08000h asm jb noadd asm sub bx,07fb0h noadd: asm jmp lpend next4: asm sub bx,02000h asm cmp bx,08000h asm jb lpend asm add bx,07fb0h lpend: asm cmp al,1 asm jnz end asm cmp BYTE PTR color,ZERO asm jz n6 asm or es:[bx],ah asm jmp end n6: asm not ah asm and es:[bx],ah asm not ah end : asm loop loops } Á¶±Ý ±æÁö¸¸ ¾Ë°í¸®ÁòÀ» ±×´ë·Î ±¸ÇöÇßÀ¸¹Ç·Î ´Ù¸¥ Ã¥µî¿¡¼­ ³ª ¿Â ¼± ¾Ë°í¸®Áò º¸´Ù ´À¸±Áöµµ ¸ð¸£Áö¸¸ º¸±â´Â ÆíÇÏ½Ç °Ì´Ï´Ù. ÁÖ¼®°ú ¾Ë°í¸®ÁòÀ» ºñ±³ÇØ º¸½Ã¸é ÀÌÇØ¿¡´Â ±×´ÙÁö ¾î·Á¿òÀÌ ¾ø À» °Ì´Ï´Ù. ±×·³ ¾Ë°í¸®ÁòÀ» ±¸ÇöÇÔ¿¡ ÀÖ¾î ¾à°£ Â÷ÀÌ°¡ ÀÖ´Â ºÎ ºÐ¸¸À» »ìÆ캸°ÚÀ¾´Ï´Ù. ¾Ë°í¸®Áò¿¡¼­ º¸¸é Àß ³ªÅ¸³ªÁö ¾ÊÁö¸¸ ±¸ÇöÇÔ¿¡ ÀÖ¾î °¡Àå ½Ã°£ÀÌ ¸¹ÀÌ °É¸®´Â ºÎºÐÀº Á¡À» Âï´Â ºÎºÐ ÀÔ´Ï´Ù. ¾Ë°í¸®Áò¿¡¼­ º¸¸é plotx,ploty ¸¦ Á¡À» Âï´Â À§Ä¡·Î µÎ °í Àִµ¥,plotx,ploty ¸¦ Á÷Á¢ °è»êÇÏ¿© (x,y) ¿¡ Á¡À» Âï¾îÁÖ ´Â ·çƾÀ¸·Î ³Ñ°ÜÁÖ¾î Á¡À» Âï´Â °ÍÀÔ´Ï´Ù. ÇÏÁö¸¸ ½ÇÁ¦ ±¸Çö¿¡ ¼­´Â ¼ÓµµÀÇ Çâ»óÀ» À§Çؼ­ ´ÙÀ½°ú °°ÀÌ ÇÏ°í ÀÖÀ¾´Ï´Ù. plotx ´Â mask ·Î ´ë½ÅÇÕ´Ï´Ù. ploty ´Â È­¸é¿É¼ÂÀ¸·Î ´ë½ÅÇÕ´Ï´Ù. Áï (x1,y1) À» °¡Áö°í mask ¿Í offset À» °è»êÇÕ´Ï´Ù. ÀÌ °è»ê½ÄÀº ´ÙÀ½°ú °°½À´Ï´Ù. offset=y1*80+x1; ( VGA ÀÇ °æ¿ì ) ( Çãŧ·¹½º´Â ret_herc_offset ÇÔ¼ö ÀÌ¿ë ) mask =0x80 >> (x1%8); ÀÌ°ÍÀ» Inline Assembly ·Î Ç¥ÇöÇÑ ½ÄÀ» À§ÀÇ ¼Ò½º¿¡¼­ º¼ ¼ö ÀÖ À¾´Ï´Ù. ÀÏ´Ü °è»êÇسõÀ¸¸é plotx,ploty ¸¦ µû·Î °è»êÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ÀÌ °ªÀ» °ð¹Ù·Î ÀÌ¿ëÇÕ´Ï´Ù. plotx++ ´Â mask ¸¦ ¿À¸¥ÂÊ À¸·Î Çѹø ½¬ÇÁÆ® ÇÕ´Ï´Ù. ´Ü mask °¡ 0 ÀÌ µÇ¸é (Carry ¹ß»ý) offset À» ¿À¸¥ÂÊÀ¸·Î 1 ´õÇÏ°í mask ´Â 0x80 ( 2 Áø¼ö 10000000 ) À¸·Î ÇØÁÝ´Ï´Ù. plotx-- ´Â ¹Ý´ë·Î mask ¸¦ ¿ÞÂÊÀ¸·Î Çѹø ½¬ ÇÁÆ® ÇÕ´Ï´Ù. ´Ü mask °¡ 0 ÀÌ µÇ¸é (Carry ¹ß»ý) offset ¿¡¼­ 1 À» »©°í mask ¸¦ 1 ( 2 Áø¼ö 00000001 ) ·Î ÇØÁÝ´Ï´Ù. ploty++ ´Â offset+=80 À¸·Î ÇØ°áÇÕ´Ï´Ù. ploty-- ´Â offset-=80 ÀÔ´Ï´Ù. ÀÌ °ªÀ» ¾Ë°í ÀÖÀ¸¹Ç·Î ºñÆ® ¸¶½ºÅ©¸¦ mask ·Î ÇÏ°í ¾²±â¸ðµå 2 ¹ø¿¡¼­ A000:Offset ¿¡ ¾¸À¸·Î½á Á¡À» ÂïÀ» ¼ö ÀÖ´Â °ÍÀÔ´Ï´Ù.( Çãŧ·¹½º´Â Ä÷¯°¡ ZERO °¡ ¾Æ´Ï¸é OR,ZERO ÀÌ¸é ¹ÝÀüÇؼ­ AND ÇÑ´Ù.Áï ZERO Ä÷¯ ó¸® ) ÀÌ°ÍÀº µ¶¸³µÈ Á¡Âï´Â ¸ðµâÀÎ hgPlotXy ¸¦ ÀÌ¿ëÇÒ¶§¿¡ ºñÇؼ­ ¸î°¡Áö ÀåÁ¡ÀÌ ÀÖÀ¾´Ï´Ù. ¿ì¼± ±×·¡ÇÈ ÁÂÇ¥¸¦ ºñÆ® ¸¶½ºÅ©·Î °è»êÇÏ´Â ·çƾÀ» Áߺ¹Çؼ­ °è»êÇÒ ÇÊ¿ä°¡ ¾øÀ¾´Ï´Ù. ¶ÇÇÑ Æ÷Æ® ¼¼ÆÃ,ÃʱâÈ­¸¦ Çѹø¸¸ ÇØÁÖ¸é µÇ¹Ç ·Î ÀÌ Ã³¸®¸¦ ÇØÁÖ´Â °ÍÀº plotx,ploty ¸¦ °è»êÇÏ´Â ¹æ½Äº¸´Ù 50 % Á¤µµ ºü¸¥ ¼Óµµ¸¦ º¸¿©ÁÝ´Ï´Ù. ´Ù¸¥ ºÎºÐµµ ¿ÉƼ¸¶ÀÌ¡ÇÒ ºÎºÐ ÀÌ ¸¹ÀÌ º¸ÀÔ´Ï´Ù. ¿ì¼± °÷°÷¿¡ ³ªÅ¸³ª ÀÖ´Â ºÒÇÊ¿äÇÑ jmp ¸¦ ¾ø ¾ÖÁÙ ¼ö ÀÖÀ¾´Ï´Ù. jmp ´Â ´À¸° ¸í·ÉÀÔ´Ï´Ù. ÀÌ·¯ÇÑ jmp ¸¦ ¿ÉƼ ¸¶ÀÌ¡ÇÔÀ¸·Î½á ¼Óµµ¸¦ ³ôÀÏ ¼ö ÀÖ°ÚÀ¾´Ï´Ù. ¶ÇÇÑ Á¡À» Çϳª¾¿ Âï´Â °ÍÀÌ ¾Æ´Ï¶ó offset ÀÌ ¹Ù²ð¶§¸¶´Ù Çѹø¿¡ ¸ð¾Æ¼­ Âï¾îÁÖ´Â ¹æ¹ýÀ» ÅÃÇÒ ¼öµµ ÀÖÀ¾´Ï´Ù. ÇÏÁö¸¸ ¿©±â¿¡¼­´Â ¾Ë°í¸®ÁòÀÇ Ç¥Çö ¹æ¹ýµî °£°áÇÑ ¼Ò½º¸¦ º¸À̱â À§Çؼ­ ºÒÇÊ¿äÇÑ ºÎºÐÀ» »èÁ¦ÇÏ¿´ À¾´Ï´Ù. ±×·³ À̹ø¿¡´Â ¿øÀ» ±×¸®´Â ¾Ë°í¸®ÁòÀ» º¸°ÚÀ¾´Ï´Ù. ¿øÀ» ±×¸®±â À§Çؼ­´Â cos,sin µî »ï°¢ÇÔ¼öÀÇ °è»êÀÌ ÇÊ¿äÇÕ´Ï´Ù. ÀÌ »ï°¢ÇÔ ¼ö´Â ³»ÀåÇÔ¼ö¸¦ ÀÌ¿ëÇؼ­ ±¸ÇÒ ¼ö ÀÖÁö¸¸ »ç½Ç Coprocessor °¡ ¾ø°í¼­´Â ¾öû³ª°Ô ´À¸³´Ï´Ù. º¸Åë Å×ÀÏ·¯ ±Þ¼öµîÀ» ÀÌ¿ëÇؼ­ cos,sin µîÀ» ±Ù»çÄ¡°è»êÀ» Çؼ­ ¾²´Âµ¥ ÀÌ°æ¿ìµµ ¿ª½Ã ½Ç¼öÀÇ ´©½ÂÀ» °è»êÇØ¾ß ÇϹǷΠ±×´ÙÁö ÁÁÀº ¾Ë°í¸®ÁòÀ̶ó°í ÇÒ ¼ö´Â ¾ø °ÚÀ¾´Ï´Ù. Bresenham's circle Algorithm Àº ÀÌ°ÍÀ» ÇØ°áÇÑ ¾Ë°í ¸®ÁòÀ¸·Î ³î¶ó¿ï¸¸Ä¡ °£´ÜÇÑ °è»êÀ¸·Î ¿øÀ» ±×·ÁÁÝ´Ï´Ù.°£´ÜÇÑ °ö¼À°ú µ¡¼À¸¸À¸·Î ¿øÀ» ±×¸± ¼ö ÀÖÀ¾´Ï´Ù. ±×·³ ¾Ë°í¸®ÁòÀ» º¸ °ÚÀ¾´Ï´Ù. x=0,¹ÝÁö¸§À» y ¶ó Çϸé d=3-y*2 while (x