Turbo C ++ 3D旋转问题

时间:2015-09-26 04:20:44

标签: turbo-c++

首先,请不要问我为什么要使用过时的软件。我只是搞乱了Turbo C ++,这是一种开始使用简单程序的有趣方式。我正在尝试创建一个在CPU上运行的旧式3D引擎。我首先尝试在Z轴上旋转一个简单的3D框。由于它在Z轴上旋转,它应该看起来像一个2D盒旋转。但是当我运行代码时,它甚至不会将顶点投影到正确的位置。

请原谅我输入代码的方式。

    void Render3D(float VDATA[],float CFRAME[]) { 
    if (VDATA!=NULL) { float POINT[2]; float OLDPOINT[2]; float AXIS=0; 
    for (int P=0; P<24; P=P+1) { AXIS=AXIS+1; if (AXIS==1) { POINT[0]=VDATA[P]; }
    if (AXIS==2) { POINT[1]=VDATA[P]; } if (AXIS==3) { POINT[2]=VDATA[P]; if (CFRAME!=NULL) { 
    OLDPOINT[0]=POINT[0]; OLDPOINT[1]=POINT[1]; OLDPOINT[2]=POINT[2];
    POINT[0]=OLDPOINT[0]*cos(CFRAME[8])-OLDPOINT[1]*sin(CFRAME[8]);
    POINT[1]=OLDPOINT[0]*sin(CFRAME[8])+OLDPOINT[1]*cos(CFRAME[8]);
    OLDPOINT[0]=POINT[0]; OLDPOINT[1]=POINT[1]; OLDPOINT[2]=POINT[2];
    POINT[1]=OLDPOINT[1]*cos(CFRAME[7])-OLDPOINT[2]*sin(CFRAME[7]);
    POINT[2]=OLDPOINT[1]*sin(CFRAME[7])+OLDPOINT[2]*cos(CFRAME[7]);
    OLDPOINT[0]=POINT[0]; OLDPOINT[1]=POINT[1]; OLDPOINT[2]=POINT[2];
    POINT[2]=OLDPOINT[2]*cos(CFRAME[6])-OLDPOINT[0]*sin(CFRAME[6]);
    POINT[0]=OLDPOINT[2]*sin(CFRAME[6])+OLDPOINT[0]*cos(CFRAME[6]);
    POINT[0]=POINT[0]+CFRAME[3]; POINT[1]=POINT[1]+CFRAME[4]; POINT[2]=POINT[2]+CFRAME[5]; } 
    cout<<POINT[0]<<","<<POINT[1]<<","<<POINT[2]<<endl;
    putpixel(POINT[0],POINT[1],7); AXIS=0; POINT[0]=0; POINT[1]=0; POINT[2]=0; } } } }

    void main() { int Driver=DETECT,Mode; initgraph(&Driver,&Mode,"BGI"); 
    clrscr(); cleardevice(); 

    float VDATA[23]; float CFRAME[8]; CFRAME[3]=200; CFRAME[4]=200; CFRAME[5]=0;
    VDATA[0]=-50; VDATA[1]=-50; VDATA[2]=-50;
    VDATA[3]=-50; VDATA[4]=50; VDATA[5]=-50;
    VDATA[6]=50; VDATA[7]=-50; VDATA[8]=-50;
    VDATA[9]=50; VDATA[10]=50; VDATA[11]=-50;
    VDATA[12]=-50; VDATA[13]=-50; VDATA[14]=50;
    VDATA[15]=-50; VDATA[16]=50; VDATA[17]=50;
    VDATA[18]=50; VDATA[19]=-50; VDATA[20]=50;
    VDATA[21]=50; VDATA[22]=50; VDATA[23]=50; 

    while (1>0) { clrscr(); cleardevice(); Render3D(VDATA,CFRAME); 
    CFRAME[8]=CFRAME[8]+0.01; getch(); }

    clrscr(); cleardevice(); closegraph(); }

VDATA [23]数组保存立方体的点。 CFRAME [8]数组保存坐标系信息。前三个元素可以忽略。但是CFRAME [3],CFRAME [4],CFRAME [5]设置了XYZ中立方体的偏移量。 CFRAME [6],CFRAME [7],CFRAME [8]设置立方体在XYZ中的旋转。但是当我运行代码时,它会显示如下内容:

https://i.gyazo.com/a8c0d62b03e14aa10e2bc93027fb3f05.png

它应该显示一个方框,但它没有。

1 个答案:

答案 0 :(得分:0)

你遇到的第一个问题是,你有一个元素太短的数组,例如

float POINT[2];

然后在很多地方你访问POINT[2] ...在C中,当你定义一个数组时,你会告诉它中的元素数量,所以在上面创建带有两个元素的POINT数组,其中包含索引0和1.访问POINT[2]超出了数组边界,这是未定义的行为

所以你想要的是,例如:

float POINT[3]; // valid indexes 0..2

当然,对于你遇到同样错误的每个阵列都有同样的修复方法。

启用警告的合适编译器应警告您这样的代码,因为编译器在编译时知道数组大小。

代码可能有其他问题,但只要您有未定义的行为,尝试修复它们毫无意义,因为这实际上意味着,您的程序可以执行程序可以执行的任何操作(包括看似正确的工作,下次使用网上银行时清空您的银行账户,以及之间的所有内容)。