Showing posts with label graphics. Show all posts
Showing posts with label graphics. Show all posts

Saturday, June 2, 2012

CODE FOR DRAWING A 3d CUBE IN GRAPHICS WITH C++ BUILDER


in drawing a 2d object ,it is easy and can be done simply by joining lines.However 3d drawing is not as easy as 2d.we must be aware of projection in this case .At  first 3d object's coordinate should be given and this coordinate is projected in to 2d ,Thus we see a 3d view in a 2d plane.


HERE IS THE SOURCE CODE FOR DRAWING 3D CUBE

/////  This code is for initializing structure//////

struct point
{
int x;
int y;
int z;
};

struct point1
{
float x;
float y;
float z;
}

////  rotation of the 3d point////
point yrotate(point p1,int theta)
{
point p3; float angle;
angle=M_PI*theta/180;
p3.x=p1.x*cos(angle)+p1.z*sin(angle);
p3.y=p1.y;
p3.z=-p1.x*sin(angle)+p1.z*cos(angle);
return(p3);
}


///projectiion of 3d to 2d////
 point projection(float x_angle,float y_angle,float z_angle,point p1)
{
    float x1,y1;
    float horz_scale=0.4;
 float vert_scale=0.4;


 x_angle=M_PI*(x_angle)/180;
 y_angle=M_PI*(y_angle)/180;
 z_angle=M_PI*(z_angle)/180;

 x1=p1.x*cos(x_angle)+p1.y*cos(y_angle)+p1.z*cos(z_angle);
 y1=p1.x*sin(x_angle)+p1.y*sin(y_angle)+p1.z*sin(z_angle);

   p1.x=x1*horz_scale;
   p1.y=y1*vert_scale;
   return(p1);
   }



////// here you can form button of any name and include the following code inside it.Here i have formed  a button name drawClick ,You can give any name and include it/////

void __fastcall TForm1::drawClick(TObject *Sender)
{
point p1,p2,p3,p4,p5,p6,p7,p8,p;
float i1[700],i2[700],intensity;float color;
int deno;
p1.x=200;//{200;200;500};
p1.y=200;
p1.z=500;
p2.x=200;//{200,200,200};
p2.y=200;
p2.z=200;
p3.x=200;//{200,500+100,200};
p3.y=600;
p3.z=200;
p4.x=200;//{200,500+100,500};
p4.y=600;
p4.z=500;

p6.x=500+100;//{500+100,200,500};
p6.y=200;
p6.z=500;
p5.x=500+100;//{500+100,500+100,500};
p5.y=620;
p5.z=500;
p7.x=500+100;//{500+100,200,200};
p7.y=500;
p7.z=200;

p8.x=600;
p8.y= 200;
p8.z= 200;


//assigning intensity levels
i1[0]=1;i2[0]=.5;
i1[p4.y-p1.y]=.2;i2[p3.y-p2.y]=0.2;
for(int i=0;i<=p4.y-p1.y-1;i++)
{
i1[i+1]=i1[i]-(i1[0]-i1[p4.y-p1.y])/(p4.y-p1.y);
i2[i+1]=i2[i]-(i2[0]-i2[p3.y-p2.y])/(p3.y-p2.y);
//ListBox1->Items->Add(i2[i]);
}

for(int i=0;i<=p4.y-p1.y;i++)
{
for(int j=p1.z;j>=p2.z;j--)
{
deno=p2.z-p1.z;
intensity=(j-p2.z)*i1[i]/deno+((p1.z-j)*i2[i])/deno;
color=intensity*255;
//ListBox1->Items->Add(color);

color=abs(color);
if(color>=255)color=100;
if(color<=40)color=004;
p.x=p1.x;p.y=i+p1.y;p.z=j;
p=projection(0,90,45,p);
Canvas->Pixels[p.x][p.y]=RGB(200,color,color);
//Form1->Caption=i;
}
}

//front face

i1[0]=1;i2[0]=.5;
i1[p4.y-p1.y]=.2;i2[p5.y-p6.y]=0.2;
for(int i=0;i<=p4.y-p1.y-1;i++)
{
i1[i+1]=i1[i]-(i1[0]-i1[p4.y-p1.y])/(p4.y-p1.y);
i2[i+1]=i2[i]-(i2[0]-i2[p5.y-p6.y])/(p5.y-p6.y);
//ListBox1->Items->Add(i2[i]);
}

for(int i=0;i<=p4.y-p1.y;i++)
{
for(int j=p1.x;j<=p6.x;j++)
{
deno=p6.x-p1.x;
intensity=(j-p1.x)*i2[i]/deno+((p6.x-j)*i1[i])/deno;
color=intensity*255;
//ListBox1->Items->Add(color);

color=abs(color);
if(color>=255)color=100;
if(color<=40)color=004;
p.x=j;p.y=i+p1.y;p.z=p1.z;
p=projection(0,90,45,p);
Canvas->Pixels[p.x][p.y]=RGB(200,color,color);
//Form1->Caption=i;
}



}




//top face

i1[0]=1;i2[0]=.5;//i1[0] at p1 and i2[0] at p6
i1[p1.z-p2.z]=.2;i2[p6.z-p7.z]=0.2;
for(int i=0;i<=p1.z-p2.z-1;i++)
{
i1[i+1]=i1[i]-(i1[0]-i1[p1.z-p2.z])/(p1.z-p2.z);
i2[i+1]=i2[i]-(i2[0]-i2[p6.z-p7.z])/(p6.z-p7.z);
//ListBox1->Items->Add(i2[i]);
}

for(int i=0;i<=p1.z-p2.z;i++)
{
for(int j=p1.x;j<=p6.x;j++)
{
deno=p6.x-p1.x;
intensity=(j-p1.x)*i2[i]/deno+((p6.x-j)*i1[i])/deno;
color=intensity*255;
//ListBox1->Items->Add(color);

color=abs(color);
if(color>=255)color=100;
if(color<=40)color=004;
p.x=j;p.y=p1.y;p.z=-i+p1.z;
p=projection(0,90,45,p);
Canvas->Pixels[p.x][p.y]=RGB(200,color,color);
}
}
}

BACK FACE DETECTION CODE IN GRAPHICS IN C++ BUILDER IDE


#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include "math.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 int ang;

struct point
{
int x;
int y;
int z;
};


point yrotate(point p1,int theta)
{
point p3; float angle;
angle=M_PI*theta/180;
p3.x=p1.x*cos(angle)+p1.z*sin(angle);
p3.y=p1.y;
p3.z=-p1.x*sin(angle)+p1.z*cos(angle);
return(p3);
}

 point projection(float x_angle,float y_angle,float z_angle,point p1)
{
    float x1,y1;
    float horz_scale=0.4;
 float vert_scale=0.4;


 x_angle=M_PI*(x_angle)/180;
 y_angle=M_PI*(y_angle)/180;
 z_angle=M_PI*(z_angle)/180;

 x1=p1.x*cos(x_angle)+p1.y*cos(y_angle)+p1.z*cos(z_angle);
 y1=p1.x*sin(x_angle)+p1.y*sin(y_angle)+p1.z*sin(z_angle);

   p1.x=x1*horz_scale;
   p1.y=y1*vert_scale;
   return(p1);
   }

 void bhm(int x1,int y1,int x2,int y2,int col)
{
int dx,dy,p,kx,ky;
dx=abs(x1-x2);
dy=abs(y1-y2);


    p=2*dy-dx;
    Form1->Canvas->Pixels[x1][y1]=col;

        //DRAWING VERTICAL LINES
        if(dx==0)
        {
        //TO DETERMINE THE +VE OR -VE SLOPE
         ky=dy/(y2-y1);
            for(int i=0;i<=dy;i++)
            {
              Form1->Canvas->Pixels[x1][y1]=col;
            y1=y1+ky;
            }
        return;
        }

        //DRAWING HORIZONTAL LINES
        if(dy==0)
         {
        //TO DETERMINE THE +VE OR -VE SLOPE
         kx=dx/(x2-x1);
            for(int i=0;i<=dx;i++)
            {
              Form1->Canvas->Pixels[x1][y1]=col;
            x1=x1+kx;
            }
         return;
        }

        //BRESENHAM ALGORITHM FOR LINE DRAWING FOR m<1
        if(dx>dy)
        {
        //TO DETERMINE THE +VE OR -VE SLOPE
        kx=dx/(x2-x1);
        ky=dy/(y2-y1);
        for(int i=0;i<=dx;i++)
        {
        x1=x1+kx;
            if(p<0)p=p+2*dy;
            else
            {
            y1=y1+ky;
            p=p+2*dy-2*dx;
            }
          Form1->Canvas->Pixels[x1][y1]=col;
        }
        return;
        }


         //BRESENHAM ALGORITHM FOR LINE DRAWING FOR m>1
        if(dx<dy)
       {
       p=2*dx-dy;

       //TO DETERMINE THE +VE OR -VE SLOPE
        kx=dx/(x2-x1);
        ky=dy/(y2-y1);
        for(int i=0;i<=dy;i++)
        {
        y1=y1+ky;
            if(p<0)p=p+2*dx;
            else
            {
            x1=x1+kx;
            p=p-2*dy+2*dx;
            }
          Form1->Canvas->Pixels[x1][y1]=col;
        }
        }

        if(dx==dy)
        {
            for(int i=0;i<=dy;i++)
            {
            //TO DETERMINE THE +VE OR -VE SLOPE
            kx=dx/(x2-x1);
            ky=dy/(y2-y1);
            y1=y1+ky;
            x1=x1+kx;
              Form1->Canvas->Pixels[x1][y1]=col;
            }
        return;
        }
    }
void __fastcall TForm1::zbufferClick(TObject *Sender)
{
Form1->Refresh();
ang+=10;
point p1,p2,p3,p4,p5,p6,p7,p8;
float ak1,ak2,ai1,ai2,aj1,aj2,bk1,bk2,bi1,bi2,bj1,bj2,ck1,ck2,ci1,ci2,cj1,cj2,dk1,dk2,di1,di2,dj1,dj2;
int diffx,diffy,x1,x2,x3,y1,y2,y3,z1,z2,z3;float checkx,checky,checkz;
p1.x=200;//{200;200;500};
p1.y=200;
p1.z=500;
p2.x=200;//{200,200,200};
p2.y=200;
p2.z=200;
p3.x=500;//{500,200,500};
p3.y=200;
p3.z=500;
p4.x=500;//{500,500,500};
p4.y=500;
p4.z=500;
p5.x=500;//{500,200,200};
p5.y=200;
p5.z=200;
p6.x=500;//{500,500,200};
p6.y=500;
p6.z=200;
p7.x=200;//{200,500,200};
p7.y=500;
p7.z=200;
p8.x=200;//{200,500,500};
p8.y=500;
p8.z=500;
p1=yrotate(p1,ang);
p2=yrotate(p2,ang);
p3=yrotate(p3,ang);
p4=yrotate(p4,ang);
p5=yrotate(p5,ang);
p6=yrotate(p6,ang);
p7=yrotate(p7,ang);
p8=yrotate(p8,ang);

p1=projection(0,90,20,p1);//oblique projection
p2=projection(0,90,20,p2);
p3=projection(0,90,20,p3);
p4=projection(0,90,20,p4);
p5=projection(0,90,20,p5);
p6=projection(0,90,20,p6);
p7=projection(0,90,20,p7);
p8=projection(0,90,20,p8);

diffx=p1.x-200;//translation for rotation about fixed point
diffy=p1.y-200;
p1.x=200;p1.y=200;
p2.x=p2.x-diffx;p2.y=p2.y-diffy;
p3.x=p3.x-diffx;p3.y=p3.y-diffy;
p4.x=p4.x-diffx;p4.y=p4.y-diffy;
p5.x=p5.x-diffx;p5.y=p5.y-diffy;
p6.x=p6.x-diffx;p6.y=p6.y-diffy;
p7.x=p7.x-diffx;p7.y=p7.y-diffy;
p8.x=p8.x-diffx;p8.y=p8.y-diffy;


x1=p1.x;y1=p1.y;z1=p1.z;
x2=p3.x;y2=p3.y;z2=p3.z;
x3=p4.x;y3=p4.y;z3=p4.z;

ak1=(float)y1*(z2-z3)+y2*(z3-z1)+y3*(z1-z2);
bk1=(float)z1*(x2-x3)+z2*(x3-x1)+z3*(x1-x2);
ck1=(float)x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2);
dk1=(float)-x1*(y2*z3-y3*z2)-x2*(y3*z1-y1*z3)-x3*(y1*z2-y2*z1);

x1=p6.x;y1=p6.y;z1=p6.z;
x2=p7.x;y2=p7.y;z2=p7.z;
x3=p2.x;y3=p2.y;z3=p2.z;


ak2=(float)y1*(z2-z3)+y2*(z3-z1)+y3*(z1-z2);
bk2=(float)z1*(x2-x3)+z2*(x3-x1)+z3*(x1-x2);
ck2=(float)x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2);
dk2=(float)-x1*(y2*z3-y3*z2)-x2*(y3*z1-y1*z3)-x3*(y1*z2-y2*z1);

x1=p1.x;y1=p1.y;z1=p1.z;
x2=p3.x;y2=p3.y;z2=p3.z;
x3=p5.x;y3=p5.y;z3=p5.z;


aj1=(float)y1*(z2-z3)+y2*(z3-z1)+y3*(z1-z2);
bj1=(float)z1*(x2-x3)+z2*(x3-x1)+z3*(x1-x2);
cj1=(float)x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2);
dj1=(float)-x1*(y2*z3-y3*z2)-x2*(y3*z1-y1*z3)-x3*(y1*z2-y2*z1);

x1=p8.x;y1=p8.y;z1=p8.z;
x2=p4.x;y2=p4.y;z2=p4.z;
x3=p6.x;y3=p6.y;z3=p6.z;

aj2=(float)y1*(z2-z3)+y2*(z3-z1)+y3*(z1-z2);
bj2=(float)z1*(x2-x3)+z2*(x3-x1)+z3*(x1-x2);
cj2=(float)x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2);
dj2=(float)-x1*(y2*z3-y3*z2)-x2*(y3*z1-y1*z3)-x3*(y1*z2-y2*z1);

x1=p3.x;y1=p3.y;z1=p3.z;
x2=p5.x;y2=p5.y;z2=p5.z;
x3=p6.x;y3=p6.y;z3=p6.z;

ai1=(float)y1*(z2-z3)+y2*(z3-z1)+y3*(z1-z2);
bi1=(float)z1*(x2-x3)+z2*(x3-x1)+z3*(x1-x2);
ci1=(float)x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2);
di1=(float)-x1*(y2*z3-y3*z2)-x2*(y3*z1-y1*z3)-x3*(y1*z2-y2*z1);

x1=p7.x;y1=p7.y;z1=p7.z;
x2=p8.x;y2=p8.y;z2=p8.z;
x3=p1.x;y1=p1.y;z1=p1.z;

ai2=(float)y1*(z2-z3)+y2*(z3-z1)+y3*(z1-z2);
bi2=(float)z1*(x2-x3)+z2*(x3-x1)+z3*(x1-x2);
ci2=(float)x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2);
di2=(float)-x1*(y2*z3-y3*z2)-x2*(y3*z1-y1*z3)-x3*(y1*z2-y2*z1);

if(ai1==0)ai1=0.00000001;
if(ai2==0)ai2=0.00000001;
if(ck2==0)ck2=0.00000001;
if(ck1==0)ck1=0.00000001;

checkz=((ak2/ck2)-(ak1/ck1))*200+((bk2/ck2)-(bk1/ck1))*200-(dk1/ck1)+(dk2/ck2);
checky=((aj2/bj2)-(aj1/bj1))*200+((cj2/bj2)-(cj1/bj1))*200-(dj1/bj1)+(dj2/bj2);
checkx=((ci2/ai2)-(ci1/ai1))*200+((bi2/ai2)-(bi1/ai1))*200-(di1/ai1)+(di2/ai2);
//Form1->Caption=checkx;

if(checkz>0)
{

bhm(p1.x,p1.y,p3.x,p3.y,clBlue);
bhm(p3.x,p3.y,p4.x,p4.y,clBlue);
bhm(p4.x,p4.y,p8.x,p8.y,clBlue);
bhm(p8.x,p8.y,p1.x,p1.y,clBlue);

 int diffi=p8.y-p1.y;

for(int i=0;i<=diffi;i++)

{
bhm(p1.x,p1.y+i,p3.x,p3.y+i,clGreen);
}


}

