Ä­Åä¾î ¸ÕÁö

 °íÀüÀû ÇÁ·¢Å» °¡¿îµ¥ °¡Àå ¿À·¡µÈ °Í ÁßÀÇ Çϳª°¡ Ä­Åä¾î ¸ÕÁö·Î 1872³â¿¡ µ¶ÀÏÀÇ ¼öÇÐÀÚ Ä­Åä¾î¿¡ ÀÇÇØ ¹ßÇ¥µÇ¾ú´Ù. Ä­Åä¾î ¸ÕÁö¸¦ Ä­Åä¾î ÁýÇÕ(Cantor Set)À̶ó°íµµ ÇÑ´Ù.

Ãß°¡ÇÒ ÄÚµå´Â ´ÙÀ½ÀÇ µÎ °³ÀÇ ÇÔ¼ö¿Í ¿ÜºÎº¯¼ö ÇϳªÀÌ´Ù. ºä¿¡¸¸ Ãß°¡ÇÏ¸é µÇ°Ú´Ù. MyRectangle ÇÔ¼ö¿¡¼­ ¸¶Áö¸· ÀÎÀÚ´Â ³×¸ð¸¦ ±×¸° ÈÄ ³»ºÎ¸¦ Ä¥ÇÏ´ÂÁöÀÇ ¿©ºÎ¸¦ ³ªÅ¸³»´Â °ÍÀÌ´Ù. ¸¸¾à ÀÌ °ªÀ» 0À¸·Î ÁÖ¸é ¼ÓÀ» ä¿ì°í, 0ÀÌ ¾Æ´Ñ °ªÀ» ÁÖ¸é ¼ÓÀÌ ºó »ç°¢ÇüÀ» ±×¸°´Ù.

const int N = 95;

void CContorView::MyRectangle(CDC *pDC, int left, int top, int right, int bottom, int IsTrans)
{
        if(IsTrans) {
                pDC->MoveTo(left, top);
                pDC->LineTo(right, top);
                pDC->LineTo(right, bottom);
                pDC->LineTo(left, bottom);
                pDC->LineTo(left, top);
        }
        else
                pDC->Rectangle(left, top, right, bottom);
}

void CContorView::Contor(CDC *pDC, int x, int y, int r)
{
        if(r>0) {
                MyRectangle(pDC, x, y, x+N, y+r, 0);

                Contor(pDC, x+N+10, y, r/3);
                Contor(pDC, x+N+10, y+r*2/3, r/3);
        }
}

 ½ÇÁ¦·Î È­¸é¿¡ ±×¸®´Â ÇÔ¼öÀÎ OnDraw´Â ´ÙÀ½°ú °°´Ù. ³»ºÎ¸¦ ¹àÀº ³ì»öÀ¸·Î ä¿ü´Ù. Contor ÇÔ¼ö¿¡¼­ 4¹øÂ° ÀÎÀÚ¸¦ ÀûÀýÈ÷ ¹Ù²Ù¾î¼­ ÄÄÆÄÀÏÇØ º¸¸é »óÇÏ ±æÀ̰¡ ¹Ù²ï´Ù.(¿©±â¼­´Â 100À» ÁÖ¾ú´Ù.)

void CContorView::OnDraw(CDC* pDC)
{
        CContorDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        // TODO: add draw code for native data here
        CBrush brush, *pOldBrush;
        
        brush.CreateSolidBrush(RGB(0x90, 0xEE, 0x90));
        pOldBrush = (CBrush *)pDC->SelectObject(&brush);
        
        Contor(pDC, 0, 0, 100);
        pDC->SelectObject(pOldBrush);

}

 

½Ã¾îÇɽºÅ° ¾çźÀÚ

¿ª»ç·Î µûÁö¸é Ä­Åä¾î ¸ÕÁö(1872³â) ´ÙÀ½Àº ÄÚÈ£ °î¼±(1904³â) ¼øÀ̳ª ¿ì¼± ÄÚÈ£ °î¼± ´ÙÀ½ ¼ø¿¡ ÇØ´çÇÏ´Â ½Ã¾îÇɽºÅ° ¾çźÀÚ(1910³â´ë ¸»)¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ.

 

     <A=0.9 ÀÏ °æ¿ì>                   <A=10 ÀÏ °æ¿ì>

¿©±â¼­ Ãß°¡ÇØ¾ß ÇÒ ÄÚµå´Â ´ÙÀ½¿¡ º¸µíÀÌ ¿ÜºÎ º¯¼ö A Çϳª¿Í s_carpet À̶õ ÇÔ¼ö ÇϳªÀÌ´Ù. ±×¸®°í ¾Õ¼­ Ä­Åä¾î ¸ÕÁö¿¡¼­ ÀÛ¼ºÇß´ø MyRectangle ÇÔ¼ö´Â ±×´ë·Î »ç¿ëÇÏ¿´´Ù.

 

float A = 10;

void CContorView::s_carpet(CDC *pDC, int x, int y, float r)
{
        if(r > A) {
                MyRectangle(pDC, int(x-r/6), int(y-r/6), int(x+r/6), int(y+r/6), 0);

                s_carpet(pDC, int(x-r/3), int(y-r/3), r/3);  // »óÁÂ
                s_carpet(pDC,     x,      int(y-r/3), r/3);  // »óÁß
                s_carpet(pDC, int(x+r/3), int(y-r/3), r/3);  // »ó¿ì
                s_carpet(pDC, int(x-r/3),     y,      r/3);  // ÁßÁÂ
                s_carpet(pDC, int(x+r/3),     y,      r/3);  // Áß¿ì
                s_carpet(pDC, int(x-r/3), int(y+r/3), r/3);  // ÇÏÁÂ
                s_carpet(pDC,     x,      int(y+r/3), r/3);  // ÇÏÁß
                s_carpet(pDC, int(x+r/3), int(y+r/3), r/3);  // ÇÏ¿ì
        }
}

 OnDraw ÇÔ¼ö´Â ¾Õ¼­ÀÇ Ä­Åä¾î ¸ÕÁö¿Í µ¿ÀÏÇÏÁö¸¸ Contor ÇÔ¼ö ´ë½Å¿¡ s_carpet ÇÔ¼ö¸¦ »ç¿ëÇÑ °Í¸¸ ´Ù¸£´Ù. ¿ÜºÎ º¯¼ö A °ªÀ» 0.3¿¡¼­ 10 »çÀÌÀÇ °ª Áß¿¡¼­ Àû´çÈ÷ ¹Ù²Ù¾î º¸¸é ¾à°£¾¿ ¸ð¾çÀÌ º¯ÇÏ´Â °ÍÀ» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

void CContorView::OnDraw(CDC* pDC)
{
        CContorDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        // TODO: add draw code for native data here
        CBrush brush, *pOldBrush;
        
        brush.CreateSolidBrush(RGB(0x90, 0xEE, 0x90));
        pOldBrush = (CBrush *)pDC->SelectObject(&brush);
        
        s_carpet(pDC, 100, 100, 200);
        pDC->SelectObject(pOldBrush);
}

 

»ç¼±ÀÇ ¾Æ·¡

  

       < B = 1 ÀÎ °æ¿ì >                            < B = 5 ÀÎ °æ¿ì >

±×¸²¿¡¼­ º¼¼ö ÀÖµíÀÌ ´ë°¢¼±ÀÇ ¾Æ·¡¿¡ »ç°¢ÇüÀÌ »ö±òº°·Î ±×·ÁÁø ÇÁ·¢Å»ÀÌ´Ù. Äڵ忡¼­´Â âÀÇ Å©±â¸¦ Á¦ÇÑÇÏÁö ¾Ê¾Ò±â ¶§¹®¿¡ ¾Æ·¡Âʰú ¿À¸¥ÂÊÀ¸·Î ±×¸²ÀÌ Á» »ßÁ®³ª°¥ °ÍÀÌ´Ù. SelectColor ÇÔ¼ö´Â µµ½º¿¡¼­ÀÇ 16Ä÷¯¸¦ º»µû¼­ ¸¸µé¾î º» ÇÔ¼öÀÌ´Ù. µµ½º¿¡¼­ÀÇ 16 Ä÷¯¿¡¼­ Light Red ¿Í Light Magenta ¶ó´Â »öÀº ½ÇÁ¦·Î ¾ø´Â °Í °°´Ù. ±×·¡¼­ ÀÓÀÇ·Î ´Ù¸¥ »öÀ» ¼±Á¤Çß´Ù.

´ÙÀ½¿¡ º¸ÀÎ ÄÚµå´Â ¿ÜºÎº¯¼ö Çϳª¿Í ÇÔ¼ö 2°³¸¦ Ãß°¡ÇÑ °ÍÀÌ´Ù. ¿ÜºÎº¯¼ö B¸¦ Àû´çÈ÷ ¹Ù²Ù¾î ÁÖ¸é ¸ð¾çÀÌ Á¶±Ý¾¿ ¹Ù²î´Â °ÍÀ» º¼ ¼ö ÀÖ´Ù.

float B=5;
 
void CContorView::SaSunARe(CDC *pDC, int x, int y, float r, int n)
{
        CBrush brush, *pOldBrush;

        brush.CreateSolidBrush(SelectColor(n%6+9));
        pOldBrush = (CBrush *)pDC->SelectObject(&brush);
        
        MyRectangle(pDC, x, y, int(x+r*B), int(y+r*B), 0);
        pDC->SelectObject(pOldBrush);

        if(r > 0.5) {
                SaSunARe(pDC, int(x-r*2/3), int(y+r/2), r/2, n+1);
                SaSunARe(pDC, int(x+r*2/3), int(y-r/2), r/2, n+1);
        }
}

COLORREF CContorView::SelectColor(int n)
{
        switch(n) {
        case 0 : return RGB(0, 0, 0);       // BLACK
        case 1 : return RGB(0, 0, 255);     // BLUE        
        case 2 : return RGB(0, 255, 0);     // GREEN       
        case 3 : return RGB(0, 255, 255);   // CYAN        
        case 4 : return RGB(255, 0, 0);     // RED         
        case 5 : return RGB(255, 0, 255);   // MAGENTA     
        case 6 : return RGB(165, 42, 42);   // BROWN       
        case 7 : return RGB(211, 211, 211); // LIGHTGRAY   
        case 8 : return RGB(169, 169, 169); // DARKGRAY    
        case 9 : return RGB(173, 216, 230); // LIGHTBLUE   
        case 10 : return RGB(144, 238, 144); // LIGHTGREEN   
        case 11 : return RGB(224, 255, 255); // LIGHTCYAN    
        case 12 : return RGB(255, 182, 193); // LIGHGTPINK    
        case 13 : return RGB(255, 160, 122); // LIGHTSAMON
        case 14 : return RGB(255, 255, 0);   // YELLOW       
        case 15 : return RGB(255, 255, 255); // WHITE       
        }
}

À̹ø¿¡ OnDraw ÇÔ¼ö¿¡ ½á ÁÙ ³»¿ëÀº ´Ü ÇÑ ÁÙ »ÓÀÌ´Ù. SaSunARe ÇÔ¼öÀÇ µÎ ¹øÂ°¿Í ¼¼ ¹øÂ° ÀÎÀڴ óÀ½ ±×·ÁÁö´Â »ç°¢Çü(°¡Àå Å« »ç°¢Çü)ÀÇ ¿ÞÂÊ »ó´Ü ÁÂÇ¥À̰í, ³× ¹øÂ° ÀÎÀÚ´Â ±× »ç°¢ÇüÀÇ ÇÑ º¯ÀÇ ±æÀ̰¡ µÈ´Ù. ÀÌ °ªµéÀ» Àû´çÈ÷ ¹Ù²Ù¾î ÁÖ¸é ¸ð¾çÀÌ ¶Ç ¹Ù²î°Ô µÈ´Ù.

void CContorView::OnDraw(CDC* pDC)
{
        CContorDoc* pDoc = GetDocument();
        ASSERT_VALID(pDoc);
        // TODO: add draw code for native data here
        SaSunARe(pDC, 100, 100, 100 , 0);
}

 

ºÒ°ÅÁø dz¼±

 

        < B = 1 ÀÎ °æ¿ì >                       < B = 5 ÀÎ °æ¿ì >

 À§ÀÇ '»ç¼±¾Æ·¡' ÀÇ Äڵ忡¼­ Á¶±Ý¸¸ ¹Ù²Ù¾î ÁÖ¸é À§¿Í °°Àº ±×¸²ÀÌ µÈ´Ù. ¹Ù²ï ³»¿ëÀº ÇÔ¼ö Çϳª°¡ Ãß°¡µÈ °Í°ú SaSunARe ÇÔ¼ö¿¡¼­ ±½Àº ±Û¾¾ºÎºÐÀÌ ¹Ù²ï °ÍÀÌ´Ù. ±× ¿Ü OnDraw ÇÔ¼öÀÇ ³»¿ëÀº µ¿ÀÏÇÏ´Ù. ±×·¯´Ï±î »ç°¢Çü ´ë½Å¿¡ ¿øÀ» ±×¸° °ÍÀÌ´Ù. ±×¸®°í FillEllipse ÇÔ¼öÀÇ ÀÎÀÚ¿¡ ŸÀÔ Ä³½ºÆÃÀ» ÇÑ °Ç ±×Àú °æ°í ¸Þ½ÃÁö¸¦ ÁÙ¿©º¸±â À§ÇÑ °ÍÀÌ´Ù. ŸÀÔ Ä³½ºÆÃÀ» ÇÏÁö ¾Ê¾Æµµ ÀüÇô »ó°ü¾ø´Ù. ¹°·Ð °æ°í ¸î °³°¡ ¶ß°ÚÁö¸¸ È¿°ú´Â °°À» °ÍÀÌ´Ù.

float B=5;
 
void CContorView::SaSunARe(CDC *pDC, int x, int y, float r, int n)
{
        CBrush brush, *pOldBrush;

        brush.CreateSolidBrush(SelectColor(n%6+9));
        pOldBrush = (CBrush *)pDC->SelectObject(&brush);
        
        //MyRectangle(pDC, x, y, int(x+r*B), int(y+r*B), 0);
        FillEllipse(pDC, x, y, int(r*B), int(r));
        pDC->SelectObject(pOldBrush);

        if(r > 1) {
                SaSunARe(pDC, int(x-r*2/3), int(y+r/2), r/2, n+1);
                SaSunARe(pDC, int(x+r*2/3), int(y-r/2), r/2, n+1);
        }
}

COLORREF CContorView::SelectColor(int n)
{
        switch(n) {
        case 0 : return RGB(0, 0, 0);       // BLACK
        case 1 : return RGB(0, 0, 255);     // BLUE        
        case 2 : return RGB(0, 255, 0);     // GREEN       
        case 3 : return RGB(0, 255, 255);   // CYAN        
        case 4 : return RGB(255, 0, 0);     // RED         
        case 5 : return RGB(255, 0, 255);   // MAGENTA     
        case 6 : return RGB(165, 42, 42);   // BROWN       
        case 7 : return RGB(211, 211, 211); // LIGHTGRAY   
        case 8 : return RGB(169, 169, 169); // DARKGRAY    
        case 9 : return RGB(173, 216, 230); // LIGHTBLUE   
        case 10 : return RGB(144, 238, 144); // LIGHTGREEN   
        case 11 : return RGB(224, 255, 255); // LIGHTCYAN    
        case 12 : return RGB(255, 182, 193); // LIGHGTPINK    
        case 13 : return RGB(255, 160, 122); // LIGHTSAMON
        case 14 : return RGB(255, 255, 0);   // YELLOW       
        case 15 : return RGB(255, 255, 255); // WHITE       
        }
}

void CContorView::FillEllipse(CDC *pDC, int x, int y, int xr, int yr)
{
        pDC->Ellipse(x-xr, y-yr, x+xr, y+yr);
}