Sunday, December 12, 2010

Draw a Sierpinski triangle using fractal geometric method

Share Orkut
#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; 
}

No comments:

Post a Comment