#include<iostream>
#include<GL/glut.h>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
#define SIN 0.86602540 //sin(60 degree)
int n;
int x1=0,x2=550,y1=0,y2=0;
// draw a polygon via list of vertices
void koch(int x1,int y1,int x2,int y2,int m)
{
int xx,yy,x[5],y[5],lx,ly,offx=50,offy=300;
lx=(x2-x1)/3;
ly=(y2-y1)/3;
x[0]=x1; //store point p0;
y[0]=y1;
x[4]=x2; //store point p4;
y[4]=y2;
x[1]=x[0]+lx; //store point p1;
y[1]=y[0]+ly;
x[3]=x[0]+2*lx; //store point p3;
y[3]=y[0]+2*ly;
xx=x[3]-x[1]; //Translate point p2 to Origin;
yy=y[3]-y[1];
x[2]=xx*(0.5)+yy*(SIN); //Perform rotation for point p3
y[2]=-xx*(SIN)+yy*(0.5);
x[2]=x[2]+x[1]; //Perform inverse translation;
y[2]=y[2]+y[1];
if(m>0)
{
koch(x[0],y[0],x[1],y[1],m-1); //Recursive call to Draw Part1
koch(x[1],y[1],x[2],y[2],m-1); //Recursive call to Draw Part2
koch(x[2],y[2],x[3],y[3],m-1); //Recursive call to Draw Part3
koch(x[3],y[3],x[4],y[4],m-1); //Recursive call to Draw Part4
}
else
{
glBegin(GL_LINES);
glVertex2d(offx+x[0],650-(offy+y[0]));
glVertex2d(offx+x[1],650-(offy+y[1]));
glEnd();
glBegin(GL_LINES);
glVertex2d(offx+x[1],650-(offy+y[1]));
glVertex2d(offx+x[2],650-(offy+y[2]));
glEnd();
glBegin(GL_LINES);
glVertex2d(offx+x[2],650-(offy+y[2]));
glVertex2d(offx+x[3],650-(offy+y[3]));
glEnd();
glBegin(GL_LINES);
glVertex2d(offx+x[3],650-(offy+y[3]));
glVertex2d(offx+x[4],650-(offy+y[4]));
glEnd();
}
}
// display callback
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
koch(x1,y1,x2,y2,n); // draw koch curve
glFlush();// send all output to display
}
void myinit()
{
glClearColor(0.0,0.0,0.0,1.0);// Set backgroud as black
glColor3f(1.0,1.0,0.0); //Draw in Yellow
glMatrixMode(GL_PROJECTION); // Estabilish a coordinate system
glLoadIdentity();
gluOrtho2D(0.0,650.0,0.0,650.0);
}
int main(int argc, char **argv)
{
cout<<"Enter the level of curve Generation :";
cin>>n;
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(650,650);
glutInitWindowPosition(0,0);
glutCreateWindow("Koch Curve ");
glutDisplayFunc(display);
myinit();
glutMainLoop();
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPEdML2dsdXQuaD4KI2luY2x1ZGU8c3RkbGliLmg+CiNpbmNsdWRlPHN0ZGlvLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgU0lOIDAuODY2MDI1NDAgIC8vc2luKDYwIGRlZ3JlZSkKCmludCBuOwppbnQgeDE9MCx4Mj01NTAseTE9MCx5Mj0wOwoKLy8gZHJhdyBhIHBvbHlnb24gdmlhIGxpc3Qgb2YgdmVydGljZXMKdm9pZCBrb2NoKGludCB4MSxpbnQgeTEsaW50IHgyLGludCB5MixpbnQgbSkKewoJaW50IHh4LHl5LHhbNV0seVs1XSxseCxseSxvZmZ4PTUwLG9mZnk9MzAwOwoJbHg9KHgyLXgxKS8zOwoJbHk9KHkyLXkxKS8zOwoJeFswXT14MTsgLy9zdG9yZSBwb2ludCBwMDsKCXlbMF09eTE7Cgl4WzRdPXgyOyAvL3N0b3JlIHBvaW50IHA0OwoJeVs0XT15MjsKCXhbMV09eFswXStseDsgLy9zdG9yZSBwb2ludCBwMTsKCXlbMV09eVswXStseTsKCXhbM109eFswXSsyKmx4OyAvL3N0b3JlIHBvaW50IHAzOwoJeVszXT15WzBdKzIqbHk7CgkKCXh4PXhbM10teFsxXTsgLy9UcmFuc2xhdGUgcG9pbnQgcDIgdG8gT3JpZ2luOwoJeXk9eVszXS15WzFdOwoJCgl4WzJdPXh4KigwLjUpK3l5KihTSU4pOyAvL1BlcmZvcm0gcm90YXRpb24gZm9yIHBvaW50IHAzCgl5WzJdPS14eCooU0lOKSt5eSooMC41KTsKCQoJeFsyXT14WzJdK3hbMV07IC8vUGVyZm9ybSBpbnZlcnNlIHRyYW5zbGF0aW9uOwoJeVsyXT15WzJdK3lbMV07CgkKCWlmKG0+MCkKCXsKCQlrb2NoKHhbMF0seVswXSx4WzFdLHlbMV0sbS0xKTsgLy9SZWN1cnNpdmUgY2FsbCB0byBEcmF3IFBhcnQxCgkJa29jaCh4WzFdLHlbMV0seFsyXSx5WzJdLG0tMSk7IC8vUmVjdXJzaXZlIGNhbGwgdG8gRHJhdyBQYXJ0MgoJCWtvY2goeFsyXSx5WzJdLHhbM10seVszXSxtLTEpOyAvL1JlY3Vyc2l2ZSBjYWxsIHRvIERyYXcgUGFydDMKCQlrb2NoKHhbM10seVszXSx4WzRdLHlbNF0sbS0xKTsgLy9SZWN1cnNpdmUgY2FsbCB0byBEcmF3IFBhcnQ0Cgl9CgllbHNlCgl7CgkJZ2xCZWdpbihHTF9MSU5FUyk7CgkJZ2xWZXJ0ZXgyZChvZmZ4K3hbMF0sNjUwLShvZmZ5K3lbMF0pKTsKCQlnbFZlcnRleDJkKG9mZngreFsxXSw2NTAtKG9mZnkreVsxXSkpOwoJCWdsRW5kKCk7CgkKCQlnbEJlZ2luKEdMX0xJTkVTKTsKCQlnbFZlcnRleDJkKG9mZngreFsxXSw2NTAtKG9mZnkreVsxXSkpOwoJCWdsVmVydGV4MmQob2ZmeCt4WzJdLDY1MC0ob2ZmeSt5WzJdKSk7CgkJZ2xFbmQoKTsKCQkKCQlnbEJlZ2luKEdMX0xJTkVTKTsKCQlnbFZlcnRleDJkKG9mZngreFsyXSw2NTAtKG9mZnkreVsyXSkpOwoJCWdsVmVydGV4MmQob2ZmeCt4WzNdLDY1MC0ob2ZmeSt5WzNdKSk7CgkJZ2xFbmQoKTsJCQkKCQkKCQlnbEJlZ2luKEdMX0xJTkVTKTsKCQlnbFZlcnRleDJkKG9mZngreFszXSw2NTAtKG9mZnkreVszXSkpOwoJCWdsVmVydGV4MmQob2ZmeCt4WzRdLDY1MC0ob2ZmeSt5WzRdKSk7CgkJZ2xFbmQoKTsJCgl9Cn0KCi8vIGRpc3BsYXkgY2FsbGJhY2sKdm9pZCBkaXNwbGF5KHZvaWQpIAp7CglnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwoJZ2xDb2xvcjNmKDEuMCwxLjAsMS4wKTsKCWtvY2goeDEseTEseDIseTIsbik7IC8vIGRyYXcga29jaCBjdXJ2ZQoJZ2xGbHVzaCgpOy8vIHNlbmQgYWxsIG91dHB1dCB0byBkaXNwbGF5Cn0KCnZvaWQgbXlpbml0KCkKewoJZ2xDbGVhckNvbG9yKDAuMCwwLjAsMC4wLDEuMCk7Ly8gU2V0IGJhY2tncm91ZCBhcyBibGFjawoJZ2xDb2xvcjNmKDEuMCwxLjAsMC4wKTsgLy9EcmF3IGluIFllbGxvdwoJZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOyAvLyBFc3RhYmlsaXNoIGEgY29vcmRpbmF0ZSBzeXN0ZW0KCWdsTG9hZElkZW50aXR5KCk7CglnbHVPcnRobzJEKDAuMCw2NTAuMCwwLjAsNjUwLjApOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCWNvdXQ8PCJFbnRlciB0aGUgbGV2ZWwgb2YgY3VydmUgR2VuZXJhdGlvbiA6IjsKCWNpbj4+bjsKCQoJZ2x1dEluaXQoJmFyZ2MsYXJndik7CglnbHV0SW5pdERpc3BsYXlNb2RlKEdMVVRfU0lOR0xFIHwgR0xVVF9SR0IpOwoJZ2x1dEluaXRXaW5kb3dTaXplKDY1MCw2NTApOwoJZ2x1dEluaXRXaW5kb3dQb3NpdGlvbigwLDApOwoJZ2x1dENyZWF0ZVdpbmRvdygiS29jaCBDdXJ2ZSAiKTsJCglnbHV0RGlzcGxheUZ1bmMoZGlzcGxheSk7CglteWluaXQoKTsKCWdsdXRNYWluTG9vcCgpOwoJcmV0dXJuIDA7Cn0KCg==