Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  2d
Language: C/C++
Code:
#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>
int round(float x){return ((int)(x+0.5));}

void matProd(float a[100][3],float b[3][3],float c[100][3],int m)
{
        int i,j,k;
        for(i=0;i<=m-1;i++)
            for(j=0;j<=2;j++)
            {
                c[i][j]=0;
                for(k=0;k<=2;k++)
                {
                    c[i][j] += a[i][k]*b[k][j];
                }
            }
}
void reflection(float given[100][3],int n,char choice)
{
    int i;
    float x[3][3]={{1,0,0},{0,-1,0},{0,0,1}};
    float y[3][3]={{-1,0,0},{0,1,0},{0,0,1}};
    float ans[100][3];
    if(choice == 'x'||choice == 'X')
        matProd(given,x,ans,n);
    else
        matProd(given,y,ans,n);

    //original
    for(i=0;i<=n-2;i++)
    line(round(320+given[i][0]),round(240-given[i][1]),round(320+given[i+1][0]),round(240-given[i+1][1]));
    line(round(320+given[0][0]),round(240-given[0][1]),round(320+given[n-1][0]),round(240-given[n-1][1]));

    //transformed
    setcolor(YELLOW);
    for(i=0;i<=n-2;i++)
    line(round(320+ans[i][0]),round(240-ans[i][1]),round(320+ans[i+1][0]),round(240-ans[i+1][1]));
    line(round(320+ans[0][0]),round(240-ans[0][1]),round(320+ans[n-1][0]),round(240-ans[n-1][1]));

}

void rotation(float given[100][3],int n,float x)
{
    int i;
    float rot[3][3];
    float ans[100][3];
    rot[0][0]=rot[1][1]=cos(x);
    rot[1][0]=-sin(x);rot[0][1]=sin(x);
    rot[0][2]=rot[1][2]=rot[2][0]=rot[2][1]=0;
    rot[2][2]=1;
    matProd(given,rot,ans,n);

    //original
    for(i=0;i<=n-2;i++)
    line(round(320+given[i][0]),round(240-given[i][1]),round(320+given[i+1][0]),round(240-given[i+1][1]));
    line(round(320+given[0][0]),round(240-given[0][1]),round(320+given[n-1][0]),round(240-given[n-1][1]));

    //transformed
    setcolor(YELLOW);
    for(i=0;i<=n-2;i++)
    line(round(320+ans[i][0]),round(240-ans[i][1]),round(320+ans[i+1][0]),round(240-ans[i+1][1]));
    line(round(320+ans[0][0]),round(240-ans[0][1]),round(320+ans[n-1][0]),round(240-ans[n-1][1]));
}

void scaling(float given[100][3],int n,float sx,float sy)
{
    int i;
    float s[3][3]={{0,0,0},{0,0,0},{0,0,1}};
    float ans[100][3];
    s[0][0]=sx;s[1][1]=sy;
    matProd(given,s,ans,n);

    //original
    for(i=0;i<=n-2;i++)
    line(round(320+given[i][0]),round(240-given[i][1]),round(320+given[i+1][0]),round(240-given[i+1][1]));
    line(round(320+given[0][0]),round(240-given[0][1]),round(320+given[n-1][0]),round(240-given[n-1][1]));

    //transformed
    setcolor(YELLOW);
    for(i=0;i<=n-2;i++)
    line(round(320+ans[i][0]),round(240-ans[i][1]),round(320+ans[i+1][0]),round(240-ans[i+1][1]));
    line(round(320+ans[0][0]),round(240-ans[0][1]),round(320+ans[n-1][0]),round(240-ans[n-1][1]));
}

void translation(float given[100][3],int n,float tx,float ty)
{
    int i;
    float t[3][3]={{1,0,0},{0,1,0},{0,0,1}};
    float ans[100][3];
    t[2][0]=tx;t[2][1]=ty;
    matProd(given,t,ans,n);

    //original
    for(i=0;i<=n-2;i++)
    line(round(320+given[i][0]),round(240-given[i][1]),round(320+given[i+1][0]),round(240-given[i+1][1]));
    line(round(320+given[0][0]),round(240-given[0][1]),round(320+given[n-1][0]),round(240-given[n-1][1]));

    //transformed
    setcolor(YELLOW);
    for(i=0;i<=n-2;i++)
    line(round(320+ans[i][0]),round(240-ans[i][1]),round(320+ans[i+1][0]),round(240-ans[i+1][1]));
    line(round(320+ans[0][0]),round(240-ans[0][1]),round(320+ans[n-1][0]),round(240-ans[n-1][1]));
}

void shear(float given[100][3],int n,char choice,float sf)
{
    int i;
    float shx[3][3]={{1,0,0},{5,1,0},{0,0,1}};
    float shy[3][3]={{1,5,0},{0,1,0},{0,0,1}};
    float ans[100][3];
    shx[1][0]=shy[0][1]=sf;
    if(choice == 'x'||choice == 'X')
        matProd(given,shx,ans,n);
    else
        matProd(given,shy,ans,n);

    //original
    for(i=0;i<=n-2;i++)
    line(round(320+given[i][0]),round(240-given[i][1]),round(320+given[i+1][0]),round(240-given[i+1][1]));
    line(round(320+given[0][0]),round(240-given[0][1]),round(320+given[n-1][0]),round(240-given[n-1][1]));

    //transformed
    setcolor(YELLOW);
    for(i=0;i<=n-2;i++)
    line(round(320+ans[i][0]),round(240-ans[i][1]),round(320+ans[i+1][0]),round(240-ans[i+1][1]));
    line(round(320+ans[0][0]),round(240-ans[0][1]),round(320+ans[n-1][0]),round(240-ans[n-1][1]));

}

void main()
{
    int gd=DETECT,gm;
    int i,choice,n;
    float x,y,angle,given[100][3];
    char c;
    clrscr();
    do
    {
    printf("enter no. of vertices/points ");
    scanf("%d",&n);
    printf("enter the vertices in clockwise or anticlockwise direction\n");
    for(i=0;i<=n-1;i++)
    {
        given[i][2]=1;
        printf("enter point no. %d ",i+1);
        scanf("%f%f",&given[i][0],&given[i][1]);

    }
    printf("MENU\n 1:reflection\n 2:rotation\n 3:scaling\n 4:translation\n 5:shear\n 6:exit\nENTER A CHOICE");
    scanf("%d",&choice);
    switch(choice)
    {
        case 1:
        printf("enter 'x' for x-axis and 'y' for y axix ");
        fflush(stdin);
        scanf("%c",&c);
        initgraph(&gd,&gm,"\\BGI");
        line(0,240,640,240);
        line(320,0,320,480);
        reflection(given,n,c);
        getch();
        closegraph();
        break;

        case 2:
        printf("enter angle of rotation (anticlockwise is taken as positive and clockwise as negative) ");
        scanf("%f",&angle);
        angle = angle*3.14/180;
        initgraph(&gd,&gm,"\\BGI");
        line(0,240,640,240);
        line(320,0,320,480);
        rotation(given,n,angle);
        getch();
        closegraph();
        break;

        case 3:
        printf("enter sx and sy ");
        scanf("%f%f",&x,&y);
        initgraph(&gd,&gm,"\\BGI");
        line(0,240,640,240);
        line(320,0,320,480);
        scaling(given,n,x,y);
        getch();
        closegraph();
        break;

        case 4:
        printf("enter tx and ty ");
        scanf("%f%f",&x,&y);
        initgraph(&gd,&gm,"\\BGI");
        line(0,240,640,240);
        line(320,0,320,480);
        translation(given,n,x,y);
        getch();
        closegraph();
        break;

        case 5:
        printf("enter 'x' for x-shear and 'y' for y-shear ");
        fflush(stdin);
        scanf("%c",&c);
        printf("enter shear factor ");
        scanf("%f",&x);
        initgraph(&gd,&gm,"\\BGI");
        line(0,240,640,240);
        line(320,0,320,480);
        shear(given,n,c,x);
        getch();
        closegraph();
        break;

        default:
        if(choice!=6)
        printf("invalid choice");
    }
    }while(choice!=6);
}
Comments: