如何将3-D坐标转换为计算机图形中的2-D坐标

时间:2014-03-23 09:57:30

标签: graphics 3d dosbox

我正在做一个在屏幕上显示三维立方体的程序。我正在DOSBOX中执行该程序。我的算法如下: 我把侧面的长度作为用户的输入 2.我绘制的多维数据集的初始坐标前缀为(140,280,0) 3.我使用公式x = x +(z / sqrt(6))将3-D表示转换为2-D

以下是我的代码:

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

float idmat[4][4],inpmat[4][8];

void main()
{
int gd=DETECT,gm;
float s,temz,sqp,tx1,ty1,tz1;
int i,tz,j,side,d2mat[3][8],tx,ty;
for(i=1;i<=4;i++)
{for(j=1;j<=4;j++)
idmat[i][j]=0;
}

 for(i=0;i<4;i++)
 {for(j=0;j<4;j++)
 {if(i==j)
 {
 idmat[i][j]=1;
 }
 }}

 printf("Enter the side of the cube\n");
 scanf("%d",&side);
 inpmat[1][1]=140;
 inpmat[2][1]=280;
 inpmat[3][1]=0;
 tx=140;
 ty=280;
 tz=0;
 tx=tx+side;
 inpmat[1][2]=tx;
 inpmat[2][2]=ty;
 inpmat[3][2]=tz;
 ty=ty+side;
 inpmat[1][3]=tx;
 inpmat[2][3]=ty;
 inpmat[3][3]=0;
 tx=inpmat[1][1];
inpmat[1][4]=tx;
inpmat[2][4]=ty;
inpmat[3][4]=tz;
tz=tz+side;
printf("tz is %d ",tz);
inpmat[1][5]=tx;
inpmat[2][5]=ty;
inpmat[3][5]=tz;
tx=tx+side;
inpmat[1][6]=tx;
inpmat[2][6]=ty;
inpmat[3][6]=tz;
ty=ty+side;
inpmat[1][7]=tx;
inpmat[2][7]=ty;
inpmat[3][7]=tz;
tx=inpmat[1][1];
inpmat[1][8]=tx;
inpmat[2][8]=ty;
inpmat[3][8]=tz;
for(i=1;i<=8;i++)
inpmat[4][i]=1;

sqp=sqrt(6);
printf("The sqrt is %f \n",sqp);
for(i=1;i<=8;i++)
{
    tx1=inpmat[1][i];
    printf("%f ",inpmat[1][i]);
    ty1=inpmat[2][i];
   printf("%f lala\n ",inpmat[3][i]);

    tz1=inpmat[3][i];
     printf("prr %f \n",tz1);
    temz=tz1/sqrt(6);
      printf("temz is %f \n",temz);
    tx1=tx1+temz;
    ty1=ty1+temz;
    d2mat[1][i]=tx1;
      // printf("%f ",d2mat[1][i]);
    d2mat[2][i]=ty1;
    //  printf("%f ",d2mat[2][i]);
    d2mat[3][i]=1;
      //    printf("%f \n",d2mat[3][i]);
  }


  initgraph(&gd,&gm,"C:\\TurboC3\\BGI\\");
line(d2mat[1][1],d2mat[2][1],d2mat[1][2],d2mat[2][2]);
line(d2mat[1][2],d2mat[2][2],d2mat[1][3],d2mat[2][3]);
line(d2mat[1][3],d2mat[2][3],d2mat[1][4],d2mat[2][4]);
line(d2mat[1][4],d2mat[2][4],d2mat[1][1],d2mat[2][1]);
//printf("%f %f %f %f ",inpmat[1][4],inpmat[2][4],inpmat[1][6],inpmat[2][6]);
line(d2mat[1][5],d2mat[2][5],d2mat[1][6],d2mat[2][6]);

line(d2mat[1][6],d2mat[2][6],d2mat[1][7],d2mat[2][7]);
line(d2mat[1][7],d2mat[2][7],d2mat[1][8],d2mat[2][8]);
line(d2mat[1][8],d2mat[2][8],d2mat[1][5],d2mat[2][5]);

line(d2mat[1][5],d2mat[2][5],d2mat[1][1],d2mat[2][1]);
line(d2mat[1][6],d2mat[2][6],d2mat[1][2],d2mat[2][2]);
line(d2mat[1][8],d2mat[2][8],d2mat[1][4],d2mat[2][4]);
line(d2mat[1][7],d2mat[2][7],d2mat[1][3],d2mat[2][3]);

getch();
//closegraph();
//restorecrtmode();
}

当在屏幕上绘制图形时,我得到的是长方体而不是完美的立方体。有人可以帮我解决这个问题吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

感谢所有关注我的问题。我在程序中发现了错误。 在我输入inpmat[1][7],inpmat[2][7],inpmat[3][7]之前,我应该做ty=ty-side,以便y坐标移回初始位置。相反,我做了ty=ty+side并绘制了数字。当我看到结果图形错误时,我尝试编辑代码以相应地绘制线条,而不是查看代码的上一部分。我很抱歉等你宝贵的时间。