庞大资源库的计算机教程网站!
设为首页
加入收藏
总编信箱
投稿或申请专栏请先 [登 陆]
首页 操作系统 程序设计 图形图像 媒体动画 机械电子 WEB开发 数 据 库 办公系列 路由技术 网络原理 网络应用
认证考试 安全技术
首页>程序设计>C语言>编程技巧>正文
资料搜索
Google搜索
Google
返回上级列表

推荐文章

快速保存网页中所有图片的方法
Windows中让光驱巧妙“隐身”技
防范非法用户入侵Win 2000/XP系
两款比较典型的ASP木马防范方法
有关表格边框的css语法整理
Windows XP中可以被禁用的服务
SQL Server导出导入数据方法
Javascript所有对象的属性的获
网页(HTML)中的特殊字符
与篮球共舞,尽显模式本色
QQ病毒的手工清除方法
Photoshop为极品美女打造性感睫
天衣无缝:IIS与PHP水火也相容
SQL Server存储过程编写和优化

弹跳的球体

 作者:阿春    日期:2005-8-4 13:32:28
字号选择〖 〗/ 双击滚屏 单击停止   

这是我本学期计算机图形学课程设计课题。

程序功能:

弹跳的球体:一个着色的三维球体,沿着一条给定的轨道(正弦曲线)不断弹跳并同时翻滚,要求按ESC停止转动翻滚按↑加快弹跳速度,按↓减慢弹跳速度。设置了一段蓝色经曲面以便能看出经线也在转动。

输入输出的要求:

在屏幕上不断地连续弹跳并同时翻滚,按↑加快移动速度,按↓减慢移动速度。

 

程序清单:

 

#include<graphics.h>  /*图形系统头文件*/

#include<conio.h>

#include<dos.h>

#include<math.h>

#include<bios.h>      /*控制方向键头文件*/

#include<stdlib.h>

#define PI 3.1415926

 

 

int A=50;

float w=0.2;

static double yy=0.0,xx=0.0;

char ch;

 

void convey()        /*轨迹方程函数*/

{ xx=xx+10.0;

 yy=200-A*sin(w*xx);

 if(xx>=500&&yy>=400) {xx=10.0;yy=0.0;}  /*设置球体运动的最大坐标*/

  return;

}

 

void quittime01(int t2)  /*按↑键加速球体运动*/

{ int t3;t3=t2;

  delay(10000-200*t3);

  return;

}

 

void quittime02(int t4)   /*按↓键减速球体运动*/

{ int t5;t5=t4;

  delay(20000+200*t5);

   return;

}

 

void keyboard(int t1)      /*定义判断是否按键控制速度函数*/

{int t2,t4;

 if(kbhit())              /*判断是否按方向键*/

     {

      ch=getch();

      switch(ch)

       {

    case 72: {t2=t1;

          quittime01(t2);  /*调用quittime01()函数*/

          return; }

    case 80: {t4=t1;

          quittime02(t4);

          return; }

    default:break;

       }

     }

 else

    { delay(10000);return;}

}

 

 

void sphere(float R,int alfa,int beta)

{    /*R为球体半径,alfa、beta分别为半径与经纬线的夹角*/

 float x[4],y[4],z[4];  /*定义旋转变换前点坐标数组*/

 float x1[4],z1[4];    /*定义旋转变换后点坐标数组*/

 int i,j,k;

 float sx[4],sy[4];

 int shfill[10];  /*定义存放了5个顶点坐标序列的数组*/

 double yn;

 double a1,a2,b1,b2,c,d;

 c=alfa*PI/180.0;  /*每次旋转的角度*/

 d=beta*PI/180.0;

 cleardevice();

 for(j=0;j<180;j=j+20)

 {

   a1=j*PI/180.0;

   a2=(j+20)*PI/180.0;

   for(i=0;i<360;i=i+20)

   {

    b1=i*PI/180;

    b2=(i+20)*PI/180;

    x[0]=R*sin(a1)*cos(b1);   /*求出图形旋转前点的坐标*/

 

    y[0]=R*sin(a1)*sin(b1);

    z[0]=R*cos(a1);

    x[1]=R*sin(a2)*cos(b1);

    y[1]=R*sin(a2)*sin(b1);

    z[1]=R*cos(a2);

    x[2]=R*sin(a2)*cos(b2);

    y[2]=R*sin(a2)*sin(b2);

    z[2]=R*cos(a2);

    x[3]=R*sin(a1)*cos(b2);

    y[3]=R*sin(a1)*sin(b2);

    z[3]=R*cos(a1);

    for(k=0;k<4;k++)    /*求出图形旋转后点的坐标*/

    {

     x1[k]=x[k]*cos(c)-y[k]*sin(c);

     z1[k]=-x[k]*sin(c)*sin(d)-y[k]*cos(c)*sin(d)+z[k]*cos(d);

      sx[k]=100-x1[k];  /*将三维坐标转化为屏幕坐标*/

      sy[k]=100-z1[k];

  }

      yn=-(x1[2]-x1[0])*(z1[3]-z1[1])+(x1[3]-x1[1])*(z1[2]-z1[0]);

      if(yn>=0.0)   /*对可见部分进行画线,实现消隐*/

     {

 

      moveto(sx[0],sy[0]);

      lineto(sx[1],sy[1]);

      lineto(sx[2],sy[2]);

      lineto(sx[3],sy[3]);

      lineto(sx[0],sy[0]);

      shfill[0]=(int)sx[0],shfill[1]=(int)sy[0];

      shfill[2]=(int)sx[1],shfill[3]=(int)sy[1];

      shfill[4]=(int)sx[2],shfill[5]=(int)sy[2];

      shfill[6]=(int)sx[3],shfill[7]=(int)sy[3];

      shfill[8]=(int)sx[0],shfill[9]=(int)sy[0];

      if(i==20)    /*对一段经曲面进行填充为绿色*/

      { setfillstyle(1,2); }

      else

      setfillstyle(1,15);

      fillpoly(5,shfill);  /*用当前颜色填充多边形*/

     }

    }

  }

}

 

void main()

{

int gdrive=DETECT,gmode,k,t,i=0; /*自动探测图形显示器适配器种类*/

   int size; void *buf[10];

  initgraph(&gdrive,&gmode,"");   /*初始化图形系统*/

  setcolor(RED);   /*设置当前画笔颜色为红色*/

  for(k=36;k<=360;k=k+36)

  {

   sphere(50,k,k);   /*调用sphere函数*/

   size=imagesize(50,40,150,150);

 /*将保护位图象所需的字节数赋值给size*/

    if(size!=-1)

     buf[i]=malloc(size);    /* 分配size字节的内存空间*/

    if(buf[i])

     getimage(50,40,150,150,buf[i]);  /*在屏幕指定的位置将一个位图保存到内存*/

i++;

  }

  cleardevice();

  for(t=0;t<=45;t++)

  {  cleardevice();

     putimage(xx,yy,buf[t%10],COPY_PUT);  /*在指定位置以拷贝形式输出一个位图*/

     keyboard(t);

 

 

     convey();

  }

 for(i=0;i<10;i++)

  free(buf[i]);    /*释放内存空间*/

 getch();

  closegraph();  /*关闭图形系统*/

}

上一篇:C的数据库编程(1)    下一篇:C写CGI程序  
[发送给好友]  [关闭窗口]  [返回顶部]   转载请注明来源:www.it00.com   
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 原点 投稿作者: 阿春
信息来源: 网络 录入时间: 2005-8-4 13:32:28
关于我们 - 广告服务 - 版权申明 - 网站地图 - 联系方式 - 总编信箱 - 会员投稿