| Current Path : /var/www/html/venkat/check3/file/cg2013/pawan/ |
| Current File : /var/www/html/venkat/check3/file/cg2013/pawan/rit2013017_1.cpp |
#include <stdio.h>
#include<math.h>
#include<string.h>
//declaration of matrices
double line[20][6],e[3],look[3],upV[3],d;
double lV[3],rV[3],uV[3];
double lCap[3],rCap[3],uCap[3];
double camera_mat[4][4];
double camera_coord[19][6];
double mul[4][1];
double perspective[19][6];
//multiplying two matrices
void MatMul(int n1,int n2,int n3,int index1,int index2){
double ans[n1][n3];
memset(ans,0,sizeof(ans));
for(int i = 0; i < n1; i++){
for(int j = 0; j < n3; j++){
for(int k = 0; k < n2; k++){
ans[i][j] += camera_mat[i][k]*mul[k][j];
}
}
}
for(int i = 0;i<3;i++)
camera_coord[index1][i+index2] = ans[i][0];
}
int main()
{
//Input given for eye,lookat,upV,d,and lines
e[0]=0;
e[1]=-100;
e[2]=10;
look[0]=0;
look[1]=0;
look[2]=0;
upV[0]=0;
upV[1]=0;
upV[2]=10;
d=10;
line[1][0]=-100;
line[1][1]=700;
line[1][2]=0;
line[1][3]=-100;
line[1][4]=500;
line[1][5]=0;
line[2][0]=-100;
line[2][1]=500;
line[2][2]=0;
line[2][3]=100;
line[2][4]=500;
line[2][5]=0;
line[3][0]=100;
line[3][1]=500;
line[3][2]=0;
line[3][3]=100;
line[3][4]=700;
line[3][5]=0;
line[4][0]=100;
line[4][1]=700;
line[4][2]=0;
line[4][3]=-100;
line[4][4]=700;
line[4][5]=0;
line[5][0]=-50;
line[5][1]=0;
line[5][2]=0;
line[5][3]=-50;
line[5][4]=500;
line[5][5]=0;
line[6][0]=-150;
line[6][1]=0;
line[6][2]=0;
line[6][3]=-500;
line[6][4]=400;
line[6][5]=0;
line[7][0]=-500;
line[7][1]=400;
line[7][2]=0;
line[7][3]=-100;
line[7][4]=700;
line[7][5]=0;
line[8][0]=-50;
line[8][1]=0;
line[8][2]=0;
line[8][3]=-400;
line[8][4]=400;
line[8][5]=0;
line[9][0]=-400;
line[9][1]=400;
line[9][2]=0;
line[9][3]=-100;
line[9][4]=600;
line[9][5]=0;
line[10][0]=50;
line[10][1]=0;
line[10][2]=0;
line[10][3]=50;
line[10][4]=500;
line[10][5]=0;
line[11][0]=150;
line[11][1]=0;
line[11][2]=0;
line[11][3]=500;
line[11][4]=400;
line[11][5]=0;
line[12][0]=500;
line[12][1]=400;
line[12][2]=0;
line[12][3]=100;
line[12][4]=700;
line[12][5]=0;
line[13][0]=50;
line[13][1]=0;
line[13][2]=0;
line[13][3]=400;
line[13][4]=400;
line[13][5]=0;
line[14][0]=400;
line[14][1]=400;
line[14][2]=0;
line[14][3]=100;
line[14][4]=600;
line[14][5]=0;
//Computing the lV,rV,uV,lcap,rcap,ucap
for(int i=0;i<3;i++){
lV[i] = look[i]-e[i];
}
double lmod = sqrt(lV[0]*lV[0]+lV[1]*lV[1]+lV[2]*lV[2]);
for(int i=0;i<3;i++){
lCap[i] = lmod>0?lV[i]/lmod:lV[i];
}
rV[0] = lV[1]*upV[2]-lV[2]*upV[1];
rV[1] = lV[2]*upV[0]-lV[0]*upV[2];
rV[2] = lV[0]*upV[1]-lV[1]*upV[0];
double rmod = sqrt(rV[0]*rV[0]+rV[1]*rV[1]+rV[2]*rV[2]);
for(int i=0;i<3;i++){
rCap[i] = rmod>0?rV[i]/rmod:rV[i];
}
uV[0] = rV[1]*lV[2]-rV[2]*lV[1];
uV[1] = rV[2]*lV[0]-rV[0]*lV[2];
uV[2] = rV[0]*lV[1]-rV[1]*lV[0];
double umod = sqrt(uV[0]*uV[0]+uV[1]*uV[1]+uV[2]*uV[2]);
int i=0;
while(i<3){
uCap[i] = umod>0?uV[i]/umod:uV[i];
i++;
}
//calculating camera matrix
memset(camera_mat,0,sizeof(camera_mat));
for(int i=0;i<3;i++)
camera_mat[0][i] = rCap[i];
for(int i=0;i<3;i++)
camera_mat[1][i] = uCap[i];
for(int i=0;i<3;i++)
camera_mat[2][i] = (-1)*lCap[i];
for(int i = 0;i<3;i++)
camera_mat[0][3] += (-1)*(rCap[i]*e[i]);
for(int i = 0;i<3;i++)
camera_mat[1][3] += (-1)*(uCap[i]*e[i]);
for(int i = 0;i<3;i++)
camera_mat[2][3] += lCap[i]*e[i];
camera_mat[3][3] = 1;
for(int i = 1;i <= 14;i++){
mul[0][0] = line[i][0];mul[1][0] = line[i][1];mul[2][0] = line[i][2];
mul[3][0] = 1;
MatMul(4,4,1,i,0);
mul[0][0] = line[i][3];mul[1][0] = line[i][4];mul[2][0] = line[i][5];
MatMul(4,4,1,i,3);
}
//performing perspective projection
double _div;
for(int i=1;i<=14;i++){
_div = camera_coord[i][2]/d;
for(int j = 0;j<3;j++){
perspective[i][j] = camera_coord[i][j]/_div;
}
_div = camera_coord[i][5]/d;
for(int j = 3;j<6;j++){
perspective[i][j] = camera_coord[i][j]/_div;
}
}
for(int i = 1; i < 3; ++i) {
printf("%d,%d,%d\n",(int)(perspective[i][0]+0.5),(int)(perspective[i][1]+0.5),(int)(perspective[i][2]+0.5));
}
for(int i = 4; i>=3; i--) {
printf("%d,%d,%d\n",(int)(perspective[i][0]+0.5),(int)(perspective[i][1]+0.5),(int)(perspective[i][2]+0.5));
}
for(int i=5;i<=14;i++){
printf("%d,%d,%d\n",(int)(perspective[i][0]+0.5),(int)(perspective[i][1]+0.5),(int)(perspective[i][2]+0.5));
printf("%d,%d,%d\n",(int)(perspective[i][3]+0.5),(int)(perspective[i][4]+0.5),(int)(perspective[i][25]+0.5));
}
}