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);
float vector[3];
ÀÌ·± ¸ðµç ·çƾµéÀ» ±×³É °£´ÜÇÏ°Ô glVertex*¶ó°í ºÎ¸¥´Ù. OpenGL¿¡¼ Á¤Á¡ÀÇ ¼ø¼´Â Á¤Á¡ÀÌ Á¤ÀÇµÈ ¼ø¼¸¦ µû¸¥´Ù.
Á¤Á¡ÀÇ ¼ø¼´Â glBegin(GLenum mode)°ú glEnd() »çÀÌ¿¡
Á¤ÀǵȴÙ.glVertex*¹®Àº mode°ª¿¡ µû¶ó Àǹ̰¡ ´Þ¶óÁø´Ù.
¿¹¸¦ µé¾îº¸ÀÚ.:
2Â÷¿ø ÁÂÇ¥°è¿¡ 5°³ÀÇ Á¡À» ±×¸®´Â °ÍÀÌ´Ù. GL_POINTS´Â OpenGLÀÇ Çì´õÆÄÀÏÀÎ <GL/gl.h>.¿¡ Á¤ÀÇµÈ Ç¥½ÄÁßÀÇ ÇϳªÀÌ´Ù. ÀÌ¿ëÇÒ ¼ö ÀÖ´Â ¸ðµå°¡ ¸¹Áö¸¸ ¿©±â¼´Â ÇÊ¿äÇÑ ¸î°¡Áöµé¸¸ »ìÆ캸±â·Î ÇÑ´Ù. °¢ Á¡µéÀº OpenGLÀÇ »óź¯¼öÁß »ö»ó¹öÆÛ¿¡ ÇØ´çÇÏ´Â »öÀ¸·Î ±×·ÁÁø´Ù.
ÇöÀç »ö»óÀ» ¹Ù²Ù·Á¸é glColor*·ùÀÇ ·çƾÀ» »ç¿ëÇÏ¸é µÈ´Ù;
»ö»óÀ» ¼±ÅÃÇÏ°í ´Ù·ç´Â ¹æ¹ý¿¡ ´ëÇØ ÇÒ ¸»ÀÌ ¸¹Áö¸¸ ÀÌ ÁÖÁ¦´Â ´Ù¸¥ ±â»ç¿¡¼
´Ù·ê °ÍÀÌ´Ù. °£´ÜÈ÷ »ìÆ캸¸é 0.0ºÎÅÍ 1.0±îÁöÀÇ ºÎµ¿Çü½Ç¼ö 3°³¸¦ ÀÌ¿ëÇÏ¿©
RGB(Àû»ö-³ì»ö-û»ö;Red-Green-Blue) ¿£ÄÚµù¹æ½ÄÀ» Ç¥ÇöÇÒ ¼ö ÀÖ´Ù.;
Áö±Ý±îÁö ¹è¿î °ÍÀ» ÀÌ¿ëÇÏ°í µÎ°³ÀÇ ¿¹Á¦¸¦ ÀÛ¼ºÇØ º¸µµ·Ï ÇÏÀÚ. ù¹ø° ¿¹Á¦´Â Ä«¿À½º¸Ê(ÀϹÝÀûÀÎ Áöµµ)¿¡¼ ¸¹Àº ±Ëµµ¸¦ ±×·ÁÁÖ´Â °£´ÜÇÑ OpenGLÇÁ·Î±×·¥ÀÌ´Ù. ¿©·¯ºÐÀÌ Áöµµ¸¦ ¸¸µå´Â ¹æ¹ýÀ̳ª Ç¥ÁØ Áöµµ¿¡ ´ëÇÏ¿© Àß ¾ËÁö ¸øÇصµ º° ¹®Á¦°¡ µÇÁö ¾Ê´Â´Ù. °£´ÜÈ÷ ¸»ÇÏÀÚ¸é ÀÓÀÇÀÇ ÇÑ Á¡À» ÃëÇÏ°í ÀÌ Á¡À» ¹Ì¸® Á¤ÀÇµÈ ½Ä¿¡ ´ëÀÔÇÏ¿© »õ·Î¿î Á¡À» »ý¼ºÇÏ¿© ´Ù½Ã ´ëÀÔÇÏ´Â ÇüÅ·ΠÁöµµ¸¦ ±×¸®´Â °ÍÀÌ´Ù. À̶§ »ç¿ëÇÏ´Â ½ÄÀº ´ÙÀ½°ú °°´Ù.: yn+1 = yn + K sin(xn)
Ç¥ÁظÊÀº ÀÔÀÚ°¡¼Ó±âÀÇ °¡¼Ó°æ·Î¸¦ µû¶ó ȸÀüÇÏ°í ÀÖ´Â Àü±â¸¦ ¶è ÀÔÀÚ°¡ ³²±â´Â ±ËÀû°ú °¡¼Ó±â ´Ü¸éÀ» Áö³ª´Â ±ËÀûÀ» ³ªÅ¸³½´Ù. Ç¥ÁظÊÀ̳ª ´Ù¸¥ ¸ÊµéÀÇ ¼Ó¼ºÀ» °øºÎÇÏ´Â °ÍÀº À̿°¡¼ÓÀåÄ¡¿¡¼ ¹æÀüµÈ ÀÔÀÚÀÇ ¾ÈÁ¤¼ºÀ» ÀÌÇØÇϱâ À§ÇÏ¿© ¹°¸®Çп¡¼ Áß¿äÇÏ´Ù. Ç¥ÁظÊÀº °¢ ÆĶó¸ÞÅÍÀÇ ¸î¸î °ª¶§¹®¿¡ ¾ÆÁÖ »ê¶æÇÏ´Ù. 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µéÀÇ ¼ø¼ÀÇ Àǹ̰¡ Ưº°ÇÑ Àǹ̷ΠÇؼ®µÈ´Ù°í Çß´Ù. ¸ðµå¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Â °ª°ú ÃëÇÒ ¼ö ÀÖ´Â µ¿ÀÛÀº ´ÙÀ½°ú °°´Ù.:
¸ÕÀú 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(); }; ¿¬½ÀÁö±Ý±îÁö ¹è¿î ³»¿ëÀ» ÀÌ¿ëÇÏ¿© ´ÙÀ½ ¿¬½À°úÁ¦µéÀ» Çغ¸±â ¹Ù¶õ´Ù.:
´ÙÀº ¿¬Àç¿¡¼´ÂÀÌ ±Û¿¡¼ ´Ù·ç°íÀÚ ÇÏ´Â ³»¿ëÀº ³¡³µ´Ù. ´Ù°¢Çü¿¡ ´ëÇÏ¿© ´õ À̾߱â Çغ¼°ÍµéÀÌ ¸¹´Ù. ´ÙÀ½È£(1998³â 3¿ùÈ£)¿¡¼´Â °è¼ÓÇؼ ´Ù°¢ÇüÀ» »ìÆ캸°í ¿©·¯ºÐÀÌ ÀÌ¹Ì Àͼ÷ÇØÁø ¸í·ÉµéÀ» Á» ´õ ÀÚ¼¼È÷ ´Ù·ç¾îº¸°í ¸ðµ¨¸µÇϴ°ͱîÁö »ìÆ캸°Ú´Ù. ´õ ÀÚ¼¼È÷ ¾Ë°í ½ÍÀ¸½Ã¸é:
¹ø¿ª : ÀÌÁÖÈ£
|
º» À¥»çÀÌÆ®´Â Miguel Angel Sepulveda¾¾¿¡ ÀÇÇØ °ü¸®µË´Ï´Ù. © 1998 Miguel Angel Sepúlveda LinuxFocus 1998 |