200792501.jpg

None.gif
ExpandedBlockStart.gifContractedBlock.gif/**//* two-dimensional Sierpinski gasket          */
ExpandedBlockStart.gifContractedBlock.gif/**//* generated using randomly selected vertices */
ExpandedBlockStart.gifContractedBlock.gif/**//* and bisection                              */
None.gif
None.gif#include <GL/glut.h>
None.gif
None.gifvoid myinit()
ExpandedBlockStart.gifContractedBlock.gifdot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif/**//* attributes */
ExpandedSubBlockStart.gifContractedSubBlock.gif      glClearColor(1.0, 1.0, 1.0, 1.0); /**//* white background */
ExpandedSubBlockStart.gifContractedSubBlock.gif      glColor3f(1.0, 0.0, 0.0); /**//* draw in red */
ExpandedBlockEnd.gif}
None.gif
None.gifvoid reshape(int w,int h)
ExpandedBlockStart.gifContractedBlock.gifdot.gif{
InBlock.gif    glViewport(0,0,(GLsizei)w,(GLsizei)h);
InBlock.gif    glMatrixMode(GL_PROJECTION);
InBlock.gif    glLoadIdentity();
ExpandedSubBlockStart.gifContractedSubBlock.gif    gluOrtho2D(0.0, 50.0, 0.0, 50.0);/**//* set up viewing 50.0 x 50.0 camera coordinate window with origin lower left */
InBlock.gif
InBlock.gif    glMatrixMode(GL_MODELVIEW);
InBlock.gif    glLoadIdentity();
InBlock.gif
ExpandedBlockEnd.gif}
None.gif
None.gifvoid display()
ExpandedBlockStart.gifContractedBlock.gifdot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//* A triangle */
ExpandedSubBlockStart.gifContractedSubBlock.gif    GLfloat vertices[3][2]=dot.gif{dot.gif{0.0,0.0},dot.gif{25.0,50.0},dot.gif{50.0,0.0}};
InBlock.gif    int j, k;
ExpandedSubBlockStart.gifContractedSubBlock.gif    int rand();       /**//* standard random number generator */
ExpandedSubBlockStart.gifContractedSubBlock.gif    GLfloat p[2] =dot.gif{7.5, 5.0};  /**//* arbitrary initial point inside triangle */
ExpandedSubBlockStart.gifContractedSubBlock.gif    glClear(GL_COLOR_BUFFER_BIT);  /**//*clear the window */
InBlock.gif    glBegin(GL_POINTS);
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif/**//* compute and plot 5000 new points */
InBlock.gif
InBlock.gif    for( k=0; k<5000; k++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif         j=rand()%3; /**//* pick a vertex at random */
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif     /**//* compute point halfway between selected vertex and old point */
InBlock.gif
InBlock.gif         p[0] = (p[0]+vertices[j][0])/2.0;
InBlock.gif         p[1] = (p[1]+vertices[j][1])/2.0;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif     /**//* plot new point */
InBlock.gif
InBlock.gif         glVertex2fv(p);
InBlock.gif
ExpandedSubBlockEnd.gif    }
InBlock.gif     glEnd();
ExpandedSubBlockStart.gifContractedSubBlock.gif     glFlush(); /**//* clear buffers */
ExpandedBlockEnd.gif }
None.gif
None.gifint main(int argc, char** argv)
ExpandedBlockStart.gifContractedBlock.gifdot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif/**//* standard GLUT initialization */
InBlock.gif    glutInit(&argc,argv);
ExpandedSubBlockStart.gifContractedSubBlock.gif    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); /**//* default, not needed */
ExpandedSubBlockStart.gifContractedSubBlock.gif    glutInitWindowSize(500,500); /**//* 500 x 500 pixel window */
ExpandedSubBlockStart.gifContractedSubBlock.gif    glutInitWindowPosition(0,0); /**//* place window top left on display */
ExpandedSubBlockStart.gifContractedSubBlock.gif    glutCreateWindow("Sierpinski Gasket"); /**//* window title */
ExpandedSubBlockStart.gifContractedSubBlock.gif    glutDisplayFunc(display); /**//* display callback invoked when window opened */
InBlock.gif    glutReshapeFunc(reshape);
ExpandedSubBlockStart.gifContractedSubBlock.gif    myinit(); /**//* set attributes */
ExpandedSubBlockStart.gifContractedSubBlock.gif    glutMainLoop(); /**//* enter event loop */
ExpandedBlockEnd.gif}
None.gif


200792502.jpg

None.gif
ExpandedBlockStart.gifContractedBlock.gif/**//* recursive subdivision of triangle to form Sierpinski gasket */
ExpandedBlockStart.gifContractedBlock.gif/**//* number of recursive steps given on command line */
None.gif
None.gif#include <GL/glut.h>
None.gif
ExpandedBlockStart.gifContractedBlock.gif/**//* initial triangle */
None.gif
ExpandedBlockStart.gifContractedBlock.gifGLfloat v[3][2]=dot.gif{dot.gif{-1.0, -0.58}, dot.gif{1.0, -0.58}, dot.gif{0.0, 1.15}};
None.gif
None.gifint n;
None.gif
None.gifvoid triangle( GLfloat *a, GLfloat *b, GLfloat *c)
None.gif
ExpandedBlockStart.gifContractedBlock.gif/**//* specify one triangle */
ExpandedBlockStart.gifContractedBlock.gifdot.gif{
InBlock.gif       glVertex2fv(a);
InBlock.gif       glVertex2fv(b);
InBlock.gif       glVertex2fv(c);
ExpandedBlockEnd.gif}
None.gif
None.gifvoid divide_triangle(GLfloat *a, GLfloat *b, GLfloat *c, int m)
ExpandedBlockStart.gifContractedBlock.gifdot.gif{
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif/**//* triangle subdivision using vertex numbers */
InBlock.gif
InBlock.gif    GLfloat v0[2], v1[2], v2[2];
InBlock.gif    int j;
InBlock.gif    if(m>0)
ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
InBlock.gif        for(j=0; j<2; j++) v0[j]=(a[j]+b[j])/2;
InBlock.gif        for(j=0; j<2; j++) v1[j]=(a[j]+c[j])/2;
InBlock.gif        for(j=0; j<2; j++) v2[j]=(b[j]+c[j])/2;
InBlock.gif        divide_triangle(a, v0, v1, m-1);
InBlock.gif        divide_triangle(c, v1, v2, m-1);
InBlock.gif        divide_triangle(b, v2, v0, m-1);
ExpandedSubBlockEnd.gif    }
ExpandedSubBlockStart.gifContractedSubBlock.gif    else triangle(a,b,c); /**//* draw triangle at end of recursion */
ExpandedBlockEnd.gif}
None.gif
None.gif
None.gifvoid display()
ExpandedBlockStart.gifContractedBlock.gifdot.gif{
InBlock.gif    glClear(GL_COLOR_BUFFER_BIT);
InBlock.gif    glBegin(GL_TRIANGLES);
InBlock.gif    divide_triangle(v[0], v[1], v[2], n);
InBlock.gif    glEnd();
InBlock.gif    glFlush();
ExpandedBlockEnd.gif}
None.gif
None.gifvoid myinit()
ExpandedBlockStart.gifContractedBlock.gifdot.gif{
InBlock.gif    glMatrixMode(GL_PROJECTION);
InBlock.gif    glLoadIdentity();
InBlock.gif    gluOrtho2D(-2.0, 2.0, -2.0, 2.0);
InBlock.gif    glMatrixMode(GL_MODELVIEW);
InBlock.gif    glClearColor (1.0, 1.0, 1.0, 1.0);
InBlock.gif    glColor3f(0.0,0.0,1.0);
ExpandedBlockEnd.gif}
None.gif
None.gifint main(int argc, char **argv)
ExpandedBlockStart.gifContractedBlock.gifdot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif    n=3; /**//* or set number of subdivision steps here */
InBlock.gif    glutInit(&argc, argv);
InBlock.gif    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
InBlock.gif    glutInitWindowSize(500, 500);
InBlock.gif    glutCreateWindow("Sierpinski Gasket");
InBlock.gif    glutDisplayFunc(display);
InBlock.gif    myinit();
InBlock.gif    glutMainLoop();
ExpandedBlockEnd.gif}
None.gif


200792503.jpg

