论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

一个可以控制运动的3D多面体

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:43:04

本程序用于描绘一个旋转的多面体,有如下控制健,1,2,3,4,5,6,7,8,9,0(小键盘).a,s,d,w,(和cs一样的功能)程序中有具体的说明.希望经验大家交流--贾胜华.

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

main()
{int i,j;            /*循环变量*/
 int mode=VGAHI,driver=VGA;
 int l,n,k=0;
 char gg,hh[13]="complete   %";
 float arf,the,baty=0,batz=0,r;  /*角度变量*/
 float xx[5],yy[5],zz[5],x,y,z;          /*三维变量*/
 float a[32][16][3],c[32][16][3][2];/*用于暂存?/
 initgraph(&driver,&mode,"\\tc");/*图像初始化*/

 xx[4]=0;/*初值*/
 yy[4]=0;
 zz[4]=0;
 xx[3]=0;
 yy[3]=0;
 zz[3]=0;

 for(i=0;i<=31;i++)/*对c[][][][]付初值*/
 for(j=0;j<=15;j++)
 for(l=0;l<=2;l++)
 {c[i][j][l][0]=0;
  c[i][j][l][1]=0;}

setfillstyle(1,9);

 for(i=0;i<=31;i++)      /*按角度开始求解方程*/
{
 cleardevice();           /*这一段用于实现求解进度条*/
 rectangle(9+220,19+220,114+220,31+220);
 bar(10+220,20+220,10+3*i+6+220,30+220);
 hh[10]=(3*i+6)%10+48;
 hh[9]=(3*i+6-(3*i+6)%10)/10+48;
 outtextxy(120+220,20+220,hh);

for(j=0;j<=15;j++)
 {
  the=(3.1415926/15)*(j-7.5);/*角度的精度为0.0000001*/
  arf=(3.1415926/31)*i*2;
  for(r=0;r<150;r+=0.01)  /*(精确度为0.01)开始求解方程*/
  {x=r*cos(the)*cos(arf);
   y=r*cos(the)*sin(arf);
   z=r*sin(the);
   if((x*x/100+y*y/100+z*z-100)*(x*x/100+y*y/100+z*z-100)<0.001)/*此处插入用户曲面方程*/
   break;
  }

  a[i][j][0]=x;/*保存求解结果,一次保存三个量是用空间换时间.(可以改进)*/
  a[i][j][1]=y;
  a[i][j][2]=z;
}
}

cleardevice();
l=0;
the=0;
gg='6';
for(;;) /*开始处理用户的控制*/
{                                    /*这一段用于实现移动*/

      if(gg=='w'||gg=='W')   yy[4]-=1;                         /*前进*/
 else if(gg=='a'||gg=='A')  {if(l==0) xx[4]+=1; if(l==1) the-=0.01;}/*左移或者右转*/
 else if(gg=='s'||gg=='S')   yy[4]+=1;                         /*后退*/
 else if(gg=='d'||gg=='D')  {if(l==0) xx[4]-=1; if(l==1) the+=0.01;}/*右移或者左转*/
 else if(gg=='c'||gg=='C')  {l=(l-1)*(l-1);gg='q';}/*a,d功能控制键*/
                            /*接下来用于实现转动*/
 else if(gg=='6') batz+=0.01;/*左转*/
 else if(gg=='8') baty+=0.01;/*上转*/
 else if(gg=='2') baty-=0.01;/*下转*/
 else if(gg=='4') batz-=0.01;/*右转*/
 else if(gg=='9') {batz+=0.01;baty+=0.01;}/*右上*/
 else if(gg=='1') {batz-=0.01;baty-=0.01;}/*左下*/
 else if(gg=='7') {batz-=0.01;baty+=0.01;}/*左上*/
 else if(gg=='3') {batz+=0.01;baty-=0.01;}/*右下*/
 else if(gg=='0') exit(0);/*退出*/
 else ;/*其他键,为暂停*/

 r=pow(xx[4]*xx[4]+yy[4]*yy[4],0.5);
  k=(1-k)*(1-k);

   if(kbhit())/*判定用户是否有键入*/
   gg=getch();

   for(i=0;i<=31;i++)/*开始3D->2D的转换*/
   for(j=0;j<=15;j++)
   {
    xx[0]=a[i][j][0];/*承接求解数据*/
    yy[0]=a[i][j][1];
    zz[0]=a[i][j][2];

    xx[1]=xx[0]*cos(baty)-zz[0]*sin(baty);/*延y轴的偏转计算*/
    zz[1]=sin(baty)*xx[0]+cos(baty)*zz[0];
    yy[1]=yy[0];

    xx[2]=xx[1]*cos(batz)-yy[1]*sin(batz)+xx[4];/*延z轴的偏转计算*/
    yy[2]=sin(batz)*xx[1]+cos(batz)*yy[1]+yy[4];
    zz[2]=zz[1]+zz[4];

    xx[3]=xx[2]*cos(the)-yy[2]*sin(the);/*实现定点转动*/
    yy[3]=sin(the)*xx[2]+cos(the)*yy[2];

    x=1/(0.18+0.002*yy[3]);/*远小近大的计算,同时考虑视点*/
    xx[2]=xx[3]*x;
    zz[2]=zz[2]*x;

    c[i][j][0][k]=xx[2]+0*yy[2]*0.707+320;/*计算完后进行3d->2d*/
    c[i][j][1][k]=zz[2]+0*yy[2]*0.707+240;/*其中的0常数用来调节对纵深的权重*/
    c[i][j][2][k]=yy[3];
    }/*end loop for i j*/

   n=(1-k)*(1-k);

   for(i=0;i<=31;i++)/*开始作图*/
   for(j=0;j<15;j++)
      {if(c[i][j+1][2][n]>0&&c[i][j][2][n]>0)/*用于判定是否是身后的图像*/
       {setcolor(0);/*去掉以前的*/
       line(c[i][j][0][n],c[i][j][1][n],c[i][j+1][0][n],c[i][j+1][1][n]);
       }
       if(c[i][j+1][2][k]>0&&c[i][j][2][k]>0)
       {setcolor(9)/*画上现在的,以下一样*/;
       line(c[i][j][0][k],c[i][j][1][k],c[i][j+1][0][k],c[i][j+1][1][k]);
       }

    if(i<31)
     {if(c[i+1][j][2][n]>0&&c[i][j][2][n]>0)
      {setcolor(0);
      line(c[i][j][0][n],c[i][j][1][n],c[i+1][j][0][n],c[i+1][j][1][n]);
      }
      if(c[i+1][j][2][k]>0&&c[i][j][2][k]>0)
      {setcolor(9);
      line(c[i][j][0][k],c[i][j][1][k],c[i+1][j][0][k],c[i+1][j][1][k]);
      }
     }/*end if i*/

     if(i==31)
     {if(c[0][j][2][n]>0&&c[i][j][2][n]>0)
      {setcolor(0);
      line(c[i][j][0][n],c[i][j][1][n],c[0][j][0][n],c[0][j][1][n]);
      }
      if(c[0][j][2][k]>0&&c[i][j][2][k]>0)
      {setcolor(9);
      line(c[i][j][0][k],c[i][j][1][k],c[0][j][0][k],c[0][j][1][k]);
      }
     }/*end if i*/
   }/*end loop for i j*/
}/*end loop for baty*/
}

多多指导!哈哈

上一篇:{实例}The Sun,the Earth,the Moon 人气:4529
下一篇:{实例}鼠标光标制作程序 人气:6026
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058