| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 555 人关注过本帖
标题:3d多面体
只看楼主 加入收藏
jpweiyi
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-4-23
结帖率:100%
收藏
 问题点数:0 回复次数:5 
3d多面体
#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*/
}



代码确实实现了3d 自己分析了和多``
 但不是很能理解``希望大家能给我一些关于C下3D的程序```
研究下``主要是 本身的3D转换和3D到2D映射变换
  希望大家给点点帮助```

[[it] 本帖最后由 jpweiyi 于 2008-9-11 21:24 编辑 [/it]]
搜索更多相关主题的帖子: 多面体 
2008-09-11 18:41
hoodlum1980
Rank: 2
来 自:浙江大学
等 级:论坛游民
威 望:2
帖 子:289
专家分:23
注 册:2008-2-24
收藏
得分:0 
都编译不通过。xx和yy是数组名,不是指针,怎么能去++--呢。
2008-09-11 19:05
snakealpha
Rank: 1
来 自:扬州
等 级:新手上路
威 望:1
帖 子:267
专家分:0
注 册:2005-11-5
收藏
得分:0 
偶最囧数学了~n年前抱着.Net+DirectX的书看,结果卡在用矩阵实现变换那里了...

天涯也有江南信
梅破知春近
夜阑风细得香迟
不道晓来开遍向南枝
2008-09-11 19:57
jpweiyi
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-4-23
收藏
得分:0 
不是把``我可以编译啊`
2008-09-11 21:24
jpweiyi
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2008-4-23
收藏
得分:0 
回复 2# hoodlum1980 的帖子
改了一下``已经可以编译了```
2008-09-11 23:10
xianshizhe111
Rank: 1
等 级:新手上路
帖 子:1451
专家分:0
注 册:2007-12-8
收藏
得分:0 
可以呀!不错。
2008-09-11 23:23
快速回复:3d多面体
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024931 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved