´Ù.Á¤±ÔÈ­

¿©±â±îÁö Äڵ带 ÀÛ¼ºÇÑ ÈÄ Å×½ºÆ®ÇØ º¸¸é ApiDrawÀÇ ¼±Åà Äڵ忡 ¾à°£ÀÇ ¹®Á¦°¡ ÀÖÀ½À» ¹ß°ßÇÒ ¼ö ÀÖ´Ù. µµÇüÀ» ±×¸± ¶§ ÈçÈ÷ ¸¶¿ì½º¸¦ Á»ó´Ü¿¡¼­ ¿ìÇÏ´ÜÀ¸·Î µå·¡±×Çϴµ¥ ÀÌ °æ¿ì´Â µµÇüÀÇ ¿µ¿ªÀÌ Á¤±ÔÈ­µÇ¾î ÀÖÀ¸¹Ç·Î ¾Æ¹« ¹®Á¦°¡ ¾ø´Ù. ±×·¯³ª µå·¡±× ¹æÇâÀ» ¹Ù²Ù¸é ÀÌ µµÇüÀº ¼±ÅõÇÁö ¾Ê´Â´Ù. ¿Ö ±×·±Áö ±×¸²À¸·Î ¼³¸íÇØ º¸ÀÚ.

ApiDrawÀÇ ¸¶¿ì½º Çڵ鷯µéÀº ÃÖÃÊ Å¬¸¯ÇÑ ÁöÁ¡À» Á»ó´ÜÀ¸·Î ÇÏ°í ¸¶¿ì½º ¹öÆ°À» ³õÀº ÁöÁ¡À» ¿ìÇÏ´ÜÀ¸·Î ±â·ÏÇϴµ¥ Á»ó´Ü¿¡¼­ ¿ìÇÏ´ÜÀ¸·Î µå·¡±×ÇÑ °æ¿ì´Â ÀÌ »ç°¢ÇüÀÇ ¸ð¾çÀÌ Á¤»óÀûÀÌÁö¸¸ ¹Ý´ë·Î ¿ìÇÏ´Ü¿¡¼­ Á»ó´ÜÀ¸·Î µå·¡±×¸¦ ÇÑ °æ¿ì´Â left°¡ rightº¸´Ù ´õ ¿À¸¥ÂÊ¿¡ ÀÖ°í topÀÌ bottomº¸´Ù ´õ ¾Æ·¡¿¡ ÀÖ´Â ºñÁ¤»óÀûÀÎ »ç°¢ÇüÀÌ ¸¸µé¾îÁø´Ù. ÀÌ·± °æ¿ì¶óµµ Rectangle, Ellipse ÇÔ¼öµéÀº ÁÂÇ¥¸¦ Á¶Á¤ÇÑ ÈÄ ±×¸®µµ·Ï µÇ¾î ÀÖ¾î µµÇüÀº Á¦´ë·Î Ãâ·ÂµÈ´Ù. ±×·¯³ª »ç°¢ ¿µ¿ª¾È¿¡ Á¡ÀÌ Æ÷ÇԵǾî ÀÖ´ÂÁö¸¦ Á¶»çÇÏ´Â PtInRect ÇÔ¼ö´Â ±×·¸Áö ¸øÇØ Á¤±ÔÈ­µÈ »ç°¢Çü¸¸À» Àμö·Î ¿ä±¸ÇÑ´Ù. ÀÌ ÇÔ¼öÀÇ ³»ºÎ ÄÚµå´Â ¾Æ¸¶ ´ÙÀ½°ú °°À» °ÍÀÌ´Ù.

 

if (prt->left < pt.x && prt->right > pt.x && prt->top < pt.y && prt->bottom > pt.y)

   return TRUE;

else

   return FALSE;

 

pt.x°¡ left¿Í right »çÀÌ¿¡ ÀÖ°í pt.y°¡ top°ú bottom »çÀÌ¿¡ ÀÖÀ» ¶§¸¸ ÀÌ Á¡ÀÌ »ç°¢ ¿µ¿ª ³»ºÎ¿¡ ÀÖ´Ù°í ÆÇ´ÜÇÑ´Ù. ÀÌ Á¶°ÇÀ» ¸¸Á·ÇÏ·Á¸é left°¡ rightº¸´Ù ¿ÞÂÊ¿¡ ÀÖ°í topÀÌ bottomº¸´Ù´Â ´õ À§ÂÊ¿¡ ÀÖ¾î¾ß ÇÑ´Ù. ±×·±µ¥ µå·¡±× ¹æÇâÀ» ¹Ù²Ù¾î ¹ö¸®¸é ÀÌ Á¶°ÇÀ» Àý´ë·Î ¸¸Á·ÇÒ ¼ö ¾ø´Ù. leftº¸´Ù ´õ Å« x°¡ leftº¸´Ù ´õ ÀÛÀº rightº¸´Ù °áÄÚ ´õ ÀÛÀ» ¼ö ¾ø±â ¶§¹®ÀÌ´Ù.

PtInRect ÇÔ¼ö´Â Àμö·Î Àü´ÞµÈ »ç°¢ÇüÀÌ Á¤±ÔÈ­µÇ¾î ÀÖ´Ù°í °¡Á¤Çϱ⠶§¹®¿¡ ÀÌ ÇÔ¼ö¸¦ °è¼Ó »ç¿ëÇÏ·Á¸é Á¤±ÔÈ­ Á¶°ÇÀ» ¸¸Á·½ÃÄÑ¾ß ÇÑ´Ù. µµÇüÀÇ ¿µ¿ªÀÌ °áÁ¤µÇ´Â ½ÃÁ¡Àº AppendObject ÇÔ¼ö¿¡¼­À̹ǷΠÀÌ ÇÔ¼ö¿¡¼­ Àü´ÞµÈ ÁÂÇ¥¸¦ ¹Ù·Î ´ëÀÔÇÏÁö ¸»°í Á¤±ÔÈ­ÇÑ ÈÄ ´ëÀÔÇϸé ÀÏ´Ü ¹®Á¦°¡ ÇØ°áµÈ´Ù.

 

BOOL AppendObject(DTool Type,int x1,int y1,int x2,int y2)

{

   ....

   arObj[arNum]=(DObject *)malloc(sizeof(DObject));

   arObj[arNum]->Type=Type;

   SetRect(&arObj[arNum]->rt,x1,y1,x2,y2);

   arObj[arNum]->rt.left=min(x1,x2);

   arObj[arNum]->rt.right=max(x1,x2);

   arObj[arNum]->rt.top=min(y1,y2);

   arObj[arNum]->rt.bottom=max(y1,y2);

   arNum++;

   return TRUE;

}

 

left´Â x1, x2Áß ÀÛÀº °ªÀ» ÃëÇÏ°í right´Â x1, x2Áß Å« °ªÀ» ÃëÇϸé Ç×»ó left°¡ rightº¸´Ù ¿ÞÂÊ¿¡ ÀÖ°Ô µÉ °ÍÀÌ´Ù. ¼öÁ÷ÂÊÀ¸·Îµµ ¸¶Âù°¡Áö·Î topÀÌ bottomº¸´Ù Ç×»ó ´õ À§ÂÊ¿¡ ÀÖµµ·Ï Á¶Á¤Çß´Ù. ÀÌ·¸°Ô ÇÏ¸é µå·¡±×ÇÑ ¹æÇâ¿¡ »ó°ü¾øÀÌ »ç°¢ÇüÀº Ç×»ó Á¤±ÔÈ­µÇ¾î Á»ó´Ü¿¡¼­ ¿ìÇÏ´ÜÀ¸·Î µå·¡±×ÇÑ °Íó·³ ±â·ÏµÈ´Ù. ´Ù¾çÇÑ ÇüÅ·ΠÁ¸ÀçÇÏ´Â µ¥ÀÌÅ͸¦ Á» ´õ ´Ù·ç±â ½¬¿î ÀÏÁ¤ÇÑ ÇüÅ·Πº¯È¯ÇÏ´Â °ÍÀ» Á¤±ÔÈ­(Normalization)¶ó Çϴµ¥ ÇÑ°¡Áö ¸ð¾çÀÇ »ç°¢Çü¸¸ Á¸ÀçÇϵµ·Ï ÇÔÀ¸·Î½á ´Ù¸¥ ºÎºÐÀÇ Äڵ尡 ÈξÀ ´õ ´Ü¼øÇØÁø´Ù.

ÀÌ ¹æ¹ý ´ë½Å FindObject¿¡¼­ µµÇüÀÇ ¿µ¿ªÀ» »ç¿ëÇÒ ¶§ arObjÀÇ rt¿¡ ´ëÇÑ »çº»À» º¹»çÇÑ ÈÄ »çº»À» Á¤±ÔÈ­ÇÏ¿© ºñ±³ÇÒ ¼öµµ ÀÖ´Ù. AppendObjectÀÇ Äڵ带 Àá½Ã ÁÖ¼® ó¸®ÇØ ³õ°í ´ÙÀ½ Å×½ºÆ® Äڵ带 ÀÛ¼ºÇØ º¸ÀÚ.

 

int FindObject(int x, int y)

{

   int idx;

   POINT pt;

   RECT trt;

 

   pt.x=x;

   pt.y=y;

   for (idx=arNum-1;idx>=0;idx--) {

      trt.left=min(arObj[idx]->rt.left,arObj[idx]->rt.right);

      trt.right=max(arObj[idx]->rt.left,arObj[idx]->rt.right);

      trt.top=min(arObj[idx]->rt.top,arObj[idx]->rt.bottom);

      trt.bottom=max(arObj[idx]->rt.top,arObj[idx]->rt.bottom);

      if (PtInRect(&trt,pt)==TRUE) {

          return idx;

      }

   }

   return -1;

}

 

ÀÌ·¸°Ô Çصµ ÀÏ´ÜÀº Àß µ¿ÀÛÇϴµ¥ ¾îÂ÷ÇÇ °Ë»öÇÒ ¶§ Á¤±ÔÈ­µÇ¹Ç·Î ¾Æ¹« ¹®Á¦°¡ ¾ø´Ù. µµÇüÀ» ±â·ÏÇÒ ¶§ ¾Æ¿¹ Á¤±ÔÈ­¸¦ Çؼ­ ±â·ÏÇÒ °ÍÀÎÁö ¾Æ´Ï¸é ºñ±³ÇÒ ¶§¸¸ Àá½Ã Á¤±ÔÈ­¸¦ ÇÒ °ÍÀÎÁö°¡ ´Ù¸¥µ¥ ºñ±³ÇÒ ¶§¸¶´Ù Á¤±ÔÈ­¸¦ ÇÏ·Á¸é ±×¸¸Å­ ¼ÓµµÀÇ ³¶ºñ°¡ ÀÖÀ¸¹Ç·Î ±â·ÏÇÒ ¶§ Á¤±ÔÈ­¸¦ ÇÏ´Â °ÍÀÌ ´õ ÇÕ¸®ÀûÀÌ´Ù. ±â·ÏÀº ¾î¼´Ù ÇѹøÀÌÁö¸¸ °Ë»öÀº ¼±ÅÃ, Ä¿¼­ º¯°æ µî ¼ö½Ã·Î ÇØ¾ß ÇϹǷΠ°¡±ÞÀûÀ̸é Ƚ¼ö°¡ ÀÛÀº ÂÊ¿¡¼­ Á¤±ÔÈ­¸¦ ÇÏ´Â °ÍÀÌ ÁÁ´Ù. ApiDraw´Â AppendObject¿¡¼­ Á¤±ÔÈ­¸¦ ÇÏ´Â ¹æ½ÄÀ» äÅÃÇϱâ·Î ÇÑ´Ù.

ÀÌ·¸°Ô Äڵ带 ¼öÁ¤ÇÑ ÈÄ Å×½ºÆ®ÇØ º¸¸é Ÿ¿øÀ̳ª »ç°¢ÇüÀº º° ¹®Á¦¾øÀÌ ±×·ÁÁö±âµµ ÇÏ°í ¼±Åõµ Àß µÇÁö¸¸ Á÷¼±ÀÇ °æ¿ì´Â ¹«Á¶°Ç Á¤±ÔÈ­µÇ¾î ¹ö¸®±â ¶§¹®¿¡ ¿ìÇÏÇâÀÇ Á÷¼±¸¸ ±×·ÁÁø´Ù. Á÷¼±Àº µå·¡±× ¹æÇâ¿¡ µû¶ó ¿ìÇÏÇâ, ÁÂÇÏÇ⠵Π°¡Áö ¸ð¾çÀÌ ÀÖ¾î Á¤±ÔÈ­¿¡ µû¸¥ ºÎÀÛ¿ëÀÌ »ý±ä´Ù. ±×·¡¼­ Á÷¼±ÀÇ °æ¿ì´Â »ç¿ëÀÚ°¡ ¸¶¿ì½º¸¦ µå·¡±×ÇÑ ¹æÇâÀ» µû·Î ±â¾ïÇØ µÎ°í ¹æÇâ¿¡ µû¶ó µµÇüÀ» ´Ù¸£°Ô ±×·Á¾ß ÇÑ´Ù.

 

#define DS_LT 0

#define DS_RT 1

#define DS_LB 2

#define DS_RB 3

....

struct DObject

{

   DTool Type;

   RECT rt;

   unsigned short Flag;

};

 

DS_* ¸ÅÅ©·Î´Â µå·¡±×¸¦ ½ÃÀÛÇÑ ½ÃÀÛÁ¡ÀÌ¸ç °¢ µµÇü¿¡ ÀÌ Á¤º¸¸¦ ±â¾ïÇÏ´Â Flag¶ó´Â ¸â¹ö¸¦ Ãß°¡ÇÑ´Ù. AppendObject¿¡¼­ Àü´ÞµÈ ÁÂÇ¥ÀÇ ´ë¼Ò¸¦ Æò°¡ÇÏ¿© µå·¡±×ÇÑ ¹æÇâÀ» ±â·ÏÇϵµ·Ï ÇÑ´Ù.

 

BOOL AppendObject(DTool Type,int x1,int y1,int x2,int y2)

{

   ....

   arObj[arNum]->rt.left=min(x1,x2);

   arObj[arNum]->rt.right=max(x1,x2);

   arObj[arNum]->rt.top=min(y1,y2);

   arObj[arNum]->rt.bottom=max(y1,y2);

   if (x1<x2) {

      if (y1<y2) {

          arObj[arNum]->Flag=DS_LT;

      } else {

          arObj[arNum]->Flag=DS_LB;

      }

   } else {

      if (y1<y2) {

          arObj[arNum]->Flag=DS_RT;

      } else {

          arObj[arNum]->Flag=DS_RB;

      }

   }

   arNum++;

   return TRUE;

}

 

ÀÌ·¸°Ô ÇÏ¸é »ç°¢ ¿µ¿ªµµ Á¤±ÔÈ­µÇ°í µå·¡±×¸¦ ½ÃÀÛÇÑ ÁöÁ¡µµ ¾Ë ¼ö ÀÖ´Ù. OnPaint¿¡¼­ Á÷¼±À» ±×¸± ¶§´Â Flag¸¦ ÂüÁ¶Çؼ­ ¹æÇâÀ» °áÁ¤ÇÑ´Ù.

 

      case DT_LINE:

          if ((arObj[idx]->Flag & 0x3) == DS_LT || (arObj[idx]->Flag & 0x3) == DS_RB) {

             MoveToEx(hdc,arObj[idx]->rt.left,arObj[idx]->rt.top,NULL);

             LineTo(hdc,arObj[idx]->rt.right,arObj[idx]->rt.bottom);

          } else {

             MoveToEx(hdc,arObj[idx]->rt.left,arObj[idx]->rt.bottom,NULL);

             LineTo(hdc,arObj[idx]->rt.right,arObj[idx]->rt.top);

          }

          break;

 

DS_LT, DS_RBÀÏ ¶§´Â ¿ìÇÏÇâÀÇ Á÷¼±À» ±×¸®°í DS_LB, DS_RTÀÏ ¶§´Â ¿ì»óÇâÀÇ Á÷¼±À» ±×·È´Ù. Â÷ÈÄ Á÷¼±³¡¿¡ È­»ìÇ¥ Àå½ÄÀ» ´Þ°Å³ª ÇÒ ¶§ ÀÌ Á¤º¸°¡ À¯¿ëÇÏ°Ô »ç¿ëµÉ °ÍÀÌ´Ù. Flag ¸â¹ö´Â ÃÑ 16ºñÆ® ±æÀ̸¦ °¡Áö¸ç µå·¡±× ½ÃÀÛÁ¡Àº ±× Áß ÇÏÀ§ 2ºñÆ®¸¸À» »ç¿ëÇϹǷΠ³ª¸ÓÁö 14ºñÆ®´Â µµÇüÀÇ ¶Ç ´Ù¸¥ ¼Ó¼ºÀ» ±â·ÏÇÏ´Â ¿ëµµ·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¡¼­ Flag·ÎºÎÅÍ ¹æÇâÀ» ÀÐÀ» ¶§ & 03(ÀÌÁø¼ö·Î 11) ¿¬»êÇÏ¿© ÇÏÀ§ 2ºñÆ®¸¸ Á¡°ËÇÏ¿© Â÷ÈÄ¿¡ »óÀ§ ºñÆ®°¡ ´Ù¸¥ ¿ëµµ·Î »ç¿ëµÇ´õ¶óµµ ¿µÇâÀ» ¹ÞÁö ¾Êµµ·Ï Çß´Ù. AppendObject¿¡¼­ Flag¿¡ ´Ù¸¥ °ªµµ °°ÀÌ ±â·ÏÇÏ·Á¸é ÀÌÈĺÎÅÍ ÀÌ °ª¿¡ ¿øÇÏ´Â °ªÀ» ORÇØ¾ß ÇÑ´Ù.