Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom
Bar]
[Photo of the
Author]
Miguel Angel Sepúlveda
ÇÊÀÚ ¼Ò°³: 1993³â¿¡ ¿ö½ÌÅÏ´ëÇÐ(¹Ì±¹)À» Á¹¾÷Çß´Ù. ½ºÆäÀÎ, À̽º¶ó¿¤, ÀϺ», ¹Ì±¹¿¡¼­ °úÇבּ¸ ºÐ¾ß¿¡¼­ ÀÏÇÑ´Ù. Ä¿³Î 0.98ÂëºÎÅÍ ¸®´ª½º¸¦ ¾Ë°Ô µÇ¾ú´Ù. (ù´«¿¡ ¹ÝÇß´Ù) ÇöÀç´Â ÀÚÀ¯ ½Ã°£¿¡ ¸®´ª½º Æ÷Ä¿½ºÀÇ ÆíÁýÀåÀ¸·Î ÀÏÇÑ´Ù.

ÇÊÀÚ¿¡°Ô ¿¬¶ôÇϱâ

µé¾î°¡´Â ±Û

Á¡Âï±â

¼±°ú ´Ù°¢Çü ±×¸®±â

¿¬½À

´ÙÀ½ ¿¬Àç¿¡´Â

OpenGLÇÁ·Î±×·¡¹Ö:°£´ÜÇÑ ´Ù°¢Çü ·£´õ¸µ

¿ä¾à: OpenGLÇÁ·Î±×·¡¹Ö ù ¿¬Àç·Î °£´ÜÇÑ ·£´õ¸µÀÛ¾÷¿¡ ´ëÇÏ¿© ¾Ë¾Æº¾´Ï´Ù.




µé¾î°¡´Â ±Û

ÀÌ ±ÛÀº 2Â÷¿ø/3Â÷¿ø ±×·¡ÇÈÀÇ »ê¾÷°èÇ¥ÁØÀÎ OpenGL¿¡ °üÇÑ ¿¬Àç±â»çÁß Ã¹¹ø° ±ÛÀÌ´Ù. ('OpenGLÀ̶õ ¹«¾ùÀΰ¡?'¶ó´Â ±Ûµµ ÇÔ²² ÀÖ´Ù.) ÀÌ ±ÛÀ» Àд ¿©·¯ºÐÀº ¿©·¯ºÐÀÇ C°³¹ßÇ÷§Æû¿¡ ÀÌ¹Ì Àͼ÷ÇÏ°í GLUT¶óÀ̺귯¸®¿¡ ¾à°£ÀÇ Áö½ÄÀ» °¡Áö°í ÀÖ´Ù°í »ý°¢ÇÏ°í ¼³¸íÇÏ°Ú´Ù.(¸¸¾à óÀ½ Á¢ÇÑ´Ù¸é ¸®´ª½ºÆ÷Ä¿½ºÀÇ "GLUTÇÁ·Î±×·¡¹Ö"À̶õ ±ÛÀ» ¸ÕÀú Àб⠹ٶõ´Ù.) ÇÊÀÚ´Â ¸®´ª½º¿¡¼­ ÀÚÀ¯·Ó°Ô »ç¿ëÇÒ ¼ö Àִ ȯ»óÀûÀÎ OpenGLÀÇ µ¿ÀÛÀ» º¸¿©ÁÖ´Â Mesa¶óÀ̺귯¸®¸¦ ÀÌ¿ëÇ϶ó°í ÃßõÇÑ´Ù. Mesa¸¦ Çϵå¿þ¾îÀûÀ¸·Î Áö¿øÇÏ´Â Á¦Ç°µµ ÀÌ¹Ì ³ª¿À°í ÀÖ´Ù.(°ü·Ã ±ÛÀÎ '3Dfx ±×·¡ÇÈÄ«µå'¸¦ Àо¶ó.)

»õ·Î¿î OpenGL ¸í·É¾î´Â ±× ±â´ÉÀ» ¿¹Á¦¸¦ ÅëÇÏ¿© ¼öÇàµÇ´Â ¸ð½ÀÀ» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ¹°·Ð ¿ì¸®µµ ÀÌ·¸°Ô ÇÒ °ÍÀÌ´Ù. ÀÌ ¿¬ÀçÀÇ ¸¶Áö¸·¿¡´Â ¿ÏÀüÈ÷ OpenGL·Î ¾²¿©Áø °ÔÀÓ ½Ã¹Ä·¹À̼ÇÀÇ ¼Ò½ºÄڵ带 º¸°Ô µÉ °ÍÀÌ´Ù.

±ÛÀ» ½ÃÀÛÇϱ⿡ ¾Õ¼­ ¸ÕÀú ÇÊÀÚ´Â °úÇÐÀÚÀ̹ǷΠOpenGLÀ» »ç¿ëÇÑ °æÇèµé ´ë´Ù¼ö´Â ½ÇÁ¦ ÀÔÀÚ³ª °íÀüÀû ½Ã½ºÅÛÀ» ½Ã¹Ä·¹À̼ÇÇϱâ À§ÇÑ µµ±¸·Î »ç¿ëÇß´ø °æ¿ì¶ó´Â °ÍÀ» ¹àÇôµÐ´Ù. ±×·¡¼­ ±×·±Áö ÇÊÀÚ°¡ ¾²´Â ±ÛÀÇ ¿¹Á¦µéÀº Á» ±×·±ÂÊÀ¸·Î Ä¡¿ìÄ£ °¨µµ ¾øÁö¾Ê¾Æ ÀÖ´Ù ;-) ¿©·¯ºÐÀÌ ´Ù¸¥ Á¾·ùÀÇ ¿¹¸¦ º¸°í½Í´Ù¸é ÇÊÀÚ¿¡°Ô ¾Ë·ÁÁֱ⠹ٶõ´Ù.

OpenGLÀº ´ëºÎºÐ 3Â÷¿ø ±×·¡ÇÈÀ̳ª ȯ»óÀûÀΠƯ¼öÈ¿°ú, Çö½Ç°ú À¯»çÇÑ ±¤¿øÈ¿°ú¸¦ °¡Áø º¹ÀâÇÑ Çü»óµî°ú °ü·ÃµÇ¾î ÀÖ´Ù. ±×·¯³ª OpenGLÀº 2Â÷¿ø ±×·¡ÇÈÀ» ·»´õ¸µÇØÁÖ´Â ±â´Éµµ ÀÖ´Ù. º¹ÀâÇÑ 3Â÷¿ø Åõ½Ã¹ýÀ̳ª ¸ðµ¨ ·£´õ¸µ, ±¤¿øÈ¿°ú, Ä«¸Þ¶ó À§Ä¡ µîµîÀ» ¹è¿ì±â Àü¿¡ 2Â÷¿ø¿¡¼­ ÇÒ ¼ö ÀÖ´Â °ÍµéÁß¿¡µµ ¿©·¯ºÐÀÌ ¾Ë¾ÆµÎ¾î¾ß ÇÒ °ÍÀÌ ¸¹´Ù´Â Á¡À» ¸í½ÉÇØ¾ß ÇÑ´Ù. ¸¹Àº °úÇÐ/°øÇÐ ÀÀ¿ëÇÁ·Î±×·¥Àº 2Â÷¿ø¿¡¼­ ·£´õ¸µµÇ¾îÁø´Ù. ±×·¡¼­ °£´ÜÇÑ 2Â÷¿ø ¾Ö´Ï¸ÞÀ̼ÇÀ» ¸¸µå´Â ¹æ¹ýÀ» »ìÆ캸±â·Î ÇÏÀÚ.

Á¡ Âï±â

OpenGLÀº Á¡,¼±, ´Ù°¢Çü°ú °°Àº ¸î°³ÀÇ ±âÇÏÇÐÀû ¿ä¼Ò¸¸À» °¡Áö°í ÀÖ´Ù. ÀÌ·¯ÇÑ ±âÇÏÇÐÀû ¿ä¼ÒµéÀº ±×µéÁ¦°¢°¢ÀÇ Á¤Á¡µé·Î Ç¥ÇöµÈ´Ù. ÇÑ Á¡(vertex)Àº 2°³ ¶Ç´Â 3°³ÀÇ ½Ç¼ö°ªÀ¸·Î ³ªÅ¸³»´Âµ¥, Á÷±³ÁÂÇ¥°è¿¡¼­ 2Â÷¿ø Á¡Àº (x,y)·Î, 3Â÷¿ø Á¡Àº (x, y, z)·Î Ç¥ÇöµÈ´Ù. Á÷±³ÁÂÇ¥°è´Â °¡Àå ÀϹÝÀûÀÎ ÁÂÇ¥°èÀÌ´Ù. ±×·¯³ª ÄÄÇ»ÅÍ ±×·¡ÇȺо߿¡¼­´Â 4°³ÀÇ ½Ç¼ö°ª (x, y, z, w)·Î Ç¥ÇöµÇ´Â È£¸ðÁö´Ï¾î½º ÁÂÇ¥°è¿ª½Ã ÀÚÁÖ »ç¿ëµÈ´Ù. ¸ÕÀú 3Â÷¿ø ·£´õ¸µÀÇ ¸î°¡Áö ±âº» °³³äÀ» »ìÆ캸°í ´Ù½Ã À̾߱â Çϵµ·Ï ÇÏÀÚ.

OpenGL¿¡¼­ ¸ðµç ±âÇÏÇÐÀû ¹°Ã¼´Â ÀÏÁ¤ÇÑ ¼ø¼­¸¦ °¡Áø Á¤Á¡µéÀÇ ÁýÇÕÀ¸·Î Ç¥ÇöµÇ±â ¶§¹®¿¡ Á¤Á¡À» ¼±¾ðÇÏ´Â ·çƾÀÌ ÀÖ´Ù. ±× »ç¿ë¹ýÀº ´ÙÀ½°ú °°´Ù.:

void glVertex{234}{sifd}[v](TYPE coords); 

À§¿Í °°Àº Ç¥±â¹ý¿¡ Àͼ÷ÇØÁ®¾ßÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. Áß°ýÈ£´Â °¢ ±â´ÉÀ» ´ã´çÇÏ´Â ÇÔ¼ö¸íÀÇ ÀϺÎÀÌ´Ù. À§ÀÇ ÇÔ¼öÀÇ °æ¿ì ÆĶó¸ÞÅÍ·Î 2,3,4 Áß Çϳª¸¦ ÃëÇÒ ¼ö ÀÖÀ¸¸ç ¶ÇÇÑ short, long, float, double ÇüÀÇ µ¥ÀÌÅÍ Å¸ÀÔ±îÁö °áÁ¤ÇØ ÁÙ ¼ö ÀÖ´Ù. ¼±ÅûçÇ×À¸·Î ÀÌ ÆĶó¸ÞÅ͵éÀ» º¤ÅÍÇü½ÄÀ¸·Î Á¦°øÇÒ ¼öµµ Àִµ¥, ÀÌ °æ¿ì¿¡´Â v-Çü½ÄÀÇ ·çƾµéÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. Áö±Ý±îÁö À̾߱âÇÑ °ÍµéÀ» ½ÇÁ¦·Î »ç¿ëÇÑ ¸î°¡Áö ¿¹ÀÌ´Ù.:

void glVertex2s(1, 3);
void glVertex2i(23L, 43L);
void glVertex3f(1.0F, 1.0F, 5.87220972F);

float vector[3];
void glVertex3fv(vector);

ÀÌ·± ¸ðµç ·çƾµéÀ» ±×³É °£´ÜÇÏ°Ô glVertex*¶ó°í ºÎ¸¥´Ù.

OpenGL¿¡¼­ Á¤Á¡ÀÇ ¼ø¼­´Â Á¤Á¡ÀÌ Á¤ÀÇµÈ ¼ø¼­¸¦ µû¸¥´Ù. Á¤Á¡ÀÇ ¼ø¼­´Â glBegin(GLenum mode)°ú glEnd() »çÀÌ¿¡ Á¤ÀǵȴÙ.glVertex*¹®Àº mode°ª¿¡ µû¶ó Àǹ̰¡ ´Þ¶óÁø´Ù. ¿¹¸¦ µé¾îº¸ÀÚ.:
glBegin(GL_POINTS);
glVertex2f(0.0, 0.0);
glVertex2f(1.0, 0.0);
glVertex2f(0.0, 1.0);
glVertex2f(1.0, 1.0);
glVertex2f(0.5, 0.5);
glEnd();