if(checkx<0&&(int)checkx!=-1461&& (int)checkx!=-635&&(int)checkx!=-352&&(int)checkx!=-217)
{


bhm(p3.x,p3.y,p5.x,p5.y,clBlue);
bhm(p5.x,p5.y,p6.x,p6.y,clBlue);
bhm(p6.x,p6.y,p4.x,p4.y,clBlue);
bhm(p4.x,p4.y,p3.x,p3.y,clBlue);
 int diffi=p4.y-p3.y;
for(int i=0;i<=diffi;i++)
{
bhm(p3.x,p3.y+i,p5.x,p5.y+i,clBlue);
}


}
if(checky>0)
{
bhm(p8.x,p8.y,p4.x,p4.y,clBlue);
bhm(p4.x,p4.y,p6.x,p6.y,clBlue);
bhm(p6.x,p6.y,p7.x,p7.y,clBlue);
bhm(p7.x,p7.y,p8.x,p8.y,clBlue);




 int diffi=p8.x-p7.x;
for(int i=0;i<=20;i++)
{
bhm(p8.x-i,p8.y,p1.x-i,p1.y,clRed);
}
}

if(checkz<0)
{
bhm(p6.x,p6.y,p7.x,p7.y,clBlue);
bhm(p7.x,p7.y,p2.x,p2.y,clBlue);
bhm(p2.x,p2.y,p5.x,p5.y,clBlue);
bhm(p5.x,p5.y,p6.x,p6.y,clBlue);
  int diffi=p6.y-p5.y;

for(int i=0;i<=diffi;i++)

{
bhm(p5.x,p5.y+i,p2.x,p2.y+i,clGreen);
}

}

if(checkx>0&&checkx!=426971993473024&&checkx!=428400002990080&& (int)checkx!=764&&(int)checkx!=405&&(int)checkx!=273&&(int)checkx!=199)
{
bhm(p7.x,p7.y,p8.x,p8.y,clBlue);
bhm(p8.x,p8.y,p1.x,p1.y,clBlue);
bhm(p1.x,p1.y,p2.x,p2.y,clBlue);
bhm(p2.x,p2.y,p7.x,p7.y,clBlue);
int diffi=p7.y-p2.y;

for(int i=0;i<=diffi;i++)

{
bhm(p2.x,p2.y+i,p1.x,p1.y+i,clBlue);
}

}


if(checkx==426971993473024||checkx==428400002990080|| (int)checkx==764||(int)checkx==405||(int)checkx==273||(int)checkx==199)
 {
    bhm(p3.x,p3.y,p5.x,p5.y,clBlue);
bhm(p5.x,p5.y,p6.x,p6.y,clBlue);
bhm(p6.x,p6.y,p4.x,p4.y,clBlue);
bhm(p4.x,p4.y,p3.x,p3.y,clBlue);
 int diffi=p4.y-p3.y;
for(int i=0;i<=diffi;i++)
{
bhm(p3.x,p3.y+i,p5.x,p5.y+i,clBlue);
}

 }
 if((int)checkx==-1461|| (int)checkx==-635||(int)checkx==-352||(int)checkx==-217)

  {
    bhm(p7.x,p7.y,p8.x,p8.y,clBlue);
bhm(p8.x,p8.y,p1.x,p1.y,clBlue);
bhm(p1.x,p1.y,p2.x,p2.y,clBlue);
bhm(p2.x,p2.y,p7.x,p7.y,clBlue);
int diffi=p7.y-p2.y;

for(int i=0;i<=diffi;i++)

{
bhm(p2.x,p2.y+i,p1.x,p1.y+i,clBlue);
}

  }

if(checky<0)
{
Form1->Caption=p1.z;
;
bhm(p1.x,p1.y,p3.x,p3.y,clBlue);
bhm(p3.x,p3.y,p5.x,p5.y,clBlue);
bhm(p5.x,p5.y,p2.x,p2.y,clBlue);
bhm(p2.x,p2.y,p1.x,p1.y,clBlue);


Form1->Canvas->MoveTo(p1.x,p1.y);
Form1->Canvas->LineTo(p5.x,p5.y);
Form1->Canvas->MoveTo(p2.x,p2.y);
Form1->Canvas->LineTo(p3.x,p3.y);
Form1->Canvas->MoveTo((p1.x+p3.x)/2,(p1.y+p3.y)/2);
Form1->Canvas->LineTo((p2.x+p5.x)/2,(p2.y+p5.y)/2);
Form1->Canvas->MoveTo((p2.x+p1.x)/2,(p2.y+p1.y)/2);
Form1->Canvas->LineTo((p3.x+p5.x)/2,(p3.y+p5.y)/2);



}





}