Back

7. 3D Transformations On A 3D Object

#include <graphics.h>
#include <conio.h>
#include <iostream>
#include <cmath>

using namespace std;

struct Point3D {
    int x, y, z;
};

Point3D project(Point3D p, int d = 200) {
    // Simple perspective projection
    Point3D projected;
    projected.x = p.x * d / (d + p.z);
    projected.y = p.y * d / (d + p.z);
    projected.z = p.z;
    return projected;
}

void drawCube(Point3D points[]) {
    // Draw lines between points to form a cube
    for (int i = 0; i < 4; i++) {
        Point3D p1 = project(points[i]);
        Point3D p2 = project(points[(i + 1) % 4]);
        Point3D p3 = project(points[i + 4]);
        Point3D p4 = project(points[(i + 1) % 4 + 4]);

        line(p1.x, p1.y, p2.x, p2.y);
        line(p3.x, p3.y, p4.x, p4.y);
        line(p1.x, p1.y, p3.x, p3.y);
    }
}

void translate(Point3D points[], Point3D original[], int tx, int ty, int tz) {
    for (int i = 0; i < 8; i++) {
        points[i].x = original[i].x + tx;
        points[i].y = original[i].y + ty;
        points[i].z = original[i].z + tz;
    }
}

void scale(Point3D points[], Point3D original[], float sx, float sy, float sz) {
    for (int i = 0; i < 8; i++) {
        points[i].x = original[i].x * sx;
        points[i].y = original[i].y * sy;
        points[i].z = original[i].z * sz;
    }
}

void rotateX(Point3D points[], Point3D original[], float angle) {
    float rad = angle * M_PI / 180.0;
    for (int i = 0; i < 8; i++) {
        points[i].x = original[i].x;
        points[i].y = original[i].y * cos(rad) - original[i].z * sin(rad);
        points[i].z = original[i].y * sin(rad) + original[i].z * cos(rad);
    }
}

int main() {
    int gd = DETECT, gm;
    initgraph(&gd, &gm,NULL);

    // Define initial cube points
    Point3D originalCube[8] = {
        {50, 50, 50}, {150, 50, 50}, {150, 150, 50}, {50, 150, 50},
        {50, 50, -50}, {150, 50, -50}, {150, 150, -50}, {50, 150, -50}
    };

    Point3D transformedCube[8];

    // Draw initial cube
    copy(begin(originalCube), end(originalCube), begin(transformedCube));


    // Translate cube
    drawCube(transformedCube);
    setcolor(YELLOW);
    translate(transformedCube, originalCube, 50, 50, 0);
    drawCube(transformedCube);
    getch();
    cleardevice();

    // Scale cube
    drawCube(transformedCube);
    setcolor(GREEN);
    scale(transformedCube, originalCube, 1.5, 1.5, 1.5);
    drawCube(transformedCube);
    getch();
    cleardevice();

    // Rotate cube about X-axis
    drawCube(transformedCube);
    setcolor(CYAN);
    rotateX(transformedCube, originalCube, 45);
    drawCube(transformedCube);
    getch();
    cleardevice();

    
    closegraph();
    return 0;
}