Friday, October 2, 2020

3D Transformation Graphics Program in C

Aim

To write a C program to implement 3D transformations such as translation, rotation and scaling of objects.

Algorithm:

·        Translation

1.     Read the co-ordinates (x, y, z) of the object.

2.     Display the original object.

3.     Read the translation vector (tx, ty, tz).

4.     Calculate the new co-ordinates as follows:

x’ = x + tx

y’ = y + ty

z’ = z + tz

5.     Display the translated object on the screen.




·        Rotation

1.     Read the co-ordinates (x, y, z) of the object.

2.     Display the original object.

3.     Read the rotation angle Ɵ.

4.     For rotation about z-axis, calculate new co-ordinates as follows:

x’ = x * cos(Ɵ) – y * sin(Ɵ)

y’ = x * sin(Ɵ) + y * cos(Ɵ)

z’ = z

5.     Display the object after rotation about z-axis.

6.     For rotation about x-axis, calculate new co-ordinates as follows:

x’ = x

y’ = y * cos(Ɵ) – z * sin(Ɵ)

z’ = y * sin(Ɵ) + z * cos(Ɵ)

7.     Display the object after rotation about x-axis.

8.     For rotation about y-axis, calculate new co-ordinates as follows:

x’ = z * sin(Ɵ) + x * cos(Ɵ)

y’ = y

z’ = z * cos(Ɵ) – x * sin(Ɵ)

9.     Display the object after rotation about y-axis.

10.  Stop






·        Scaling

1.     Read the co-ordinates (x, y, z) of the object.

2.     Display the original object.

3.     Read the scaling factors (sx, sy, sz).

4.     Calculate the new co-ordinates as follows:

x’ = x * sx

y’ = y * sy

z’ = z * sz

5.     Display the scaled object on the screen.





Program Code

#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <math.h>

int maxx, maxy, midx, midy;

void drawAxis()
{
    setcolor(CYAN);
    line(midx, 0, midx, maxy);
    line(0, midy, maxx, midy);
    setcolor(WHITE);
}

void main()
{
    int gd = DETECT, gm, choice;
    int tx, ty, sx, sy, sz, ang, r, x1, x2, y1, y2;
    initgraph(&gd, &gm, "C:\\TURBOC3\\BGI");
    setfillstyle(3, 25);
    maxx = getmaxx();
    maxy = getmaxy();
    midx = maxx / 2;
    midy = maxy / 2;
    do
    {
        outtextxy(20, 150, "ORIGINAL OBJECT");
        drawAxis();
        bar3d(midx + 100, midy - 20, midx + 60, midy - 90, 20, 1);
        printf("1. Translation\n2. Rotation\n3. Scaling\n4. Exit");
        printf("\nEnter your choice: ");
        scanf("%d", &choice);

        switch (choice)
        {
        case 1:
            printf("\nEnter the Translation vector (tx, ty): ");
            scanf("%d%d", &tx, &ty);
            cleardevice();
            outtextxy(100, 50, "TRANSLATION");
            drawAxis();
            bar3d(midx + 100, midy - 20, midx + 60, midy - 90, 20, 1);
            setcolor(GREEN);
            bar3d(midx + (tx+100), midy - (ty+20), midx + (tx+60), midy - (ty+90), 20, 1);
            getch();
            break;
        case 2:
            printf("\nEnter the Rotation angle: ");
            scanf("%d", &ang);
            r = ang * 3.14 / 180;
            x1 = 100 * cos(r) - 20 * sin(r);
            y1 = 100 * sin(r) + 20 * sin(r);
            x2 = 60 * cos(r) - 90 * sin(r);
            y2 = 60 * sin(r) + 90 * sin(r);
            cleardevice();
            drawAxis();
            outtextxy(50, 50, "Rotation about Z axis");
            bar3d(midx + 100, midy - 20, midx + 60, midy - 90, 20, 1);
            setcolor(GREEN);
            bar3d(midx + x1, midy - y1, midx + x2, midy - y2, 20, 1);
            getch();
            cleardevice();
            drawAxis();
            outtextxy(50, 50, "Rotation about X axis");
            bar3d(midx + 100, midy - 20, midx + 60, midy - 90, 20, 1);
            setcolor(GREEN);
            bar3d(midx + 100, midy - x1, midx + 60, midy - x2, 20, 1);
            getch();
            cleardevice();
            drawAxis();
            outtextxy(50, 50, "Rotation about Y axis");
            bar3d(midx + 100, midy - 20, midx + 60, midy - 90, 20, 1);
            setcolor(GREEN);
            bar3d(midx + x1, midy - 20, midx + x2, midy - 90, 20, 1);
            getch();
            break;
        case 3:
            printf("\nEnter the Scaling Factor (sx, sy, sz): ");
            scanf("%d %d %d", &sx, &sy, &sz);
            cleardevice();
            outtextxy(100, 50, "SCALING");
            drawAxis();
            bar3d(midx + 100, midy - 20, midx + 60, midy - 90, 20, 1);
            setcolor(GREEN);
            bar3d(midx+(sx*100), midy-(sy*20), midx+(sx*60), midy-(sy*90), 20*sz, 1);
            getch();
            break;
        default:
            break;
        }

        clrscr();
        cleardevice();
        setcolor(WHITE);

    } while (choice != 4);

    closegraph();
}

Cohen Sutherland Line Clipping Algorithm in C

Aim

To write a C graphics program to implement Cohen Sutherland line clipping algorithm.

Algorithm

      1. Read 2 end points of line as p1(x1, y1) and p2(x2, y2).

    2.  Read 2 corner points of the clipping window (left-top and right-bottom) as (wx1, wy1) and (wx2, wy2).

      3.     Assign the region codes for 2 endpoints p1 and p2 using following steps:

·        Initialize code with 0000

·        Set bit 1 if x<wx1

·        Set bit 2 if x>wx2

·        Set bit 3 if y<wy2

·        Set bit 4 if y>wy1

     4.     Check for visibility of line

a. If region codes for both endpoints are zero then line is completely visible. Draw the line go to step 9.

b.   If region codes for endpoints are not zero and logical ANDing of them is also nonzero then line is invisible. Discard the line and move to step 9.

c.   If it does not satisfy 4.a and 4.b then line is partially visible.

     5.     Determine the intersecting edge of clipping window as follows:

·      If region codes for both endpoints are nonzero find intersection points p1’ and p2’ with boundary edges.

·    If region codes for any one end point is non zero then find intersection point p1’ or p2’.

     6.     Divide the line segments considering intersection points.

     7.     Reject line segment if any end point of line appears outside of any boundary.

     8.     Draw the clipped line segment.

9.   Stop.

Program Code

#include <stdio.h>
#include <conio.h>
#include <graphics.h>

typedef struct coordinate
{
    int x, y;
    char code[4];
} PT;

void drawwindow();
void drawline(PT p1, PT p2);
PT setcode(PT p);
int visibility(PT p1, PT p2);
PT resetendpt(PT p1, PT p2);

void main()
{
    int gd = DETECT, v, gm;
    PT p1, p2, p3, p4, ptemp;
    clrscr();

    printf("\nEnter x1 and y1: ");
    scanf("%d %d", &p1.x, &p1.y);
    printf("\nEnter x2 and y2: ");
    scanf("%d %d", &p2.x, &p2.y);

    initgraph(&gd, &gm, "c:\\turboc3\\bgi");
    outtextxy(50, 50, "Before Clipping");
    drawwindow();
    drawline(p1, p2);
    getch();
    cleardevice();
    p1 = setcode(p1);
    p2 = setcode(p2);
    v = visibility(p1, p2);
    outtextxy(50, 50, "After Clipping");

    switch (v)
    {
    case 0:
        drawwindow();
        drawline(p1, p2);
        break;
    case 1:
        drawwindow();
        break;
    case 2:
        p3 = resetendpt(p1, p2);
        p4 = resetendpt(p2, p1);
        drawwindow();
        drawline(p3, p4);
        break;
    }

    getch();
    closegraph();
}

void drawwindow()
{
    line(150, 100, 450, 100);
    line(450, 100, 450, 350);
    line(450, 350, 150, 350);
    line(150, 350, 150, 100);
}

void drawline(PT p1, PT p2)
{
    line(p1.x, p1.y, p2.x, p2.y);
}

PT setcode(PT p)
{
    PT ptemp;

    if (p.y < 100)
        ptemp.code[0] = '1';
    else
        ptemp.code[0] = '0';

    if (p.y > 350)
        ptemp.code[1] = '1';
    else
        ptemp.code[1] = '0';

    if (p.x > 450)
        ptemp.code[2] = '1';
    else
        ptemp.code[2] = '0';

    if (p.x < 150)
        ptemp.code[3] = '1';
    else
        ptemp.code[3] = '0';

    ptemp.x = p.x;
    ptemp.y = p.y;

    return (ptemp);
}

int visibility(PT p1, PT p2)
{
    int i, flag = 0;

    for (i = 0; i < 4; i++)
    {
        if ((p1.code[i] != '0') || (p2.code[i] != '0'))
            flag = 1;
    }

    if (flag == 0)
        return (0);

    for (i = 0; i < 4; i++)
    {
        if ((p1.code[i] == p2.code[i]) && (p1.code[i] == '1'))
            flag = '0';
    }

    if (flag == 0)
        return (1);

    return (2);
}

PT resetendpt(PT p1, PT p2)
{
    PT temp;
    int x, y, i;
    float m, k;

    if (p1.code[3] == '1')
        x = 150;

    if (p1.code[2] == '1')
        x = 450;

    if ((p1.code[3] == '1') || (p1.code[2] == '1'))
    {
        m = (float)(p2.y - p1.y) / (p2.x - p1.x);
        k = (p1.y + (m * (x - p1.x)));
        temp.y = k;
        temp.x = x;

        for (i = 0; i < 4; i++)
            temp.code[i] = p1.code[i];

        if (temp.y <= 350 && temp.y >= 100)
            return (temp);
    }

    if (p1.code[0] == '1')
        y = 100;

    if (p1.code[1] == '1')
        y = 350;

    if ((p1.code[0] == '1') || (p1.code[1] == '1'))
    {
        m = (float)(p2.y - p1.y) / (p2.x - p1.x);
        k = (float)p1.x + (float)(y - p1.y) / m;
        temp.x = k;
        temp.y = y;

        for (i = 0; i < 4; i++)
            temp.code[i] = p1.code[i];

        return (temp);
    }
    else
        return (p1);
}

Output




Saturday, September 26, 2020

RSA Algorithm Implementation in C

Aim

To write a C program to implement RSA (Rivest–Shamir–Adleman) asymmetric cryptographic algorithm.

Algorithm

  1. Select two large prime numbers p and q.
  2. Compute n = p * q.
  3. Choose system modulus phi(n) = (p - 1) * (q - 1).
  4. Decrypt by computing d = e-1 mod phi(n).
  5. Encryption: c = me mod n.
  6. Decryption: m = cd mod n.

Program Code

#include <stdio.h>

int gcd(int a, int b)
{
    int temp;
    while (b != 0)
    {
        temp = a;
        a = b;
        b = temp % b;
    }
    return a;
}

int power(int a, int n, int m)
{
    int res = 1;
    while (n != 0)
    {
        if (n % 2 == 1)
            res = (res * a) % m;
        a = (a * a) % m;
        n /= 2;
    }
    return res;
}

int main()
{
    int p, q, n, phi, e, d, msg, enc, dec;

    printf("Enter two non-equal prime numbers: ");
    scanf("%d %d", &p, &q);

    n = p * q;
    e = 2;
    phi = (p - 1) * (q - 1);
    while (e < phi)
    {
        if (gcd(e, phi) == 1)
            break;
        else
            e++;
    }
    int k = 2;
    d = (1 + k*phi) / e;

    printf("Enter numeric message data: ");
    scanf("%d", &msg);
    enc = power(msg, e, n);
    dec = power(enc, d, n);

    printf("\np = %d, q = %d", p, q);
    printf("\nn = %d", n);
    printf("\nPhi(n) = %d", phi);
    printf("\nPublic key, PU = {%d, %d}", e, n);
    printf("\nPrivate key, PR = {%d, %d}", d, n);
    printf("\nMessage data = %d", msg);
    printf("\nEncrypted data = %d", enc);
    printf("\nDecrypted data = %d", dec);

    return 0;
}

Output





Wednesday, September 23, 2020

C Program to implement 2D Composite Transformation

Aim

To write a C program to implement 2D composite transformations such as consecutive translation, consecutive rotation, pivot point rotation and consecutive scaling.

Algorithm

Consecutive Translation

  1. Input the co-ordinates of the object.
  2. Draw the object on the screen.
  3. Input the 1st and 2nd translation co-ordinates.
  4. For each translation, add the translation co-ordinates to the object co-ordinates.
  5. Draw the translated object on the screen.


Consecutive Rotation

  1. Input the co-ordinates of the object.
  2. Draw the object on the screen.
  3. Input the 1st and 2nd rotation angles.
  4. For each rotation, calculate r = (Ɵ * 3.14) / 180.
  5. Calculate xn = xi * cos(r) - yi * sin(r).
  6. Calculate yn = yi * cos(r) + xi * sin(r).
  7. Draw the rotated object on the screen.


Pivot Point Rotation

  1. Input the co-ordinates of the object.
  2. Draw the object on the screen.
  3. Input the pivot point co-ordinates.
  4. Input the rotation angle.
  5. Translate the object to the pivot point co-ordinates.
  6. Rotate the object with the given angle.
  7. Translate the rotated object back to the original co-ordinates.


Consecutive Scaling

  1. Input the co-ordinates of the object.
  2. Draw the object on the screen.
  3. Input the scaling factors.
  4. For each scaling transformation, multiply the object co-ordinates by the scaling factors.
  5. Draw the scaled object on the screen.



Program Code

#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <math.h>

void drawTri(int x[], int y[])
{
    int i;
    for (i = 0; i < 3; i++)
    {
        if (i == 2)
            line(x[i], y[i], x[0], y[0]);
        else
            line(x[i], y[i], x[i+1], y[i+1]);
    }
}

void main()
{
    int gd = DETECT, gm;
    int choice, x[3], y[3], i, j, n;
    int tx1, tx2, ty1, ty2, theta1, theta2, px, py, sx[10], sy[10];
    float tx, ty, r;
    clrscr();
    initgraph(&gd, &gm, "C:\\TURBOC3\\BGI");

    do
    {
        printf("1. Consecutive Translation\n2. Consecutive Rotation\n3. Pivot Point Rotation\n4. Consecutive Scaling\n5. Exit");
        printf("\nEnter your choice: ");
        scanf("%d", &choice);

        if (choice != 5)
        {
            printf("\nEnter the co-ordinates of Triangle...\n");
            for (i = 0; i < 3; i++)
            {
                printf("(x%d, y%d): ", i+1, i+1);
                scanf("%d %d", &x[i], &y[i]);
            }
        }

        switch (choice)
        {
        case 1:
            printf("\nEnter the 1st translation (tx1, ty1): ");
            scanf("%d %d", &tx1, &ty1);
            printf("\nEnter the 2nd translation (tx2, ty2): ");
            scanf("%d %d", &tx2, &ty2);
            cleardevice();
            drawTri(x, y);
            for (i = 0; i < 3; i++)
            {
                x[i] += tx1;
                y[i] += ty1;
            }
            setcolor(3);
            drawTri(x, y);
            for (i = 0; i < 3; i++)
            {
                x[i] += tx2;
                y[i] += ty2;
            }
            setcolor(GREEN);
            drawTri(x, y);
            getch();
            break;
        case 2:
            printf("\nEnter the 1st rotation angle: ");
            scanf("%d", &theta1);
            printf("Enter the 2nd rotation angle: ");
            scanf("%d", &theta2);
            cleardevice();
            drawTri(x, y);
            r = M_PI * theta1 / 180;
            for (i = 0; i < 3; i++)
            {
                tx = x[i];
                ty = y[i];
                x[i] = tx * cos(r) - ty * sin(r);
                y[i] = tx * sin(r) + ty * cos(r);
            }
            setcolor(3);
            drawTri(x, y);
            r = M_PI * theta2 / 180;
            for (i = 0; i < 3; i++)
            {
                tx = x[i];
                ty = y[i];
                x[i] = tx * cos(r) - ty * sin(r);
                y[i] = tx * sin(r) + ty * cos(r);
            }
            setcolor(GREEN);
            drawTri(x, y);
            getch();
            break;
        case 3:
            printf("\nEnter the pivot point (px, py): ");
            scanf("%d %d", &px, &py);
            printf("Enter the rotation angle: ");
            scanf("%d", &theta1);
            cleardevice();
            drawTri(x, y);
            for (i = 0; i < 3; i++)
            {
                x[i] = x[i] + px;
                y[i] = y[i] + py;
            }
            setcolor(3);
            drawTri(x, y);
            r = M_PI * theta1 / 180;
            for (i = 0; i < 3; i++)
            {
                tx = x[i];
                ty = y[i];
                x[i] = tx * cos(r) - ty * sin(r);
                y[i] = tx * sin(r) + ty * cos(r);
            }
            setcolor(BLUE);
            drawTri(x, y);
            for (i = 0; i < 3; i++)
            {
                x[i] = x[i] - px;
                y[i] = y[i] - py;
            }
            setcolor(GREEN);
            drawTri(x, y);
            getch();
            break;
        case 4:
            printf("\nEnter the number of scaling transformations: ");
            scanf("%d", &n);
            for (i = 0; i < n; i++)
            {
                printf("Enter the scaling unit (sx%d, sy%d): ", i+1, i+1);
                scanf("%d %d", &sx[i], &sy[i]);
            }
            cleardevice();
            drawTri(x, y);
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < 3; j++)
                {
                    x[j] = x[j] * sx[i];
                    y[j] = y[j] * sy[i];
                }
                setcolor(i + 1);
                drawTri(x, y);
            }
            getch();
            break;
        default:
            break;
        }

        clrscr();
        cleardevice();
        setcolor(WHITE);

    } while (choice != 5);
    closegraph();
}

3D Transformation Graphics Program in C

Aim To write a C program to implement 3D transformations such as translation, rotation and scaling of objects. Algorithm: ·         Tr...