2Â÷¿ø ÁÂÇ¥°è¿¡ 5°³ÀÇ Á¡À» ±×¸®´Â °ÍÀÌ´Ù. GL_POINTS´Â OpenGLÀÇ Çì´õÆÄÀÏÀÎ <GL/gl.h>.¿¡ Á¤ÀÇµÈ Ç¥½ÄÁßÀÇ ÇϳªÀÌ´Ù. ÀÌ¿ëÇÒ ¼ö ÀÖ´Â ¸ðµå°¡ ¸¹Áö¸¸ ¿©±â¼­´Â ÇÊ¿äÇÑ ¸î°¡Áöµé¸¸ »ìÆ캸±â·Î ÇÑ´Ù.

°¢ Á¡µéÀº OpenGLÀÇ »óź¯¼öÁß »ö»ó¹öÆÛ¿¡ ÇØ´çÇÏ´Â »öÀ¸·Î ±×·ÁÁø´Ù. ÇöÀç »ö»óÀ» ¹Ù²Ù·Á¸é glColor*·ùÀÇ ·çƾÀ» »ç¿ëÇÏ¸é µÈ´Ù; »ö»óÀ» ¼±ÅÃÇÏ°í ´Ù·ç´Â ¹æ¹ý¿¡ ´ëÇØ ÇÒ ¸»ÀÌ ¸¹Áö¸¸ ÀÌ ÁÖÁ¦´Â ´Ù¸¥ ±â»ç¿¡¼­ ´Ù·ê °ÍÀÌ´Ù. °£´ÜÈ÷ »ìÆ캸¸é 0.0ºÎÅÍ 1.0±îÁöÀÇ ºÎµ¿Çü½Ç¼ö 3°³¸¦ ÀÌ¿ëÇÏ¿© RGB(Àû»ö-³ì»ö-û»ö;Red-Green-Blue) ¿£ÄÚµù¹æ½ÄÀ» Ç¥ÇöÇÒ ¼ö ÀÖ´Ù.;
glColor3f(1.0, 1.0, 1.0); /* Èò»ö */ 
glColor3f(1.0, 0.0, 0.0); /* »¡°£»ö */ 
glColor3f(1.0, 1.0, 0.0); /* º¸¶ó»ö */ 
µîµî... 

³»·Á¹Þ±â: Makefile, ¿¹Á¦ÆÄÀÏ(example1.c), ¿¹Á¦ÆÄÀÏ(example2.c)

Áö±Ý±îÁö ¹è¿î °ÍÀ» ÀÌ¿ëÇÏ°í µÎ°³ÀÇ ¿¹Á¦¸¦ ÀÛ¼ºÇØ º¸µµ·Ï ÇÏÀÚ. ù¹ø° ¿¹Á¦´Â Ä«¿À½º¸Ê(ÀϹÝÀûÀÎ Áöµµ)¿¡¼­ ¸¹Àº ±Ëµµ¸¦ ±×·ÁÁÖ´Â °£´ÜÇÑ OpenGLÇÁ·Î±×·¥ÀÌ´Ù. ¿©·¯ºÐÀÌ Áöµµ¸¦ ¸¸µå´Â ¹æ¹ýÀ̳ª Ç¥ÁØ Áöµµ¿¡ ´ëÇÏ¿© Àß ¾ËÁö ¸øÇصµ º° ¹®Á¦°¡ µÇÁö ¾Ê´Â´Ù. °£´ÜÈ÷ ¸»ÇÏÀÚ¸é ÀÓÀÇÀÇ ÇÑ Á¡À» ÃëÇÏ°í ÀÌ Á¡À» ¹Ì¸® Á¤ÀÇµÈ ½Ä¿¡ ´ëÀÔÇÏ¿© »õ·Î¿î Á¡À» »ý¼ºÇÏ¿© ´Ù½Ã ´ëÀÔÇÏ´Â ÇüÅ·ΠÁöµµ¸¦ ±×¸®´Â °ÍÀÌ´Ù. À̶§ »ç¿ëÇÏ´Â ½ÄÀº ´ÙÀ½°ú °°´Ù.:

yn+1 = yn + K sin(xn)
xn+1 = xn + yn+1

Ç¥ÁظÊÀº ÀÔÀÚ°¡¼Ó±âÀÇ °¡¼Ó°æ·Î¸¦ µû¶ó ȸÀüÇÏ°í ÀÖ´Â Àü±â¸¦ ¶è ÀÔÀÚ°¡ ³²±â´Â ±ËÀû°ú °¡¼Ó±â ´Ü¸éÀ» Áö³ª´Â ±ËÀûÀ» ³ªÅ¸³½´Ù. Ç¥ÁظÊÀ̳ª ´Ù¸¥ ¸ÊµéÀÇ ¼Ó¼ºÀ» °øºÎÇÏ´Â °ÍÀº À̿°¡¼ÓÀåÄ¡¿¡¼­ ¹æÀüµÈ ÀÔÀÚÀÇ ¾ÈÁ¤¼ºÀ» ÀÌÇØÇϱâ À§ÇÏ¿© ¹°¸®Çп¡¼­ Áß¿äÇÏ´Ù. Ç¥ÁظÊÀº °¢ ÆĶó¸ÞÅÍÀÇ ¸î¸î °ª¶§¹®¿¡ ¾ÆÁÖ »ê¶æÇÏ´Ù. K´Â Ä«¿À½ºÁ¤µµ¸¦ ³ªÅ¸³»ÁØ´Ù. ¶ÇÇÑ ¹°¸®Çп¡´Â º°·Î °ü½ÉÀÌ ¾øÁö¸¸ ±¦ÂúÀº ±×·¡ÇÈÄڵ带 °³¹ßÇÏ°íÀÚ ÇÏ´Â »ç¶÷µé¿¡°Ô ¸Ê°ú ±× ¼Ó¼ºÀ» »ìÆ캼¸¸ÇÑ °ÍÀÌ´Ù. ¶ÇÇÑ ÅؽºÃÄ, È­¿°ºÒ²É, ³ª¹«, ÁöÇüµîµîÀ» »ý¼ºÇÏ´Â ¸¹Àº ¾Ë°í¸®ÁòÀº ÀÌ ÇÁ·¢ÅÐ ¸Ê¿¡ ±âÃÊÇÏ°í ÀÖ´Ù.

¿¹Á¦1(example1.c)ÀÇ ¼Ò½º¸¦ »ìÆ캸ÀÚ:

    
#include <GL/glut.h>
#include <math.h>  

const  double pi2 = 6.28318530718;

void NonlinearMap(double *x, double *y){
    static double K = 1.04295;
    *y += K * sin(*x);
    *x += *y;
    *x = fmod(*x, pi2);
    if (*x < 0.0) *x += pi2;
};

void winInit(){
    /* ÁÂÇ¥°è¸¦ ¼³Á¤ÇÑ´Ù. */
    gluOrtho2D(0.0, pi2, 0.0, pi2);
};

void display(void){
    const int    NumberSteps = 1000;
    const int    NumberOrbits = 100;
    const double Delta_x = pi2/(NumberOrbits-1);
    int step, orbit;

    glColor3f(0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);

    for (orbit = 0; orbit < NumberOrbits; orbit++){
      double x, y;
      y = 3.1415;
      x = Delta_x * orbit;

      glBegin(GL_POINTS);
      for (step = 0; step < NumberSteps; step++){
        NonlinearMap(&x, &y);
        glVertex2f(x, y);
      };
    
      glEnd();
    };

    for (orbit = 0; orbit < NumberOrbits; orbit++){
      double x, y;
      x = 3.1415;
        y = Delta_x * orbit;

        glBegin(GL_POINTS);
        for (step = 0; step < NumberSteps; step++){
          NonlinearMap(&x, &y);
          glVertex2f(x, y);
        };
        glEnd();

     };
};

int main(int argc, char **argv) {
  glutInit(&argc, argv);  
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);  
  glutInitWindowPosition(5,5);  
  glutInitWindowSize(300,300);  
  glutCreateWindow("Standard Map");  
  
  winInit();
  glutDisplayFunc(display);  
  glutMainLoop();  
  
  return 0;  
}  
  
À§ÀÇ Äڵ忡 »ç¿ëµÈ glut* ·çƾÀÇ »ç¿ë¹ýÀ» ÀÌÇØÇÏ·Á¸é ¸ÕÀú GLUT ÇÁ·Î±×·¡¹Ö±â»ç¸¦ Àб⠹ٶõ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ´ÜÀϹöÆÛ¿Í RGB¸ðµå¸¦ °¡Áø ±×·¡ÇÈâ¿¡ ±×¸²À» ¶ç¿î´Ù. Áöµµ¸¦ ±×¸®´Â ÄݹéÇÔ¼öÀÇ À̸§Àº display()ÀÌ´Ù.: ¸ÕÀú ¹è°æ»ö(°ËÀº»ö)À» ¼±ÅÃÇÑ´Ù.; glClear(GL_COLOR_BUFFER_BIT) ÇöÀç°ªÀ¸·Î »ö»ó¹öÆÛ¸¦ ÃʱâÈ­½ÃŲ ´ÙÀ½ glColorÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© Èò»öÀ» ¼±ÅÃÇÑ´Ù. ´ÙÀ½ NonlinearMap()ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¿©·¯¹ø ¹Ýº¹ÇÏ¿© GL_POINTS¸ðµå·Î glVertex*¿¡ Á¤ÀǵǴ Á¡µéÀ» È­¸é¿¡ ±×¸°´Ù. Á¤¸» °£´ÜÇÏ´Ù.

À©µµ¿ì ÃʱâÈ­¿¡ »ç¿ëµÈ winInit()·çƾÀ» »ìÆ캸ÀÚ. ÀÌ ·çƾ¿¡´Â °Ü¿ì ÇÑÁÙ·Î µÈ OpenGLÀ¯Æ¿¸®Æ¼ ÅøŶÀÇ ÇÔ¼ögluOrtho2D()°¡ »ç¿ëµÇ¾ú´Ù. ÀÌ ÇÔ¼ö´Â ÁÂÇ¥°è¸¦ 2Â÷¿ø Á÷±³ÁÂÇ¥°è·Î ¼³Á¤ÇÑ °ÍÀÌ´Ù.ÀÌ ÇÔ¼ö¿¡´Â "ÃÖ¼Ò x, ÃÖ´ë x, ÃÖ¼Ò y, ÃÖ´ë yÁÂÇ¥°ª"ÀÌ Àü´ÞµÈ´Ù. Âü°í: ÇÊÀÚ´Â ±×¸²ÀÌ ¾î¶»°Ô ±×·ÁÁö´ÂÁö¸¦ »ìÆ캸±â À§ÇÏ¿© ´ÜÀϸðµå À©µµ¿ì¿Í ¸Å¿ì ¸¹Àº Á¡µéÀ» ÀÌ¿ëÇÏ¿© ±×¸®µµ·Ï ÇÏ¿´´Ù. Å©±â°¡ Å©°Å³ª ½Ã°£ÀÌ ¸¹ÀÌ °É¸®´Â ±×¸², ±×¸®°í OpenGL·çƾ¿¡ µû¶ó ¿©·¯ºÐÀÇ È­¸é¿¡ ±×¸²ÀÌ ±×·ÁÁö´Âµ¥ ¿À·¡ °É¸®´Â °ÍµéÀº ÁÖ·Î ´ÜÀϸðµå¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù.

¾Æ·¡ ±×¸²Àº ¿¹Á¦ 1À» ÅëÇØ º¼ ¼ö ÀÖ´Â ±×¸²ÀÌ´Ù.:

 

µÎ¹ø° ÇÁ·Î±×·¥, ¿¹Á¦ 2(example2.c)¸¦ »ìÆ캸ÀÚ.:

    
#include <GL/glut.h> 
#include <math.h>

const  double  pi2 = 6.28318530718; 
const  double  K_max = 3.5;
const  double  K_min = 0.1;
static double  Delta_K = 0.01;
static double  K = 0.1;          


void NonlinearMap(double *x, double *y){
    /* Ç¥ÁØ ¸Ê */
    *y += K * sin(*x);
    *x += *y;

    /* °¢µµ x´Â 2ÆÄÀÌ·Î ³ª´« °ªÀÌ´Ù.*/
    *x = fmod(*x, pi2);
    if (*x < 0.0) *x += pi2;
};


/* ÄݹéÇÔ¼ö: 
  ÀԷ¾øÀÌ ¹«¾ùÀ» ÇÒ °ÍÀΰ¡ */
void  idle(void){
    /* È®·üÀû ÆĶó¸ÞÅ͸¦ Áõ°¡½ÃŲ´Ù.*/
    K += Delta_K;
    if(K > K_max) K = K_min;

    /* È­¸éÀ» ´Ù½Ã ±×¸°´Ù.*/
    glutPostRedisplay();
};


/* ±×·¡ÇÈ Ã¢(À©µµ¿ì)¸¦ ÃʱâÈ­ ÇÑ´Ù.*/
void winInit(void){
    gluOrtho2D(0.0, pi2, 0.0, pi2);
};

/* ÄݹéÇÔ¼ö:
    È­¸éÀ» ´Ù½Ã ±×¸±¶§ ¾î¶»°Ô ÇÒ °ÍÀΰ¡?*/
void display(void){
    const int    NumberSteps = 1000;
    const int    NumberOrbits = 50;
    const double Delta_x = pi2/(NumberOrbits-1);
    int step, orbit;

    glColor3f(0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
                
    for (orbit = 0; orbit < NumberOrbits; orbit++){
        double x, y;
        y = 3.1415;
        x = Delta_x * orbit;

        glBegin(GL_POINTS);
        for (step = 0; step < NumberSteps; step++){
          NonlinearMap(&x, &y);
          glVertex2f(x, y);
        };
        glEnd();
     };

     for (orbit = 0; orbit < NumberOrbits; orbit++){
        double x, y;
        x = 3.1415;
        y = Delta_x * orbit;

        glBegin(GL_POINTS);
        for (step = 0; step < NumberSteps; step++){
          NonlinearMap(&x, &y);
          glVertex2f(x, y);
        };
        glEnd();
     };

     glutSwapBuffers();
};


int main(int argc, char **argv)  {  
  /* GLUTÃʱâÈ­ */
  glutInit(&argc, argv);  
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);  
  glutInitWindowPosition(5,5);  
  glutInitWindowSize(300,300);
  
  /*âÀ» Çϳª ¿¬´Ù. */
  glutCreateWindow("Order to Chaos");  
  
  /* âÀ» ÃʱâÈ­ ÇÑ´Ù. */
  winInit();

  /* ÄݹéÇÔ¼ö¸¦ µî·ÏÇÑ´Ù. */
  glutDisplayFunc(display);  
  glutIdleFunc(idle);

  /* À̺¥Æ®Ã³¸®±â¸¦ ½ÇÇàÇÑ´Ù.*/
  glutMainLoop();  
  
  return 0;  
}  
  
    
    
ÀÌ ÇÁ·Î±×·¥Àº ¿¹Á¦ 1(example1.c)À» À¸¿ëÇÏ¿© ¸¸µé¾îÁ³´Ù. ¿¹Á¦1°ú Å« Â÷ÀÌÁ¡Àº À©µµ¿ì¸¦ ÀÌÁß¹öÆÛ¸ðµå·Î ¿¬´Ù´Â °Í°ú ¸Ê ÆĶó¸ÞÅÍÀÎ K°¡ ÇÁ·Î±×·¥ÀÌ ½ÇÇàµÇ´Â µ¿¾È °è¼Ó ¹Ù²ï´Ù´Â °ÍÀÌ´Ù. »õ·Î¿î ÄݹéÇÔ¼öÀÎ idle()ÀÌ GLUTÀÇ glutIdleFunc()À̺¥Æ® 󸮱â·Î µî·ÏµÇ¾ú´Ù.; ÀÌ ÇÔ¼ö´Â »ç¿ëÀÚÀÇ ÀÔ·ÂÀÌ ¾øÀ»¶§ À̺¥Æ®Ã³¸®±â°¡ ½ÇÇàÀ» ÇÏ´Â ÇÔ¼öÀÌ´Ù. idle()ÄݹéÇÔ¼ö´Â ¾Ö´Ï¸ÞÀ̼ÇÇÁ·Î±×·¡¹Ö¿¡ ¾ÆÁÖ ÀûÀýÇÏ´Ù. ¿¹Á¦ 2¿¡¼­ ÀÌ ÇÔ¼ö´Â ¸Ê ÆĶó¸ÞÅÍÀÇ °ªÀ» Á¶±Ý¾¿ ¹Ù²ãÁÖ´Â ±â´ÉÀ» ÇÑ´Ù. idle()ÇÔ¼öÀÇ ¸¶Áö¸·¿¡ ÀÖ´Â glutPostResDisplay()ÇÔ¼ö´Â ÀÌÀüâÀÇ ÃʱâÈ­¸¦ ±×´ë·Î À¯ÁöÇÑ Ã¤·Î À©µµ¿ì¸¦ ´Ù½Ã ±×¸®±â À§ÇÑ À¯¿ëÇÑ GLUT¸í·ÉÀÌ´Ù. ÀϹÝÀûÀ¸·Î ±×³É display()¸¦ Çѹø´õ È£ÃâÇÏ´Â °Íº¸´Ù ÈξÀ È¿À²ÀûÀÌ´Ù.

display()ÇÔ¼öÀÇ µÚ¿¡ »ç¿ëµÈ glutSwapBuffers()ÇÔ¼öµµ À¯½ÉÈ÷ »ìÆ캼¸¸ÇÑ ÇÔ¼öÀÌ´Ù. ÀÌ ¿¹Á¦¿¡¼­ ÀÌÁß¹öÆÛ¸ðµå·Î À©µµ¿ì°¡ ÃʱâÈ­µÇ¾ú±â ¶§¹®¿¡ È÷µç¹öÆÛ·Î ·£´õ¸µÀÇ ¹æÇâÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ;ÀÌ °æ¿ì ±×·ÁÁö´Â µ¿¾È »ç¿ëÀÚ´Â ±×·ÁÁö´Â Àå¸éÀ» º¼ ¼ö ¾ø´Ù. ±×·¯³ª ±×¸²(ÇÑ ÇÁ·¹ÀÓ)ÀÌ ¿ÏÀüÈ÷ ±×·ÁÁö¸é glutSwapBuffers()ÇÔ¼ö·Î ÀÎÇÏ¿© È÷µç¹öÆÛ°¡ ¹Ù·Î º¸¿©Áö°Ô µÈ´Ù. ÀÌ ¶§ ÇöÀç ±×·ÁÁ® ÀÖ´ø ¹öÆÛ´Â È÷µç ¹öÆÛ·Î ÀüȯµÈ´Ù. ÀÌ ±â¹ýÀ» ÀÌ¿ëÇÏ¿© ¾Ö´Ï¸ÞÀ̼ÇÀ» ºÎµå·´°Ô ÇÒ ¼ö ÀÖ´Â °ÍÀÌ´Ù.

