int main() { struct Coord top, left, right; left.x = -1; left.y = 1; top.x = 0; top.y = -1; right.x = 1; right.y = 1; drawSierpinski(0, left, top, right); printf("index = %d, %d\n", index, rand_interval(0,255)); int tri = 0; for (int i = 0; i < 120; i++){ for (int j = 0; j < 2; j++){ printf("(%f,%f,%d) ", verticesX[i][j], verticesY[i][j], rand_interval(0, 255)); } printf("\nColor = (%f,%f,%f)", colors[i][0], colors[i][1], colors[i][2]); getch(); printf("\n"); } getch(); }
void drawSierpinski(int iter, struct Coord a, struct Coord b, struct Coord c) { if (iter >= 8) // if lines are only 2 pixels in length { return; } else { drawSierpinski(iter + 1, a, mid(a, b), mid(a, c)); verticesX[index][0] = a.x; verticesX[index][1] = mid(a, b).x; verticesX[index][2] = mid(a, c).x; verticesY[index][0] = a.y; verticesY[index][1] = mid(a, b).y; verticesY[index][2] = mid(a, c).y; colors[index][0] = scale(rand_interval(0, 255),0,255,0,1); colors[index][1] = scale(rand_interval(0, 255), 0, 255, 0, 1); colors[index][2] = scale(rand_interval(0, 255), 0, 255, 0, 1); drawSierpinski(iter + 1, mid(a, b), b, mid(b, c)); index++; verticesX[index][0] = mid(a, b).x; verticesX[index][1] = b.x; verticesX[index][2] = mid(b, c).x; verticesY[index][0] = mid(a, b).y; verticesY[index][1] = b.y; verticesY[index][2] = mid(b, c).y; colors[index][0] = scale(rand_interval(0, 255), 0, 255, 0, 1); colors[index][1] = scale(rand_interval(0, 255), 0, 255, 0, 1); colors[index][2] = scale(rand_interval(0, 255), 0, 255, 0, 1); drawSierpinski(iter + 1, mid(a, c), mid(b, c), c); index++; verticesX[index][0] = mid(a, c).x; verticesX[index][1] = mid(b, c).x; verticesX[index][2] = c.x; verticesY[index][0] = mid(a, c).y; verticesY[index][1] = mid(b, c).y; verticesY[index][2] = c.y; colors[index][0] = scale(rand_interval(0, 255), 0, 255, 0, 1); colors[index][1] = scale(rand_interval(0, 255), 0, 255, 0, 1); colors[index][2] = scale(rand_interval(0, 255), 0, 255, 0, 1); } }
void drawSierpinski(Point a, Point b, Point c, int level) { Point m0, m1, m2; //Example rendering function if (level > 0) { m0.x = (a.x+b.x) /2.0; m0.y = (a.y+b.y) /2.0; m1.x = (a.x+c.x) /2.0; m1.y = (a.y+c.y) /2.0; m2.x = (b.x+c.x) /2.0; m2.y = (c.y+b.y) /2.0; drawSierpinski(a,m0,m1,level-1); drawSierpinski(b,m2,m0,level-1); drawSierpinski(c,m1,m2,level-1); } else drawTriangle(a,b,c); } // end draw Sierpinski
void myMouse(int button, int state, int x, int y){ const int size = 3; static int clickCount = 0; static GLIntPoint points[size]; if(button == GLUT_LEFT_BUTTON && state == GLUT_DOWN && clickCount < size){ points[clickCount].x = x; points[clickCount].y = HEIGHT - y; drawDot(points[clickCount]); clickCount++; if(clickCount == size){ drawSierpinski(points,size); } } }
GLuint makeObject() { //Preparing example rendering GLuint list; list = glGenLists(1); glNewList(list, GL_COMPILE); // set the initial color glColor3f( 1.0, 0.0, 0.0 ); // points for triangle to draw Sierpinski Gasket Point a, b, c; a.x=-0.8f; a.y=-0.8f; b.x=0.8f; b.y=-0.8f; c.x=0.0f; c.y=0.8f; drawSierpinski(a,b,c,4); glEndList(); return list; } // end make object
void GLDraw::drawSierpinski(int depth, float size, float modifier) { glPushMatrix(); if ( depth > 0 ) { drawTriangle(size/3.0); drawSierpinski(depth-1, size/3.0, modifier); glTranslatef(size/3.0, 0.0f, modifier); drawTriangle(size/3.0); drawSierpinski(depth-1, size/3.0, modifier); glTranslatef(size/3.0, 0.0f, modifier); drawTriangle(size/3.0); drawSierpinski(depth-1, size/3.0, modifier); glTranslatef( -size + 0.5 * size, (sqrt(3) * size/3.0) / 2.0, modifier); drawTriangle(size/3.0); drawSierpinski(depth-1, size/3.0, modifier); glTranslatef( size/3.0, 0.0f, modifier); drawTriangle(size/3.0); drawSierpinski(depth-1, size/3.0, modifier); glTranslatef( -0.5 * size/3.0, (sqrt(3) * size/3.0) / 2.0, modifier); drawTriangle(size/3.0); drawSierpinski(depth-1, size/3.0, modifier); depth--; } glPopMatrix(); }