A kurzormozgató nyilak segítségével interaktívan változtathassuk a szabályos sokszög oldalainak számát és a köré írható kör sugarát. Használjuk ki, hogy a szabályos sokszög csúcsai egy körvonalon helyezkednek el, egyenlő ívekre osztva azt. Az F1 billentyű lenyomásával választhassunk a kitöltött és körvonalas megjelenítési módok között.
A programunk felépítése a következő lesz.
#include <GL/glut.h> #include <math.h>és definiáljuk a globális változókat:
/* Pi konstans kozelito erteke. */ #define GL_PI 3.1415f /* A szabalyos sokszog csucspontjainak szama. */ int N = 3; /* A sokszog kore irhato kor sugara. */ double R = 10.0; /* Kitoltott vagy korvonalas megjelenites. */ int filled_display = 1;
int main(int argc, char* argv[])
{
/* Inicializalas */
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutCreateWindow("Szabalyos sokszog");
/* Viszahivhato fuggvenyek beallitasa */
glutReshapeFunc(ChangeSize);
glutSpecialFunc(SpecialKeys);
glutDisplayFunc(RenderScene);
/* Globalis beallitasok */
SetupRC();
/* Vezerles atadasa a GLUT-nak */
glutMainLoop();
return 0;
}
void SetupRC()
{
/* Fekete hatter */
glClearColor(0.0f, 0.0f, 0.0f, 1.0f );
/* Modellezes szinenek beallitasa */
glColor3f(1.0, 1.0, 0.0);
}
void ChangeSize(int w, int h)
{
GLfloat nRange = 25.0f;
/* Nullaval nem osztunk */
if(h == 0)
h = 1;
/* Viewport beallitasa az ablak meretere. */
glViewport(0, 0, w, h);
/* Projekcios matrix inicializalasa */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
/* Parhuzamos vetites beallitasa */
if (w <= h)
glOrtho (-nRange, nRange, -nRange*h/w, nRange*h/w, -nRange, nRange);
else
glOrtho (-nRange*w/h, nRange*w/h, -nRange, nRange, -nRange, nRange);
/* ModelView matrix inicializalasa */
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void SpecialKeys(int key, int x, int y)
{
if(key == GLUT_KEY_F1)
filled_display = !filled_display;
if(key == GLUT_KEY_UP)
if(R < 24.9)
R += 1.0;
if(key == GLUT_KEY_DOWN)
if(R > 1.1)
R -= 1.0;
if(key == GLUT_KEY_LEFT)
if(N > 3)
N --;
if(key == GLUT_KEY_RIGHT)
N ++;
/* Ablak frissitese */
glutPostRedisplay();
}
void DiskApprox(int n, double radius, float x, float y)
{
/*
n - hany oldalu szabalyos sokszoggel kozelitunk (n legalább 3)
radius - a sokszog kore irhato kor sugara
x, y - a sokszog kore irhato kor kozeppontjanak koordinatai
*/
int i;
GLfloat angle;
if(n < 3)
n = 3;
glBegin(GL_POLYGON);
for(i = 0, angle = 0.0; i < n; i++, angle += 2.0 * GL_PI / n)
{
glVertex2f(x + radius * cos(angle), y + radius * sin(angle));
}
glEnd();
}
void RenderScene(void)
{
/* Ablak torlese az aktualis torloszinnel. */
glClear(GL_COLOR_BUFFER_BIT);
/* Poligon megjelenitesi modja. */
if(filled_display)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
else
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
DiskApprox( N, R, 0.0, 0.0 );
/* Pufferek csereje, uj kep megjelenitese */
glutSwapBuffers();
}