Skip to content

Instantly share code, notes, and snippets.

@jirkapenzes
Created March 15, 2013 13:44
Show Gist options
  • Save jirkapenzes/5169960 to your computer and use it in GitHub Desktop.
Save jirkapenzes/5169960 to your computer and use it in GitHub Desktop.
INPG3 - vykreslení objektu v OpenGL
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) // skryje okno konzole
//---------------------------------------------------------------------
// Program otevre jedno hlavni okno a vykresli do nej 3D elipsoid pomocí bodù
// Klavesami x, z, y se nastavuje poloha kamery, klavesou r rotace elipsoidu
// Klavesami p a q se nastavuje poloha elipsoidu
// Program lze ukoncit stiskem klavesy ESC.
//---------------------------------------------------------------------
#include <glut.h> // hlavickovy soubor funkci GLUTu
//#include <stdlib.h>
#include <math.h>
float vert=10.0;
float horiz=10.0;
int px=250;
int py=250;
float rr,gg,bb,zet=20.0;
float x,y,z, uhel=10;
float a=60,b=80,c=90;
//---------------------------------------------------------------------
// Nastaveni souradneho systemu v zavislosti na velikosti okna
//---------------------------------------------------------------------
void onResize(int w, int h) // w a h reprezentuje novou velikost okna
{
glViewport(20, 20, w, h); // viditelna oblast pres cele okno
glMatrixMode(GL_PROJECTION); // zacatek modifikace projekcni matice
glLoadIdentity(); // vymazani projekcni matice (=identita)
glOrtho(-200, w, -200, h, -400, 400); // mapovani abstraktnich souradnic do souradnic okna
glMatrixMode(GL_MODELVIEW);
}
//---------------------------------------------------------------------
// Tato funkce je volana pri kazdem prekresleni okna
//---------------------------------------------------------------------
void onDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(horiz, vert, zet,
1.0f, 0.0f, 0.0f,
0.0f, 10.0f, 0.0f);
glClearColor(1.0, 1.0, 1.0, 0.0); // nastaveni mazaci barvy na cernou
glClear(GL_COLOR_BUFFER_BIT); // vymazani bitovych rovin barvoveho bufferu
glColor3f(0.0f, 0.0f, 0.0f); // nastaveni barvy pro kresleni
glColor3f(1.0f, 0.0f, 0.0f);
glLineWidth(2.0);
glPointSize(2.0);
glRotatef((float)uhel, 0.0f, 0.0f, 1.0f);
glTranslatef(px,0,0);
glTranslatef(0,py,0);
for(x=-a;x<a;x=x+1) // vykreslení hyperboloidu pomocí bodu ze smeru z
for(y=-b;y<b;y=y+1)
{
z = sqrt((1-(x*x)/(a*a)-(y*y)/(b*b))*(-(c*c)));
glBegin(GL_POINTS);
rr=(x+c/2)/c;
gg=(x+c/2)/c;
bb=1-(x+c/2)/c;
glColor3f(rr, gg, bb);
glVertex3f(x,y,z);
glColor3f(rr, gg, bb);
glVertex3f(x,y,-z);
glEnd();
}
for(x=-a;x<a;x=x+1) // vykreslení hyperboloidu pomocí bodu ze smeru y
for(z=-c;z<c;z=z+1)
{
y = sqrt((1-(x*x)/(a*a)+(z*z)/(c*c))*(b*b));
glBegin(GL_POINTS);
rr=(x+b/2)/b;
gg=1-(x+b/2)/b;
bb=(x+b/2)/b;
glColor3f(rr, gg, bb);
glVertex3f(x,y,z);
glColor3f(rr, gg, bb);
glVertex3f(x,-y,z);
glEnd();
}
for(y=-b;y<b;y=y+1) // vykreslení hyperboloidu pomocí bodu ze smeru x
for(z=-c;z<c;z=z+1)
{
x = sqrt((1-(y*y)/(b*b)+(z*z)/(c*c))*(a*a));
glBegin(GL_POINTS);
rr=1-(y+a/2)/a;
gg=(y+a/2)/a;
bb=(y+a/2)/a;
glColor3f(rr, gg, bb);
glVertex3f(x,y,z);
glColor3f(rr, gg, bb);
glVertex3f(-x,y,z);
glEnd();
}
glColor3f(1.0f, 0.0f, 0.0f);
glTranslatef(px,-150,0);
glTranslatef(py,-150,0);
glFlush();
glutSwapBuffers();
}
//---------------------------------------------------------------------
// Tato funkce je volana pri stlaceni ASCII klavesy
//---------------------------------------------------------------------
void onKeyboard(unsigned char key, int x, int y)
{
if (key==27) exit(0);
if (key == 'x') horiz += 1.0;
if (key == 'X') horiz -= 1.0;
if (key == 'y') vert += 1.0;
if (key == 'Y') vert -= 1.0;
if (key == 'z') zet += 1.0;
if (key == 'Z') zet -= 1.0;
if (key == 'r') uhel++;
if (key == 'R') uhel--;
if (key == 'p') px++;
if (key == 'P') px--;
if (key == 'q') py++;
if (key == 'Q') py--;
onDisplay();
}
//---------------------------------------------------------------------
// Hlavni funkce konzolove aplikace
//---------------------------------------------------------------------
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("hyperboloid");// vytvoreni okna pro kresleni
glutReshapeWindow(550, 450); // zmena velikosti okna
glutPositionWindow(100, 100); // pozice leveho horniho rohu okna
glutDisplayFunc(onDisplay); // registrace funkce volane pri prekreslovani okna
glutReshapeFunc(onResize); // registrace funkce volane pri zmene velikosti okna
glutKeyboardFunc(onKeyboard); // registrace funkce volani pri stlaceni klavesy
glEnable(GL_DEPTH_TEST);
//glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glutMainLoop(); // nekonecna smycka, kde se volaji zaregistrovane funkce
return 0; // navratova hodnota vracena operacnimu systemu
}
//---------------------------------------------------------------------
// Konec zdrojoveho souboru
//---------------------------------------------------------------------
//---------------------------------------------------------------------
// Program otevre jedno hlavni okno a vykresli do nej 3D elipsoid pomocí bodù
// Klavesami x, z, y se nastavuje poloha kamery, klavesou r rotace elipsoidu
// Klavesami p a q se nastavuje poloha elipsoidu
// Program lze ukoncit stiskem klavesy ESC.
//---------------------------------------------------------------------
#include <glut.h> // hlavickovy soubor funkci GLUTu
//#include <stdlib.h>
#include <math.h>
float vert=10.0;
float horiz=10.0;
int px=150;
int py=10;
float rr,gg,bb,zet=20.0;
float x,y,z, uhel=10;
float a=170,b=130,c=90;
//---------------------------------------------------------------------
// Nastaveni souradneho systemu v zavislosti na velikosti okna
//---------------------------------------------------------------------
void onResize(int w, int h) // w a h reprezentuje novou velikost okna
{
glViewport(20, 20, w, h); // viditelna oblast pres cele okno
glMatrixMode(GL_PROJECTION); // zacatek modifikace projekcni matice
glLoadIdentity(); // vymazani projekcni matice (=identita)
glOrtho(-200, w, -200, h, -400, 400); // mapovani abstraktnich souradnic do souradnic okna
glMatrixMode(GL_MODELVIEW);
}
//---------------------------------------------------------------------
// Tato funkce je volana pri kazdem prekresleni okna
//---------------------------------------------------------------------
void onDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(horiz, vert, zet,
1.0f, 0.0f, 0.0f,
0.0f, 10.0f, 0.0f);
glClearColor(1.0, 1.0, 1.0, 0.0); // nastaveni mazaci barvy na cernou
glClear(GL_COLOR_BUFFER_BIT); // vymazani bitovych rovin barvoveho bufferu
glColor3f(0.0f, 0.0f, 0.0f); // nastaveni barvy pro kresleni
glColor3f(1.0f, 0.0f, 0.0f);
glLineWidth(2.0);
glPointSize(2.0);
glRotatef((float)uhel, 0.0f, 0.0f, 1.0f);
glTranslatef(px,0,0);
glTranslatef(0,py,0);
for(x=-a/1.8;x<a/1.8;x=x+2) // vykreslení elipsoidu pomocí bodu ze smeru z
for(y=-b/1.8;y<b/1.8;y=y+2)
{
//if(((x*x)/(a*a)+(y*y)/(b*b)) < 1)
if(((x*x)/(a*a)+(y*y)/(b*b)) < 1)
{
//z = sqrt((1-(x*x)/(a*a)-(y*y)/(b*b))*(c*c));
z = sqrt((1-(x*x)/(a*a)-(y*y)/(b*b))*(c*c));
glBegin(GL_POINTS);
rr=(x+c/2)/c;
gg=(x+c/2)/c;
bb=1-(x+c/2)/c;
glColor3f(rr, gg, bb);
glVertex3f(x,y,z);
glColor3f(rr, gg, bb);
glVertex3f(x,y,-z);
glEnd();
}
}
for(x=-a/1.8;x<a/1.8;x=x+2) // vykreslení elipsoidu pomocí bodu ze smeru y
for(z=-c/1.8;z<c/1.8;z=z+2)
{
//if(((x*x)/(a*a)+(z*z)/(c*c)) < 1)
if(((x*x)/(a*a)+(z*z)/(c*c)) < 1)
{
//y = sqrt((1-(x*x)/(a*a)-(z*z)/(c*c))*(b*b));
y = sqrt((1-(x*x)/(a*a)-(z*z)/(c*c))*(b*b));
glBegin(GL_POINTS);
rr=(x+b/2)/b;
gg=1-(x+b/2)/b;
bb=(x+b/2)/b;
glColor3f(rr, gg, bb);
glVertex3f(x,y,z);
glColor3f(rr, gg, bb);
glVertex3f(x,-y,z);
glEnd();
}
}
for(y=-b/1.8;y<b/1.8;y=y+1) // vykreslení elipsoidu pomocí bodu ze smeru x
for(z=-c/1.8;z<c/1.8;z=z+1)
{
//if(((y*y)/(b*b)+(z*z)/(c*c)) < 1)
if(((y*y)/(b*b)+(z*z)/(c*c)) < 1)
{
//x = sqrt((1-(y*y)/(b*b)-(z*z)/(c*c))*(a*a));
x = sqrt((1-(y*y)/(b*b)-(z*z)/(c*c))*(a*a));
glBegin(GL_POINTS);
rr=1-(y+a/2)/a;
gg=(y+a/2)/a;
bb=(y+a/2)/a;
glColor3f(rr, gg, bb);
glVertex3f(x,y,z);
glColor3f(rr, gg, bb);
glVertex3f(-x,y,z);
glEnd();
}
}
glColor3f(1.0f, 0.0f, 0.0f);
glTranslatef(px,-150,0);
glTranslatef(py,-150,0);
// glutWireSphere(120.0f, 16, 16);
// glutWireTeapot(100);
// glutWireTorus(50,100,16,16);
// glutWireCone(100,100,16,16);
glFlush();
glutSwapBuffers();
}
//---------------------------------------------------------------------
// Tato funkce je volana pri stlaceni ASCII klavesy
//---------------------------------------------------------------------
void onKeyboard(unsigned char key, int x, int y)
{
if (key==27) exit(0);
if (key == 'x') horiz += 1.0;
if (key == 'X') horiz -= 1.0;
if (key == 'y') vert += 1.0;
if (key == 'Y') vert -= 1.0;
if (key == 'z') zet += 1.0;
if (key == 'Z') zet -= 1.0;
if (key == 'r') uhel++;
if (key == 'R') uhel--;
if (key == 'p') px++;
if (key == 'P') px--;
if (key == 'q') py++;
if (key == 'Q') py--;
onDisplay();
}
//---------------------------------------------------------------------
// Hlavni funkce konzolove aplikace
//---------------------------------------------------------------------
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutCreateWindow("Implicitni Elipsoid");// vytvoreni okna pro kresleni
glutReshapeWindow(550, 450); // zmena velikosti okna
glutPositionWindow(100, 100); // pozice leveho horniho rohu okna
glutDisplayFunc(onDisplay); // registrace funkce volane pri prekreslovani okna
glutReshapeFunc(onResize); // registrace funkce volane pri zmene velikosti okna
glutKeyboardFunc(onKeyboard); // registrace funkce volani pri stlaceni klavesy
glEnable(GL_DEPTH_TEST);
//glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glutMainLoop(); // nekonecna smycka, kde se volaji zaregistrovane funkce
return 0; // navratova hodnota vracena operacnimu systemu
}
//---------------------------------------------------------------------
// Konec zdrojoveho souboru
//---------------------------------------------------------------------
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment