#include<stdio.h> #include<graphics.h> struct point { int x,y; }pol[3],polnew[3],wmin,wmax,vmin,vmax; float sx=0.5,sy=0.5; int n=3,max; float trans[3][3],result[3][1],xandy[3][1]; float minside() { int i; float a,s; i=0; s=sqrt((pol[i].x-pol[(i+1)%3].x)*(pol[i].x-pol[(i+1)%3].x)+ (pol[i].y-pol[(i+1)%3].y)*(pol[i].y-pol[(i+1)%3].y)); for(i=1;i<3;i++) { a=sqrt((pol[i].x-pol[(i+1)%3].x)*(pol[i].x-pol[(i+1)%3].x)+ (pol[i].y-pol[(i+1)%3].y)*(pol[i].y-pol[(i+1)%3].y)); if(a<s) s=a; } return s; } void readpoly() { int i; for(i=0;i<n;i++) { printf("\nEnter the %d co=ordinates ",i+1); scanf("%d%d",&pol[i].x,&pol[i].y); } } void drawpolygon(struct point p[]) { int i; for(i=0;i<n;i++) line(p[i].x,p[i].y,p[(i+1)%n].x,p[(i+1)%n].y); } void mulmat() { int i,j,k; for(i=0;i<3;i++) { for(j=0;j<1;j++) { result[i][j]=0.0; for(k=0;k<3;k++) result[i][j]+=trans[i][k]*xandy[k][j]; } } } void transformpoly(struct point p1[],struct point p2[]) { int i; for(i=0;i<n;i++) { xandy[0][0]=p1[i].x; xandy[1][0]=p1[i].y; xandy[2][0]=1; mulmat(); p2[i].x=result[0][0]; p2[i].y=result[1][0]; } } void makeIdentity() { int i,j; for(i=0;i<3;i++) { for(j=0;j<3;j++) trans[i][j]=0.0; trans[i][i]=1.0; } } void sierp(struct point pp[],int level) { struct point p1[3],p2[3],p3[3]; int dx,dy,i; level++; if(level==max) return; makeIdentity(); trans[0][0]=sx; trans[0][2]=(1-sx)*(float)pp[0].x; trans[1][1]=sy; trans[1][2]=(1-sy)*(float)pp[0].y; transformpoly(pp,p1); drawpolygon(p1); makeIdentity(); dx=-p1[1].x; dy=-p1[1].y; trans[0][2]=dx; trans[1][2]=dy; transformpoly(p1,p2); makeIdentity(); dx=pp[1].x; dy=pp[1].y; trans[0][2]=dx; trans[1][2]=dy; transformpoly(p2,p2); drawpolygon(p2); makeIdentity(); dx=-p1[2].x; dy=-p1[2].y; trans[0][2]=dx; trans[1][2]=dy; transformpoly(p1,p3); makeIdentity(); dx=pp[2].x; dy=pp[2].y; trans[0][2]=dx; trans[1][2]=dy; transformpoly(p3,p3); drawpolygon(p3); sierp(p1,level); sierp(p2,level); sierp(p3,level); } int main() { int gd=DETECT,gm=VGAMAX; int choice,dx,dy,i; float small; readpoly(); initgraph(&gd,&gm,NULL); drawpolygon(pol); setcolor(RED); getch(); small=minside(); max=2+(int)small/50; sierp(pol,0); while (!kbhit()); closegraph(); return 0; }
Sunday, December 12, 2010
Draw a Sierpinski triangle using fractal geometric method

Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment