1. Welcome to PHCorner Forums. Take a moment to Sign up and gain unlimited access and extra privileges that guests are not entitled to, such as:

    All that and more! Registration is quick, simple and absolutely free. Join our community today!

Transformation 2D [ Scaling, Translation, Rotation . . .]

Discussion in 'Coding, Programming' started by Jeanh, Nov 20, 2015.

  1. Transformation 2D [ Scaling, Translation, Rotation . . .]

    #include "Stdio.h"
    #include "conio.h"
    #include "math.h"
    #include "graphics.h"

    void intgraph();
    void display_cordinate(char bg_color,char line_color);
    int Create_poly(int poly[][2]);
    void fill_poly(int poly[][2],int points,char line_color,char fill_color);
    void Identity(float Matrix[3][3]);
    void Translate_to_Relative(int poly[][2],int points,int Xdis,int Ydis);

    void main()
    {
    int poly[3][2],i,points,Xdis,Ydis;
    float Sx,Sy,Matrix[3][3],temp,Cos,Sin;
    char ch;
    intgraph();

    setfillstyle(8,RED);
    points=Create_poly(poly);
    display_cordinate(DARKGRAY,WHITE);
    fill_poly(poly,points,WHITE,RED);

    getch();
    Identity(Matrix);
    Xdis=0-poly[0][0];
    Ydis=0-poly[0][1];

    Translate_to_Relative(poly,points,Xdis,Ydis);

    Menu:
    restorecrtmode();
    do
    {
    clrscr();
    printf("


    ================================");
    printf("
    1. Scaling");
    printf("
    2. Translation");
    printf("
    3. Rotation");
    printf("
    4. Reflection [ X axis ]");
    printf("
    5. Reflection [ Y axis ]");
    printf("
    6. Reflection [ X=Y axis ]");
    printf("
    7. Draw ");
    printf("
    8. EXIT ");
    printf("

    ================================");
    printf("
    Choose Ur Destiny:- ");
    ch=getche();
    }while((ch<'1')||(ch>'8'));

    switch(ch)
    {
    case '1':
    printf("
    Enter Scaling Ratio:- ");
    printf("
    Sx:- ");
    scanf("%f",&Sx);
    printf(" Sy:- ");
    scanf("%f",&Sy);
    for(i=0;i<3;i++)
    {
    Matrix[0]=Matrix[0]*Sx;
    Matrix[1]=Matrix[1]*Sy;
    }
    goto Menu;

    case '2':
    printf("
    Enter Translation [Relative]:- ");
    printf("
    Tx:- ");
    scanf("%f",&Sx);
    printf(" Ty:- ");
    scanf("%f",&Sy);

    Matrix[2][0]=Matrix[2][0]+Sx;
    Matrix[2][1]=Matrix[2][1]+Sy;

    goto Menu;

    case '3':
    printf("
    Enter Rotation Angle [Degree]:- ");
    scanf("%f",&Sx);

    Sx=(Sx*3.14)/180;
    Cos=cos(Sx);
    Sin=sin(Sx);
    for(i=0;i<=2;i++)
    {
    temp=Matrix[0]*Cos-Matrix[1]*Sin;
    Matrix[1]=Matrix[0]*Sin+Matrix[1]*Cos;
    Matrix[0]=temp;
    }
    goto Menu;

    case '4':
    Matrix[1][1]=Matrix[1][1]*-1;
    printf("
    Done");
    getch();

    goto Menu;

    case '5':
    Matrix[0][0]=Matrix[0][0]*-1;
    printf("
    Done");
    getch();

    goto Menu;

    case '6':
    Matrix[0][1]=1;
    Matrix[1][1]=1;
    printf("
    Done");
    getch();
    goto Menu;

    case '7':
    for(i=0;i<=points;i++)
    {
    temp=poly[0]*Matrix[0][0]+poly[1]*Matrix[1][0]+Matrix[2][0];

    poly[1]=poly[0]*Matrix[0][1]+poly[1]*Matrix[1][1]+Matrix[2][1];
    poly[0]=temp;
    }

    case '8':
    getch();
    // closegraph();
    exit(0);
    }
    setgraphmode(2);
    display_cordinate(DARKGRAY,WHITE);
    Translate_to_Relative(poly,points,-Xdis,-Ydis);
    fill_poly(poly,points,CYAN,RED);
    getch();
    restorecrtmode();
    do
    {
    clrscr();
    printf("


    Do you Want to Switch to MENU [Y|N]:- ");
    ch=getche();
    }while( (ch!='Y') && (ch!='N') );
    if(ch=='Y')
    {
    Identity(Matrix);
    Xdis=0-poly[0][0];
    Ydis=0-poly[0][1];

    Translate_to_Relative(poly,points,Xdis,Ydis);
    goto Menu;
    }
    closegraph();
    }

    void intgraph()
    {
    int g=DETECT,d;
    initgraph(&g,&d,"c:\tc\bgi");
    }

    void fill_poly(int poly1[][2],int points,char line_color,char fill_color)
    {
    int pol[20],i;
    char str[2];
    for(i=0;i<=points;i++)
    {
    pol[i*2]=poly1[0];
    pol[i*2+1]=poly1[1];
    }
    pol[i*2]=poly1[0][0];
    pol[i*2+1]=poly1[0][1];

    setcolor(line_color);
    setfillstyle(8,fill_color);
    fillpoly(points+1,pol);

    setcolor(fill_color);
    settextstyle(1,0,3);
    for(i=0;i<=points;i++)
    {
    sprintf(str,"%c",i+'a');
    outtextxy(poly1[0],poly1[1],str);
    }
    }

    void Identity(float Matrix[3][3])
    {
    int i,j;
    for(i=0;i<=2;i++)
    {
    for(j=0;j<=2;j++)
    {
    if(i==j)
    Matrix[i][j]=1;
    else
    Matrix[i][j]=0;
    }
    }
    }
    int Create_poly(int poly[][2])
    {
    poly[0][0]=200;
    poly[0][1]=20;

    poly[1][0]=300;
    poly[1][1]=150;

    poly[2][0]=130;
    poly[2][1]=280;

    return 2;
    }

    void display_cordinate(char bg_color,char line_color)
    {
    int i;
    setbkcolor(bg_color);
    setcolor(line_color);
    for(i=0;i<=640;i+=50)
    {
    line(i,0,i,480);
    }

    for(i=0;i<=480;i+=50)
    {
    line(0,i,640,i);
    }
    rectangle(0,0,639,479);
    }

    void Translate_to_Relative(int poly[][2],int points,int Xdis,int Ydis)
    {
    int i;
    for(i=0;i<=points;i++)
    {
    poly[i][0]=poly[i][0]+Xdis;
    poly[i][1]=poly[i][1]+Ydis;
    }
    }[/i][/i][/i][/i][/i][/i]
     
  2. queencee

    queencee Forum Expert Established

    Thanks for sharing this:)
     
  3. Thanks for sharing
     
Tags / Keywords: