一个简单的三维程序(c语言)(A simple three-dimensional program (C language))



《一个简单的三维程序(c语言)(A simple three-dimensional program (C language))》由会员分享,可在线阅读,更多相关《一个简单的三维程序(c语言)(A simple three-dimensional program (C language))(19页珍藏版)》请在装配图网上搜索。
1、一个简单的三维程序(c语言)(A simple three-dimensional program (C language)) aphics.h > < > # includes stdlib.h # includes alloc.h > < < > # includes time.h # includes < > < > bios.h # includes string.h # includes math.h > < esc # define 27 # define f 80 / / 此数表示通常情况下操作者离计算机的距离 (80厘米) # define hight 480 / / 屏幕纵
2、向分辩率 # define wide 640 / / 屏幕横向分辨率 # define pai 3.14... 正文: / * 这是一个简单的三维引擎程序, 模仿三个天体的运动, 一个行星绕轴自转, 两个卫星分别绕行星的 经线和纬线做公转. (在turboc3.0下编译成功) * / # includes stdio.h > < # includes dos.h > < # includes conio.h > < # includes graphics.h > < # includes stdlib.h > < # includes alloc
3、.h > < # includes time.h > < # includes bios.h > < # includes string.h > < # includes math.h > < # define pte 27 # define f 80 / / 此数表示通常情况下操作者离计算机的距离 (80厘米) # define hight 480 / / 屏幕纵向分辩率 # define wide 640 / / 屏幕横向分辨率 # define pai 3.1415926 / / 圆周率 # define time 0.05 /
4、 / 转动间隔时间 (每0.2秒转动5度) typedef struct (float x) float y; _ 2d}; / / 二维坐标点 typedef struct (float x) float y; float z; _ 3d}; / / 三维坐标点 typedef struct {int anglex; int angley; int anglez; axle}; / / 轴向量 (angle x, y, z分别表示向量与x, y, z轴的夹角) typedef struct {/
5、/ 纬度圈由赤道加上南北半球的各四个纬度圈共9个纬度圈组成, 经度等分成10个圈 / / 所以用 二维数组g [9] [10] 来记录经纬度交点 _ 3d * g [9] [10]; / / temp [9] [10] 用来记录g [9] [10] 各点从三维变换到二维时的坐标 _ 2d * temp [9] [10]; _ 3d * center; / / 自转中心坐标, 即球心坐标 _ 3d round _ center; / / 公转中心坐标 float r; / / 球体半径 } / / 球体 globe; float observ
6、e _ mat [4], [4], world _ mat [4] [4]; / / 观察坐标矩阵 与世界坐标矩阵 float from [360], so [360]; / / 存放三角函数值的两个数组, 可以减少大量的浮点运算, 以提高效率 size _ t size2d, size3d, sizeaxle, sizeglobe; / / 各结构体的尺寸 _ 3d * observe; / / 观察者所在的位置坐标 moon1 globe *, * moon2, * earth; / / 卫星1, 卫星2, 地球 三个球体 int zangle = 5; /
7、/ 转动角速度 / / 建立三角函数表 void created _ table () {int i; for (i = 0; i < 360; i + +) {sin = sin (the * pai / 180). cos = cos (i * pai / 180). } } / / 初始化观察者位置 void init () _ observe {observe = (_ 3d *) malloc (size3d); observe - > x = 100; observe - > y = 0; obse
8、rve - > z = 0; } / / 把单位矩阵赋值给目标矩阵 void to _ emat (float mat [4], [4]) {int i, j; for (i = 0; i < 4; i + +) for (j = 0, j < 4; j + +) mat [j] = 0. for (i = 0; i < 4; i + +) mat = 1; } / / 把三维坐标点1的值赋给点2 void _ 3d _ cpy (_ 3d * point1, _ 3d * point2) {point1 - > x
9、 = point2 - > x; point1 - > y = point2 - > y; point1 - > z = point2 - > z; } / / 把二维坐标点1的值赋给点2 void _ 2d _ cpy (_ 2d * point1, _ 2d * point2) {point1 - > x = point2 - > x; point1 - > y = point2 - > y; } / / 初始化各结构体的尺寸 void init () _ size {size2d = sizeof (_ 2d); s
10、ize3d = sizeof (_ 3d). sizeaxle = sizeof (axle). sizeglobe = sizeof (globe); } / / 初始化观察坐标矩阵与世界坐标矩阵 (设定为单位矩阵) void init () _ mat {int i, j; for (i = 0; i < 4; i + +) for (j = 0, j < 4; j + +) {observe [j] = 0 _ mat. world _ mat [j] = 0. } for (i = 0; i < 4; i + +)
11、 {observe _ mat = 1; world _ mat = 1; } } / / 矩阵1乘矩阵2得到矩阵3 void mat _ mult (float mat1 [4], [4], float mat2 [4], [4], float mat3 [4], [4]) {int i, j; for (i = 0; i < 4; i + +) for (j = 0; j<4;j++) mat3 [J] = MAT1 [ 0 ] * MAT2 [ 0 ] [ J ] + MAT1 [ 1 ] * MAT2 [ 1 ] [ J
12、 ] + MAT1 [ 2 ] * MAT2 [ 2 ] [ J ] + MAT1 [ 3 ] * MAT2 [ 3 ] [ J ]; } 复制矩阵到矩阵1 / 2 无效mat_cpy(浮MAT1 [ 4 ] [ 4 ],浮MAT2 [ 4 ] [ 4 ]) { int i,j; 对于(i = 0;i < 3;i + +) 对于(j = 0;j=3;j + +) MAT1 [J] = MAT2 [J].; } / /根据观察者位置建立观察坐标矩阵 无效create_obmat() {浮_2dr,_3dr; _2dr =战俘
13、((战俘(观察-> x 2)+战俘(观察-> Y,2)),0.5); _3dr =战俘((战俘(观察-> x 2)+战俘(观察-> Y,2)+战俘(观察-> z,2)),0.5); observe_mat [ 0 ] [ 0 ] =观察-> Y / _2dr * 1; observe_mat [ 0 ] [ 1 ] =观察-> X *观察-> Z / _2dr / _3dr * 1; observe_mat [ 0 ] [ 2 ] =观察-> X / _3dr * 1; observe_mat [ 1 ] [ 0 ] =观察-> X / _2dr; obse
14、rve_mat [ 1 ] [ 1 ] =观察-> Y *观察-> Z / _2dr / _3dr * 1; observe_mat [ 1 ] [ 2 ] =观察-> Y / _3dr * 1; observe_mat [ 2 ] [ 1 ] = _2dr / _3dr; observe_mat [ 2 ] [ 2 ] =观察-> Z / _3dr * 1; observe_mat [ 3 ] [ 2 ] = _3dr; 图形。H > #包括<< STDLIB. H > #包括<分配。”#包括<<时间。”#包括<< BIOS。H > #包括<字符串。H > #包
15、括<<数学。”# ESC 27定义定义# F 80 / /此数表示通常情况下操作者离计算机的距离(80厘米)#定义高度480 / /屏幕纵向分辩率#定义宽640 / /屏幕横向分辨率#定义排3.14…正文: observe_mat [ 3 ] [ 3 ] = 1; } / /三维坐标点对指定矩阵变换以得到新的三维坐标 无效_3d_mult_mat(_3d *源,浮垫[ 4 ] [ 4 ]) { _3d *温度; 温度=(_3d *)malloc(size3d); 温度= x = 0 [ 0 ] +源* * * 1 [ 0 ] +源3。] 2 [ 0 ]
16、 [ 0 ]; 温度=来源* * * * 0 [ 1 ] +源* * * 1 [ 1 ] +源* 1 [ 2 ] + MAT [ 3 ] [ 1 ]; 温度= <来源> * [ 0 ] [ 2 ] +源* 2 * [ 1 ] +源2。] 2 [ 2 ] ] [ 3 ] ]; _3d_cpy(源、温度); } / /把三维坐标点从世界坐标变换成观察坐标 无效world_to_ob(_3d *点,_3d×2) { 2 -> x =点-> X observe_mat [ 0 ] [ 0 ] +点-> Y * observe_mat [ 1 ] [ 0 ] +
17、 点-> Z * observe_mat [ 2 ] [ 0 ] + observe_mat [ 3 ] [ 0 ]; 2 -> Y =点-> X observe_mat [ 0 ] [ 1 ] +点-> Y * observe_mat [ 1 ] [ 1 ] + 点-> Z * observe_mat [ 2 ] [ 1 ] + observe_mat [ 3 ] [ 1 ]; 2 -> Z =点-> X observe_mat [ 0 ] [ 2 ] +点-> Y * observe_mat [ 1 ] [ 2 ] + 点-> Z * observe_mat
18、[ 2 ] [ 2 ] + observe_mat [ 3 ] [ 2 ]; } / /把三维坐标投影为二维坐标 无效_3dto_2d(_3d * _3dpoint,_2d * _2dpoint) { _2dpoint -> x =宽/ 2 + F * _3dpoint -> X / _3dpoint -> Z; _2dpoint -> Y =高/ F * _3dpoint -> Y / _3dpoint -> Z; } / /球体绕Z轴转动后的坐标变换 无效z_round(地球的球体,定义角度) {浮动z [ 4 ] 4; i
19、nt,j; to_emat(Z); Z [ 0 ] [ 0 ],因为[ get_angle(角)]; Z [ 0 ] [ 1 ] [ get_angle =罪(角)]; z [ 1 ] 0 [ z ] 0 [ 1 ]; z [ 1 ] 1 [ z ] 0 [ 0 ]; 对于(i = 0;i < 9;i +) 对于(j=0;j<10;j + +) _3d_mult_mat(环球-> G [J],Z); } / /球体绕Y轴转动后的坐标变换 无效y_round(地球的球体,定义角度) {浮Y [ 4 ] 4; int,j
20、; to_emat(Y); Y [ 0 ] [ 0 ],因为[ get_angle(角)]; Y [ 2 ] [ 0 ] [ get_angle =罪(角)]; y [ 0 ] 2 [ y ] 2 [ 0 ]; y [ 2 ] 2 [ y ] 0 [ 0 ]; 对于(i = 0;i < 9;i +) 对于(j=0;j<10;j + +) _3d_mult_mat(环球-> G [J],Y); } / /球体绕X轴转动后的坐标变换 无效x_round(地球的球体,定义角度) {浮动x [ 4 ] [ 4 ]; int,
21、j; to_emat(X); x [ 1 ] [ 1 ],因为[ get_angle(角)]; x [ 1 ] [ 2 ] [ get_angle =罪(角)]; x [ 2 ] [ 1 ] = x [ 1 ] 2; x [ 2 ] [ 2 ] = x [ 1 ] 1; 对于(i = 0;i < 9;i +) 对于(j=0;j<10;j + +) _3d_mult_mat(环球-> G [J],x); } / /初始化图形模式 无效init_gph() {检测; 这句话的意思是(与GD,和通用,“D: \ turbo
22、c3”); 设置填充模式(solid_fill,黑色); 酒吧(0,0640480); } / /开辟一个用来存放球体数据的空间,并返回头地址 地球create_globe() {全球*; int,j; P =(地球)malloc(sizeglobe); 对于(i = 0;i < 9;i +) 对于(j=0;j<10;j + +) { p>G [ J ] =(_3d *)malloc(size3d); P >温度[ J ] =(_2d *)malloc(size2d); } P >中心=(_3d *)mallo
23、c(size3d); P > round_center =(_3d *)malloc(size3d); 返回p; } / /把一个角化为0-360的角,要求是它的三角函数值不变 国际get_angle(int角) {角%=360; 如果(角度< 0) 角度= 360 +角; 回复角; } / /给一个三维坐标赋值 _3d * get_3dpoint(浮x0,浮Y0,浮Z0) { _3d * P; P =(_3d *)malloc(size3d); P—> x=x0; P > y = y0; P
24、 > z = Z0; 返回p; } / /给一个轴向量赋值 轴* get_axle(int int QX,QY,int QZ) {轴*; P =(轴*)malloc(sizeaxle); P > X = QX; Angley = QY P >; P > anglez = QZ; 返回p; } / /从世界坐标原点平移球体到指定点(球体初始化时用) 无效place_globe(地球仪) {浮tempf [ 4 ] [ 4 ]; int,j; to_emat(tempf); tempf [ 3 ]
25、 [ 0 ] =(环球->中心)-> X; tempf [ 3 ] [ 1 ] =(环球->中心)-> Y; tempf [ 3 ] [ 2 ] =(环球->中心)-> Z; 对于(i = 0;i < 9;i +) 对于(j=0;j<10;j + +) _3d_mult_mat(环球-> G [J],tempf); } / /球体初始化 无效init_globe(地球的球体,半径,_3d *中心,_3d * rnd_center) { int i,j; / /截止=(地球)malloc(sizeglobe); “全球”-“R = R”; 对于(i = 4;i < = 4;i + +) 对于(j = 0;j=9;j + +) {(环球-> G [我+ 4 ] [ J ])-> x = R *因为[ get_angle(我×18)]×COS [ get_angle(J×36)]; (环球-> G [我+ 4 ] [ J ])-> Y = R *因为[ get_angle(我×18)]×罪[ get_angle(J×36)]; (环球-> G [我+ 4 ] [ J ])-> Z = R *罪[ get_angle(我18)];
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。