Skip to main content

3D Projection

I hope you will remember engineering graphics in your first year of engineering, This basic idea will be useful in understanding the concept.  Usually projection is nothing but the representation of a 3D object in a 2D form with the angle we view. Basically we represent a 3D object in a 2D form with three basic views
  • Front View
  • Top View
  • Side View
In the following code, the user is asked to enter the co-ordinates for a 2D object and with the depth we enter it will generate a 3D object. For example , consider a cube - the view you see without a depth will be a square.

Note: In computer graphics the co-ordinates start from top-left (0,0) of your screen


CODE :

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

int ARRAY_SIZE;

int array_max(int *arr, int returnIndex);
int array_min(int *arr, int returnIndex);
void draw3d(int sides, int *x, int *y, int depth);
void drawFrontView(int sides, int *x, int *y);
void drawSideView(int sides, int *x, int *y, int depth);
void drawTopView(int sides,int *x,int *y, int depth);
void drawAxis(int *x, int *y, int depth);

int array_max(int *arr, int returnIndex){
  int i, max = arr[0], index=0;
  for(i=1;i<ARRAY_SIZE;i++){
      if(arr[i]>max)
      {
       max=arr[i];
       index=i;
      }
  }
  return returnIndex?index:max;
}

int array_min(int *arr, int returnIndex){
  int i, min = arr[0], index=0;
  for(i=1;i<ARRAY_SIZE;i++){
      if(arr[i]<min)
      {
  min=arr[i];
  index=i;
      }
  }
  return returnIndex?index:min;
}

void drawAxis(int *x, int *y, int depth){
  int maxy, minx;
  maxy = array_max(y,0);
  minx = array_min(x,0);

  setcolor(BLUE);
  //z-axis
  line(minx+depth, maxy-depth, -depth, getmaxy());
  //x-axis
  line(minx+depth, maxy-depth, getmaxx(), maxy-depth);
  //y-axis
  line(minx+depth, maxy-depth, minx+depth, 0);
  setlinestyle(0,1,2);
  setfillstyle(CLOSE_DOT_FILL, WHITE);
  floodfill(0,0,BLUE);
  setfillstyle(CLOSE_DOT_FILL, BROWN);
  floodfill(getmaxx(),0,BLUE);
  setfillstyle(CLOSE_DOT_FILL, DARKGRAY);
  floodfill(getmaxx(),getmaxy(),BLUE);
}

void draw3d(int sides,int *x,int *y,int depth)
{
  int i,j,k=0;
  setlinestyle(0,1,1);
  drawAxis(x, y, depth);
  setcolor(YELLOW);
  for(j=0;j<2;j++)
  {
    for(i=0;i<sides;i++)
    {
      if(i!=sides-1)
      line(x[i]+k,y[i]-k,x[i+1]+k,y[i+1]-k);
      else
      line(x[i]+k,y[i]-k,x[0]+k,y[0]-k);

      if(j==0)
      line(x[i],y[i],x[i]+depth,y[i]-depth);
    }
    k=depth;
  }
}

void drawFrontView(int sides,int *x,int *y)
{
    int i;
    setlinestyle(0,1,1);
    setcolor(LIGHTGREEN);
    for(i=0;i<sides;i++)
    {
       if(i!=sides-1)
       line(x[i],y[i],x[i+1],y[i+1]);
       else
       line(x[i],y[i],x[0],y[0]);
    }
}

void drawSideView(int sides,int *x,int *y, int depth)
{
    int i, maxyIndex, minyIndex, maxxIndex;
    maxxIndex=array_max(x,1);
    maxyIndex=array_max(y,1);
    minyIndex=array_min(y,1);

    setcolor(LIGHTGREEN);
    for(i=0;i<sides-1;i++)
    {
 if(y[i]<y[maxyIndex] && y[i]>y[minyIndex] && x[i]<x[maxxIndex])
 setlinestyle(3,1,1);
 else
 setlinestyle(0,1,1);

 line(x[0],y[i],x[0],y[i+1]);
 line(x[0]+depth*2,y[i],x[0]+depth*2,y[i+1]);
 line(x[0],y[i],x[0]+depth*2,y[i]);
 line(x[0],y[i+1],x[0]+depth*2,y[i+1]);
    }
}

void drawTopView(int sides, int *x, int *y, int depth)
{
    int i, minyIndex, maxxIndex, minxIndex;
    maxxIndex=array_max(x,1);
    minxIndex=array_min(x,1);
    minyIndex=array_min(y,1);
    setcolor(LIGHTGREEN);
    for(i=0;i<sides-1;i++)
    {
 if(x[i]<x[maxxIndex] && x[i]>x[minxIndex] && y[i]>y[minyIndex])
 setlinestyle(3,1,1);
 else
 setlinestyle(0,1,1);

 line(x[i],y[0],x[i+1],y[0]);
 line(x[i],y[0]+depth * 2,x[i+1],y[0]+depth*2);
 line(x[i],y[0],x[i],y[0]+depth*2);
 line(x[i+1],y[0],x[i+1],y[0]+depth*2);
    }
}

void main(){
int gd=0,gm;
int x[20],y[20],i,sides,depth,key;
initgraph(&gd,&gm,"");
printf("No of sides(front view only) : ");
scanf("%d",&sides);
printf("Co-ordinates : ");
for(i=0;i<sides;i++)
{
printf("(x%d,y%d)",i,i);
scanf("%d%d",&x[i],&y[i]);
}
printf("Depth :");
scanf("%d",&depth);
ARRAY_SIZE=sides;
while(1){
key=getche();
clrscr();
cleardevice();
printf("LEFT ARROW -> 3D View\nUP ARROW - > Front View\nDOWN ARROW -> Top View\nRIGHT ARROW -> Side View\nESC -> Exit");
switch(key){
 case 75: //left arrow
 draw3d(sides,x,y,depth);
 break;
 case 72: //up arrow
 drawFrontView(sides,x,y);
 break;
 case 77: //right arrow
 drawSideView(sides,x,y,depth);
 break;
 case 80: //down arrow
 drawTopView(sides,x,y,depth);
 break;
 case 27: //esc
 exit(0);
 break;
}
}
}


OUTPUT:










Popular posts from this blog

2D Reflection

#include <stdio.h> #include <stdlib.h> #include<graphics.h> #include<conio.h> #include<math.h> void draw2d(int,int [],int [],int,int); void main() { int gd=DETECT,gm; int x[20],y[20],x1[20],y1[20],tx=0,ty=0,i,fs; initgraph(&gd,&gm,""); printf("No of sides : "); scanf("%d",&fs); printf("Co-ordinates : "); for(i=0;i<fs;i++) { printf("(x%d,y%d)",i,i); scanf("%d%d",&x[i],&y[i]); } draw2d(fs,x,y,tx,ty); printf("translation (x,y) : "); scanf("%d%d",&tx,&ty); while(1) { clrscr(); cleardevice(); printf("1. X Reflection\n\n2. Y Reflection\n\n3. Exit"); draw2d(fs,x,y,0,0); switch(getche()) { case '1': for(i=0;i<fs;i++) { x1[i]=(tx+((x[i]-tx)*cos(M_PI))-((y[i]-ty)*sin(M_PI))); y1[i]=y[i]; } break; case '2': for(i=0;i<fs;i++) { x1[i]=x[i]; y1[i]=(tx+((y[i]-ty)*cos(M_PI))+((x[i]-tx)*sin(M_PI))); } break; case '3': close…

Simple Animation Using C

Here i have used fillpoly function to draw the object body and used fillellipse function to draw tier.
animation is done by looping through the objects x & y position until user hits a key. Keypress event is achived  by using kbhit function. Smoothness of animation is controlled by delay function.

Change the delay values to change the animation speed

Source:

#include<stdio.h> #include<conio.h> #include<graphics.h> #include<dos.h> void main() { int gd=DETECT,gm,i=-300,j; int poly[16]={100,100,250,100,250,50,300,50,325,90,325,140,100,140,100,100}; int tpoly[16]={100,100,250,100,250,50,300,50,325,90,325,140,100,140,100,100}; initgraph(&gd,&gm,""); getch(); while(!kbhit()) { for(j=0;j<16;j+=2) { poly[j]=tpoly[j]+i; } fillpoly(8,poly); setfillstyle(5,7); bar(275+i,60,295+i,85); setfillstyle(5,8); fillellipse(140+i,140,20,20); fillellipse(280+i,140,20,20); setfillstyle(1,0); fillellipse(140+i,140,10,10); fillellipse(280+i,140,10,10); setcolor(…

Personal Diary - A Mini Project Written in Turbo C With Graphical Interface

A Simple Personal Diary written in Turbo C with Graphical User Interface

Features,
Birthday ReminderNotesAddress Book The main part of the project is UI

'GUI.h' header file includes texbox, message-box and more custom graphical functions 
' Dairy.h' header file includes functionality of Personal Dairy
' Dairyload.c' includes loadingscreen, login screen, installation check etc
'Dairy.c' - execution stats here