¾Æ·¡ ±×¾Ö´Ï¸ÞÀ̼ÇÀÌ ÁøÇàµÇ´Â µ¿¾ÈÀÇ ¸î¸î È­¸éÀÌ´Ù.:

 

Áß¿ä! ¹ØÁÙ ÂÒ¾Ç~ : The display() ÄݹéÇÔ¼ö´Â Ç×»ó idle()ÀÌÀü¿¡ Çѹø ½ÇÇàµÈ´Ù. ¿©·¯ºÐÀº ÀÌ°ÍÀ» ¿°µÎ¿¡ µÎ°í ¾Ö´Ï¸ÞÀÌ¼Ç ±â´ÉÀ» ÇÁ·Î±×·¥ÇÒ¶§´Â display()¿Í idel()¿¡¼­ ½ÇÇàµÉ ±â´ÉµéÀ» °áÁ¤ÇÏ¿©¾ß ÇÒ °ÍÀÌ´Ù.

¼±°ú ´Ù°¢Çü ±×¸®±â

³»·Á¹Þ±â:
¿¹Á¦ 3(example3.c)

¾Õ¿¡¼­ glBegin(GLenum mode)¿¡´Â ´Ù¾çÇÑ ¸ðµå°¡ Á¸ÀçÇϸç ÀÌ¿¡ µû¶ó Á¤Á¡v0, v1,v2, v3,v4,... vn-1µéÀÇ ¼ø¼­ÀÇ Àǹ̰¡ Ưº°ÇÑ Àǹ̷ΠÇؼ®µÈ´Ù°í Çß´Ù. ¸ðµå¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Â °ª°ú ÃëÇÒ ¼ö ÀÖ´Â µ¿ÀÛÀº ´ÙÀ½°ú °°´Ù.:

  • GL_POINTS    n°³ÀÇ Á¤Á¡À» °¢°¢ ±×¸°´Ù. 
  • GL_LINES    ¿¬°áµÇ¾î ÀÖÁö ¾ÊÀº ¼±À» ±×¸°´Ù. °¢ ¼¼±×¸ÕÆ®´Â v0°ú v1, v2¿Í v3,...µîµîÀÌ´Ù. ¸¸¾à nÀÌ È¦¼ö¶ó¸é ¼¼±×¸ÕÆ®¸¦ ±¸¼ºÇÏÁö ¸øÇÑ vn-1Àº ¹«½ÃµÈ´Ù. 
  • GL_POLYGON    ²ÀÁöÁ¡À¸·Î Á¤Á¡ v0, v1,..,vn-1¸¦ °¡Áö´Â ´Ù°¢ÇüÀ» ±×¸°´Ù. Á¤Á¡Àº Àû¾îµµ 3°³ÀÌ»óÀ̾î¾ß ÇÏ¸ç ¸¸¾à ±×·¸Áö ¾Ê´Ù¸é ¾Æ¹«°Íµµ ±×·ÁÁöÁö ¾Ê´Â´Ù. ¶ÇÇÑ ´Ù°¢ÇüÀ» ÀÌ·ç°í ÀÖ´Â º¯µé³¢¸® ±³Â÷Çؼ­´Â ¾ÈµÇ¸ç (Çϵå¿þ¾î¾Ë°í¸®ÁòÀÇ Á¦ÇѼºÀ¸·Î ÀÎÇÏ¿©) ¹Ýµå½Ã ´Ù°¢ÇüÀº ÄÁº¤½º¿©¾ß¸¸ ÇÑ´Ù. 
  • GL_TRIANGLES    Á¤Á¡ v0, v1, v2¸¦ ÀÌ¿ëÇÏ¿© »ï°¢ÇüÀ» ±×¸®°í v3, v4, v5µîÀ» ÀÌ¿ëÇÏ¿© »ï°¢ÇüÀ» °è¼Ó ±×¸°´Ù. ¸¸¾à ³²¾ÆÀÖ´Â Á¡ÀÌ 3°³°¡ ¾ÈµÈ´Ù¸é ¹«½ÃµÈ´Ù.
  • GL_LINE_STRIP    v0¿¡¼­ v1·Î, v1¿¡¼­ v2·Î ¿Í °°Àº ¹æ½ÄÀ¸·Î ¼±À» ±×¸°´Ù. ¸¶Áö¸· vn-2¿¡¼­ vn-1·Î ¼±À» ±×·Á ÃÑ n-1°³ÀÇ Á÷¼±¼¼±×¸ÕÆ®¸¦ ±×¸°´Ù. ¼±À» ±×¸®´Âµ¥ ÇÊ¿äÇÑ Á¤Á¡ÀÇ ¼ø¼­¿¡ ¾Æ¹«·± Á¦¾àÁ¶°ÇÀÌ ¾øÀ¸¹Ç·Î ¼­·Î ±³Â÷ÇÏ´Â Á÷¼±µµ ±×¸± ¼ö ÀÖ´Ù.
  • GL_LINE_LOOP    GL_LINE_STRIP°ú µ¿ÀÏÇÏÁö¸¸ ¸¶Áö¸·¿¡ vn-1¿¡¼­ v0À» ÀÕ´Â ¼±À» ±×·Á¼­ Æó·çÇÁ¸¦ Çü¼ºÇÑ´Ù.
  • GL_QUADS   Á¤Á¡ v0, v1, v2, v3¸¦ ÀÌ¿ëÇÏ¿© »ç°¢ÇüÀ» ±×¸°´Ù. °è¼ÓÇؼ­ v4, v5, v6, v7À» ÀÌ¿ëÇؼ­ ±×¸°´Ù.
  • GL_QUAD_STRIP    »ç°¢ÇüÀ» ±×¸®´Âµ¥ »ç°¢ÇüÀ» ÀÌ·ç°í ÀÖ´Â ³× Á¤Á¡ÀÇ ¼ø¼­´Â v0, v1, v3, v2 À» ÀÌ¿ëÇؼ­ ±×¸° ´ÙÀ½ v2, v3, v5, v4À» ÀÌ¿ëÇؼ­ »ç°¢ÇüÀ» ±×¸®´Â ¼ø¼­ÀÌ´Ù.
  • GL_TRIANGLE_STRIP    »ï°¢ÇüÀ» ±×¸®´Âµ¥ »ï°¢ÇüÀÇ Á¤Á¡ÀÇ ¼ø¼­´Â v0, v1, v2·Î ±×¸®°í, v2, v1, v3·Î ±×¸®°í, v2, v3, v4µîÀ¸·Î ±×¸®´Â ½ÄÀÌ´Ù. ÀÌ ¼ø¼­´Â »ï°¢ÇüÀÌ Á¦´ë·Î À§Ä¡¸¦ °¡Áöµµ·Ï º¸ÀåÀ» ÇØÁÖ¸ç À̸¦ ÀÌ¿ëÇÏ¿© °î¸é/¸éÀÇ ÀϺθ¦ ³ªÅ¸³»´Âµ¥ »ç¿ëµÈ´Ù.
  • GL_TRIANGLE_FAN    GL_TRIANGLE_STRIP¿Í ºñ½ÁÇÏ´Ù ±×·¯³ª »ï°¢ÇüÀ» ±×¸±¶§ Á¤Á¡ v0, v1, v2À» ÀÌ¿ëÇÏ¿© ±×¸®°í, v0,v2, v3¸¦ ÀÌ¿ëÇؼ­ ±×¸®°í, v0, v3, v4À» ÀÌ¿ëÇؼ­ ±×¸®´Â ¹æ½ÄÀ» ÃëÇÏ´Â Á¡¿¡¼­ ´Ù¸£´Ù. ¸ðµç »ï°¢ÇüÀº °øÅëÀûÀ¸·Î Á¤Á¡ v0¸¦ °¡Áö°í ÀÖ´Ù.
¼¼¹ø° ¿¹Á¦ÇÁ·Î±×·¥¿¡¼­ GL_LINES¿Í GL_POLYGONÀ» ÀÌ¿ëÇÑ ´Ù¸¥ ¾Ö´Ï¸ÞÀ̼ÇÇÁ·Î±×·¥À» ¸¸µé¾îº¸±â·Î ÇÏÀÚ. ÇÁ·Î±×·¥À» ÄÄÆÄÀÏÇÑ ´ÙÀ½ ¼Ò½ºÄڵ带 »ìÆ캸¸é¼­ ÀÌ°ÍÀÌ ¾î¶² ¿ªÇÒÀ» ÇÏ°í ÀÖ´ÂÁö »ìÆ캸ÀÚ. ÀÌ ¼Ò½ºÄÚµå´Â ¿¹Á¦2(example2.c)¿Í ¸Å¿ì ºñ½ÁÇÏ´Ù. È­¸éÀÇ ±×¸²Àº ¸Å¿ì´Ü¼øÇÑ ÁøÀÚ¸¦ ³ªÅ¸³½´Ù. ÀÌ ¾Ö´Ï¸ÞÀ̼ÇÀº ÀÌ»óÀûÀÎ ÁøÀÚÀÇ ¿òÁ÷ÀÓÀ» Èä³»³¾ °ÍÀÌ´Ù. ¾Ö´Ï¸ÞÀ̼ÇÁßÀÇ ÇÑÀå¸éÀº ´ÙÀ½°ú °°´Ù.:
 

¸ÕÀú idle()ÄݹéÇÔ¼ö´Â Ŭ·°ÀÛµ¿½Ã°£À» ±×´ë·Î À¯Áö½ÃÄÑÁØ´Ù(timeº¯¼ö¸¦ ¾÷µ¥ÀÌÆ® ÇØ°¡¸é¼­) display()ÇÔ¼ö¿¡¼­´Â Èò ÁøÀÚÁÙ°ú »¡°£ ÁøÀÚÃß 2°³ÀÇ ¹°Ã¼¸¦ ±×·ÁÁØ´Ù. ÁøÀÚÃßÀÇ ¿òÁ÷ÀÓÀº xcenter¿Í ycenter¿¡ ´ëÇÑ °ø½Ä¿¡ ÀÇÇÏ¿© ±¸ÇÑ´Ù.: 

    

void display(void){
  static double radius = 0.05;
  const double delta_theta = pi2/20;
  double xcenter , ycenter;  
  double x, y;
  double theta = 0.0;

  double current_angle = cos(omega * time);

  glColor3f(0.0, 0.0, 0.0);
  glClear(GL_COLOR_BUFFER_BIT);
  glColor3f(1.0, 1.0, 1.0);

  /*ÁøÀÚÀÇ ÁÙÀ» ±×¸°´Ù. */  
  glColor3f(1.0, 1.0, 1.0);
  glBegin(GL_LINES);
  glVertex2f(0.0, 0.0);
  xcenter = -cord_length * sin(current_angle);
  ycenter = -cord_length * cos(current_angle);
  glVertex2f(xcenter, ycenter);
  glEnd();

  /* ÁøÀÚÃ߸¦ ±×¸°´Ù. */
  glColor3f(1.0, 0.0, 0.0);
  glBegin(GL_POLYGON);
  while (theta <= pi2) {
    x = xcenter + radius * sin(theta);
    y = ycenter + radius * cos(theta);
    glVertex2f(x, y);
    theta += delta_theta;
  };
  glEnd();
  
  glutSwapBuffers();
};

    
    

¿¬½À

Áö±Ý±îÁö ¹è¿î ³»¿ëÀ» ÀÌ¿ëÇÏ¿© ´ÙÀ½ ¿¬½À°úÁ¦µéÀ» Çغ¸±â ¹Ù¶õ´Ù.:

  • ¿¹Á¦1(example1.c)À» ÀÌ¿ëÇÏ¿© ´Ù¸¥ ¸ÊµéÀ» »ý¼ºÇØ º¸¶ó. À̸¦ À§ÇÏ¿© ¸ÕÀú µµ¼­°ü¿¡ °¡¼­ È¥µ·(Ä«¿À½º;Chaos)À̷аú ÇÁ·¢Å»(Fractals)À̷п¡ °üÇÑ Ã¥À» ÇÑ±Ç °ñ¶ó¼­ º¸¶ó. ¾Æ¸¶ Ã¥¿¡ ¸¹Àº ¿¹µéÀÌ ÀÖÀ» °ÍÀÌ´Ù. ÆĶó¸ÞÅÍ°ª°ú ÁÂÇ¥°èÀÇ °ªÀ» ¹Ù²Ù¾î º¸°í ¿©·¯°¡Áö ¸ÊÀ» Àû¿ëÇØ º¸¶ó. Àç¹ÌÀÖ´Â °æÇèÀÌ µÉ °ÍÀÌ´Ù.
  • ¿¹Á¦2(example2.c)¿¡¼­ ±ã Á¡µé¿¡ »ö±òÀ» ÀÔÇôº¸ÀÚ. ¿¹¸¦ µéÀÚ¸é  (Physics Review Letters Vol 63, (1989) 1226À» Âü°íÇÏ¿©) ±ËµµÀÇ ¾ÈÁ¤¼º¿¡ µû¶ó ¼­·Î ´Ù¸¥ »ö»óÀ» ¼³Á¤Çغ¸¶ó. ¾Æ¸¶ È¥µ¿Çü¿ªÀ» Áö³ª°¡´Â ±ËÀûÀº ºÓÀº ºûÀ» ¶î °ÍÀÌ´Ù. ¿¹¸¦ µé¾î ¾ÈÁ¤µÈ ¼¶ ±Ùó¿¡¼­´Â Ǫ¸¥ ºûÀ» ¶î °ÍÀÌ´Ù. ¸¸¾à ¿©·¯ºÐÀÌ ÀÌ È¿°ú¸¦ ³¾ ¼ö ÀÖ´Â Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù¸é ¿ì¸®°¡ ¿¹·Î µé¾ú´ø ¸ÊµéÀÇ ÇÁ·¢ÅмӼºÀÌ ´õ¿í ¸íÈ®ÇØ Áú °ÍÀÌ´Ù. ¹°·Ð ¹ÌºÐ¹æÁ¤½ÄÀ» ¹è¿ìÁö ¾Ê´õ¶óµµ ±× ÁÖÁ¦¿¡ ´ëÇÑ Áö½ÄÀÌ Á¶±Ý ´Ã¾î³¯ °ÍÀÌ´Ù. ¸¸¾à ¿©·¯ºÐÀÌ ÄÄÇ»ÅÍ ±×·¡ÇÈ¿¡¼­ ¸ÊÇΰú ÇÁ·¢ÅÐÀ» ÀÌ¿ëÇÏ°í½Í´Ù¸é ¹ÌºÐ¹æÁ¤½ÄÀ» ¹è¿ì´Â °ÍÀÌ ÃæºÐÈ÷ °¡Ä¡°¡ ÀÖ´Â ÀÏÀÌ´Ù.
  • ¿¹Á¦3(example3.c)À» ÀÌ¿ëÇÏ¿© ¿©·¯ÇüÅÂÀÇ ¼±À» ÀÌ¿ëÇÏ¿© µð½ºÅ© ¸¦ ±×¸®´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇØ º¸¶ó. GL_LINES, GL_TRIANGLES,µîµîÀ» ÀÌ¿ëÇØ º¸¶ó. ¾î¶»°Ô º¸À̴°¡. µð½ºÅ©¸¦ »ý¼ºÇÏ´Â Äڵ带 ÃÖÀûÈ­ Çغ¸¶ó. ¸¸¾à sin°ú cosÀ» ÀÌ¿ëÇÏÁö ¾Ê´Â´Ù¸é °¢ ÇÁ·¹ÀÓ¿¡¼­ µ¿ÀÏÇÑ µð½ºÅ©¸¦ ±×¸®±â À§ÇÑ ½Ã°£ÀÌ ¸¹ÀÌ °É¸± °ÍÀÌ´Ù.  ¿©·¯ºÐÀº ÀÌ Á¤º¸¸¦ ¹è¿­ÀÇ ÇüÅ·ΠÀúÀåÇÒ ¼ö ÀÖ´Ù. ´Ù°¢ÇüÀ» ÀÌ¿ëÇÏ¿© ¼­¶ø»óÀÚ³ª ´ÙÀ̾î¸óµå ¶Ç´Â ÁøÀÚÀÇ ³¡¿¡ ¹«¾ð°¡¸¦ ±×·Áº¸¶ó. ¶Ç Á¦°¢°¢ µû·Î ¿òÁ÷À̰ųª ¼­·Î Ãæµ¹ÇÏ´Â µÎ ÁøÀÚ¸¦ ±×¸®´Â ÇÁ·Î±×·¥À» ÀÛ¼ºÇÏ´Â °Íµµ ÁÁÀº ¿¹°¡ µÉ °ÍÀÌ´Ù.

´ÙÀº ¿¬Àç¿¡¼­´Â

ÀÌ ±Û¿¡¼­ ´Ù·ç°íÀÚ ÇÏ´Â ³»¿ëÀº ³¡³µ´Ù. ´Ù°¢Çü¿¡ ´ëÇÏ¿© ´õ À̾߱â Çغ¼°ÍµéÀÌ ¸¹´Ù. ´ÙÀ½È£(1998³â 3¿ùÈ£)¿¡¼­´Â °è¼ÓÇؼ­ ´Ù°¢ÇüÀ» »ìÆ캸°í ¿©·¯ºÐÀÌ ÀÌ¹Ì Àͼ÷ÇØÁø ¸í·ÉµéÀ» Á» ´õ ÀÚ¼¼È÷ ´Ù·ç¾îº¸°í ¸ðµ¨¸µÇϴ°ͱîÁö »ìÆ캸°Ú´Ù.


´õ ÀÚ¼¼È÷ ¾Ë°í ½ÍÀ¸½Ã¸é:



¹ø¿ª : ÀÌÁÖÈ£


º» À¥»çÀÌÆ®´Â Miguel Angel Sepulveda¾¾¿¡ ÀÇÇØ °ü¸®µË´Ï´Ù.
© 1998 Miguel Angel Sepúlveda

LinuxFocus 1998