ExpandedBlockStart.gifContractedBlock.gif/**//* recursive subdivision of a tetrahedron to form 3D Sierpinski gasket */
ExpandedBlockStart.gifContractedBlock.gif/**//* number of recursive steps given on command line */
None.gif
None.gif#include <stdlib.h>
None.gif#include <GL/glut.h>
None.gif
ExpandedBlockStart.gifContractedBlock.gif/**//* initial tetrahedron */
None.gif
ExpandedBlockStart.gifContractedBlock.gifGLfloat v[4][3]=dot.gif{dot.gif{0.0, 0.0, 1.0}, dot.gif{0.0, 0.942809, -0.33333},
ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{-0.816497, -0.471405, -0.333333}, dot.gif{0.816497, -0.471405, -0.333333}};
None.gif
ExpandedBlockStart.gifContractedBlock.gifGLfloat colors[4][3] = dot.gif{dot.gif{1.0, 0.0, 0.0}, dot.gif{0.0, 1.0, 0.0},
ExpandedSubBlockStart.gifContractedSubBlock.gif                        dot.gif{0.0, 0.0, 1.0}, dot.gif{0.0, 0.0, 0.0}};
None.gif
None.gifint n;
None.gif
None.gifvoid triangle(GLfloat *va, GLfloat *vb, GLfloat *vc)
ExpandedBlockStart.gifContractedBlock.gifdot.gif{
InBlock.gif       glVertex3fv(va);
InBlock.gif       glVertex3fv(vb);
InBlock.gif       glVertex3fv(vc);
ExpandedBlockEnd.gif}
None.gif
None.gifvoid tetra(GLfloat *a, GLfloat *b, GLfloat *c, GLfloat *d)
ExpandedBlockStart.gifContractedBlock.gifdot.gif{
InBlock.gif    glColor3fv(colors[0]);
InBlock.gif    triangle(a, b, c);
InBlock.gif    glColor3fv(colors[1]);
InBlock.gif    triangle(a, c, d);
InBlock.gif    glColor3fv(colors[2]);
InBlock.gif    triangle(a, d, b);
InBlock.gif    glColor3fv(colors[3]);
InBlock.gif    triangle(b, d, c);
ExpandedBlockEnd.gif}
None.gif
None.gifvoid divide_tetra(GLfloat *a, GLfloat *b, GLfloat *c, GLfloat *d, int m)
ExpandedBlockStart.gifContractedBlock.gifdot.gif{
InBlock.gif
InBlock.gif    GLfloat mid[6][3];
InBlock.gif    int j;
InBlock.gif    if(m>0)
ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//* compute six midpoints */
InBlock.gif
InBlock.gif        for(j=0; j<3; j++) mid[0][j]=(a[j]+b[j])/2;
InBlock.gif        for(j=0; j<3; j++) mid[1][j]=(a[j]+c[j])/2;
InBlock.gif        for(j=0; j<3; j++) mid[2][j]=(a[j]+d[j])/2;
InBlock.gif        for(j=0; j<3; j++) mid[3][j]=(b[j]+c[j])/2;
InBlock.gif        for(j=0; j<3; j++) mid[4][j]=(c[j]+d[j])/2;
InBlock.gif        for(j=0; j<3; j++) mid[5][j]=(b[j]+d[j])/2;
InBlock.gif
ExpandedSubBlockStart.gifContractedSubBlock.gif        /**//* create 4 tetrahedrons by subdivision */
InBlock.gif
InBlock.gif        divide_tetra(a, mid[0], mid[1], mid[2], m-1);
InBlock.gif        divide_tetra(mid[0], b, mid[3], mid[5], m-1);
InBlock.gif        divide_tetra(mid[1], mid[3], c, mid[4], m-1);
InBlock.gif        divide_tetra(mid[2], mid[4], d, mid[5], m-1);
InBlock.gif
ExpandedSubBlockEnd.gif    }
ExpandedSubBlockStart.gifContractedSubBlock.gif    else(tetra(a,b,c,d)); /**//* draw tetrahedron at end of recursion */
ExpandedBlockEnd.gif}
None.gif
None.gif
None.gifvoid display()
ExpandedBlockStart.gifContractedBlock.gifdot.gif{
InBlock.gif    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
InBlock.gif    glBegin(GL_TRIANGLES);
InBlock.gif    divide_tetra(v[0], v[1], v[2], v[3], n);
InBlock.gif    glEnd();
InBlock.gif    glFlush();
ExpandedBlockEnd.gif}
None.gif
None.gif
None.gifvoid myReshape(int w, int h)
ExpandedBlockStart.gifContractedBlock.gifdot.gif{
InBlock.gif    glViewport(0, 0, w, h);
InBlock.gif    glMatrixMode(GL_PROJECTION);
InBlock.gif    glLoadIdentity();
InBlock.gif    if (w <= h)
InBlock.gif        glOrtho(-2.0, 2.0, -2.0 * (GLfloat) h / (GLfloat) w,
InBlock.gif            2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0);
InBlock.gif    else
InBlock.gif        glOrtho(-2.0 * (GLfloat) w / (GLfloat) h,
InBlock.gif            2.0 * (GLfloat) w / (GLfloat) h, -2.0, 2.0, -10.0, 10.0);
InBlock.gif    glMatrixMode(GL_MODELVIEW);
InBlock.gif    glutPostRedisplay();
ExpandedBlockEnd.gif}
None.gif
None.gif
None.gifint main(int argc, char **argv)
ExpandedBlockStart.gifContractedBlock.gifdot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif    n=3; /**//* or enter number of subdivision steps here */
InBlock.gif    glutInit(&argc, argv);
InBlock.gif    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
InBlock.gif    glutInitWindowSize(500, 500);
InBlock.gif    glutCreateWindow("3D Gasket");
InBlock.gif    glutReshapeFunc(myReshape);
InBlock.gif    glutDisplayFunc(display);
InBlock.gif    glEnable(GL_DEPTH_TEST);
InBlock.gif    glClearColor (1.0, 1.0, 1.0, 1.0);
InBlock.gif    glutMainLoop();
ExpandedBlockEnd.gif}
None.gif