一个简单的三维程序(c语言)

上传人:子 文档编号:43297315 上传时间:2018-06-05 格式:DOC 页数:11 大小:16.98KB
返回 下载 相关 举报
一个简单的三维程序(c语言)_第1页
第1页 / 共11页
一个简单的三维程序(c语言)_第2页
第2页 / 共11页
一个简单的三维程序(c语言)_第3页
第3页 / 共11页
一个简单的三维程序(c语言)_第4页
第4页 / 共11页
一个简单的三维程序(c语言)_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《一个简单的三维程序(c语言)》由会员分享,可在线阅读,更多相关《一个简单的三维程序(c语言)(11页珍藏版)》请在金锄头文库上搜索。

1、一个简单的三维程序一个简单的三维程序(C(C 语言语言) )aphics.h#include#include#include#include#include#include#define ESC 27 #define F 80 /此数表示通常情况下操作者离计算机的距离(80 厘米)#define HIGHT 480 /屏幕纵向分辩率#define WIDE 640 /屏幕横向分辨率#define PAI 3.14. 正文:/*这是一个简单的三维引擎程序,模仿三个天体的运动,一个行星绕轴自转,两个卫星分别绕行星的经线和纬线做公转。 (在 turboc3.0 下编译成功)*/#include#in

2、clude#include#include#include#include#include#include#include#include#define ESC 27 #define F 80 /此数表示通常情况下操作者离计算机的距离(80厘米)#define HIGHT 480 /屏幕纵向分辩率#define WIDE 640 /屏幕横向分辨率#define PAI 3.1415926 /圆周率#define TIME 0.05 /转动间隔时间(每 0.2 秒转动 5 度)typedef structfloat x;float y;_2D ; /二维坐标点typedef structfloa

3、t x;float y;float z;_3D; /三维坐标点typedef structint anglex;int angley;int anglez;Axle; /轴向量(angle x,y,z 分别表示向量与 x,y,z 轴的夹角)typedef struct/纬度圈由赤道加上南北半球的各四个纬度圈共 9 个纬度圈组成,经度等分成 10 个圈/所以用 二维数组 g910来记录经纬度交点_3D *g910; / temp910用来记录 g910各点从三维变换到二维时的坐标 _2D *temp910;_3D *center; /自转中心坐标,即球心坐标_3D *round_center;

4、/公转中心坐标float r; /球体半径Globe; /球体float Observe_Mat44,World_Mat44; /观察坐标矩阵 与世界坐标矩阵float Sin360,Cos360; /存放三角函数值的两个数组,可以减少大量的浮点运算,以提高效率size_t Size2D,Size3D,Sizeaxle,Sizeglobe; /各结构体的尺寸_3D *Observe; /观察者所在的位置坐标Globe *Moon1,*Moon2,*Earth; /卫星 1,卫星 2,地球 三个球体int Zangle=5; /转动角速度/建立三角函数表void create_table() i

5、nt i;for(i=0;ix=160;Observe-y=0;Observe-z=0;/把单位矩阵赋值给目标矩阵void to_EMat(float mat44)int i,j;for(i=0;ix=point2-x;point1-y=point2-y;point1-z=point2-z;/把二维坐标点 1 的值赋给点 2void _2D_cpy(_2D *point1,_2D *point2)point1-x=point2-x;point1-y=point2-y;/初始化各结构体的尺寸void init_size()Size2D=sizeof(_2D);Size3D=sizeof(_3D)

6、;Sizeaxle=sizeof(Axle);Sizeglobe=sizeof(Globe);/初始化观察坐标矩阵与世界坐标矩阵(设定为单位矩阵)void init_Mat()int i,j;for(i=0;ix,2)+pow(Observe-y,2),0.5);_3Dr=pow(pow(Observe-x,2)+pow(Observe-y,2)+pow(Observe-z,2),0.5);Observe_Mat00=Observe-y/_2Dr*-1;Observe_Mat01=Observe-x*Observe-z/_2Dr/_3Dr*-1;Observe_Mat02=Observe-x/

7、_3Dr*-1;Observe_Mat10=Observe-x/_2Dr;Observe_Mat11=Observe-y*Observe-z/_2Dr/_3Dr*-1;Observe_Mat12=Observe-y/_3Dr*-1;Observe_Mat21=_2Dr/_3Dr;Observe_Mat22=Observe-z/_3Dr*-1;Observe_Mat32=_3Dr;aphics.h#include#include#include#include#include#include#define ESC 27 #define F 80 /此数表示通常情况下操作者离计算机的距离(80 厘

8、米)#define HIGHT 480 /屏幕纵向分辩率#define WIDE 640 /屏幕横向分辨率#define PAI 3.14. 正文:Observe_Mat33=1;/三维坐标点对指定矩阵变换以得到新的三维坐标void _3D_mult_mat(_3D *Source,float mat44)_3D *temp;temp=(_3D *)malloc(Size3D);temp-x=Source-x*mat00+Source-y*mat10+Source-z*mat20+mat30;temp-y=Source-x*mat01+Source-y*mat11+Source-z*mat21

9、+mat31;temp-z=Source-x*mat02+Source-y*mat12+Source-z*mat22+mat32;_3D_cpy(Source,temp);/把三维坐标点从世界坐标变换成观察坐标void world_to_ob(_3D *point1,_3D *point2)point2-x=point1-x*Observe_Mat00+point1-y*Observe_Mat10+point1-z*Observe_Mat20+Observe_Mat30;point2-y=point1-x*Observe_Mat01+point1-y*Observe_Mat11+point1-

10、z*Observe_Mat21+Observe_Mat31;point2-z=point1-x*Observe_Mat02+point1-y*Observe_Mat12+point1-z*Observe_Mat22+Observe_Mat32;/把三维坐标投影为二维坐标void _3Dto_2D(_3D *_3Dpoint,_2D *_2Dpoint)_2Dpoint-x=WIDE/2+F*_3Dpoint-x/_3Dpoint-z;_2Dpoint-y=HIGHT/2-F*_3Dpoint-y/_3Dpoint-z;/球体绕 z 轴转动后的坐标变换void z_round(Globe *gl

11、obe,int angle)float z44;int i,j;to_EMat(z);z00=Cosget_angle(angle);z01=Singet_angle(angle);z10=-z01;z11=z00;for(i=0;igj,z);/球体绕 y 轴转动后的坐标变换void y_round(Globe *globe,int angle)float y44;int i,j;to_EMat(y);y00=Cosget_angle(angle);y20=Singet_angle(angle);y02=-y20;y22=y00;for(i=0;igj,y);/球体绕 x 轴转动后的坐标变换

12、void x_round(Globe *globe,int angle)float x44;int i,j;to_EMat(x);x11=Cosget_angle(angle);x12=Singet_angle(angle);x21=-x12;x22=x11;for(i=0;igj,x);/初始化图形模式void init_gph()int gd=DETECT,gm;initgraph(setfillstyle(SOLID_FILL,BLACK);bar(0,0,640,480);/开辟一个用来存放球体数据的空间,并返回头地址Globe *create_globe()Globe *p;int

13、i,j;p=(Globe *)malloc(Sizeglobe);for(i=0;igj=(_3D *)malloc(Size3D);p-tempj=(_2D *)malloc(Size2D);p-center=(_3D *)malloc(Size3D);p-round_center=(_3D *)malloc(Size3D);return p;/把一个角化为 0-360 的角,要求是它的三角函数值不变int get_angle(int angle)angle%=360;if(anglex=x0;p-y=y0;p-z=z0;return p;/给一个轴向量赋值Axle *get_axle(in

14、t qx,int qy,int qz)Axle *p;p=(Axle *)malloc(Sizeaxle);p-anglex=qx;p-angley=qy;p-anglez=qz;return p;/从世界坐标原点平移球体到指定点(球体初始化时用)void place_globe(Globe *globe)float tempf44;int i,j;to_EMat(tempf);tempf30=(globe-center)-x;tempf31=(globe-center)-y;tempf32=(globe-center)-z;for(i=0;igj,tempf);/球体初始化void init_globe(Globe *globe,float r,_3D *thecenter,_3D *rnd_center)int i,j;/globe=(Globe *)malloc(Sizeglobe);globe-r=r;for(i=-4;igi+4j)-x=r*Cosget_angle(i*18)*Cosget_angle(j*36);(globe-gi+4j)-y=r*Cosget_angle(i*18)*Singet_angle(j*36);(globe-gi+4j)-z=r*Singet_angle(i*18);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号