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

上传人:xins****2008 文档编号:72891554 上传时间:2022-04-10 格式:DOC 页数:19 大小:43KB
返回 下载 相关 举报
一个简单的三维程序(c语言)(A simple three-dimensional program (C language))_第1页
第1页 / 共19页
一个简单的三维程序(c语言)(A simple three-dimensional program (C language))_第2页
第2页 / 共19页
一个简单的三维程序(c语言)(A simple three-dimensional program (C language))_第3页
第3页 / 共19页
亲,该文档总共19页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
一个简单的三维程序(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 # define pte 27# define f 80 / / 此数表示通常情况下操作者离计算机的距离 (80厘米)# define hight 480 / / 屏幕纵向分辩率# define wide 640 / / 屏幕横向分辨率# define pai 3.1415926 / / 圆周率# define time 0.05 / / 转动间隔时间 (每0.2秒转动5度)typedef struct(float x)float y;_ 2d; / / 二维坐标点typedef struct(float 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个圈/ / 所以用 二维数组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 observe _ 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; / / 转动角速度/ / 建立三角函数表void created _ table ()int i;for (i = 0; i x = 100;observe - y = 0;observe - 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 x = 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 () _ sizesize2d = sizeof (_ 2d);size3d = sizeof (_ 3d).sizeaxle = sizeof (axle).sizeglobe = sizeof (globe);/ / 初始化观察坐标矩阵与世界坐标矩阵 (设定为单位矩阵)void init () _ matint 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 + +)observe _ mat = 1;world _ mat = 1;/ / 矩阵1乘矩阵2得到矩阵3void 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;j4;j+)mat3 J = MAT1 0 * MAT2 0 J + MAT1 1 * MAT2 1 J + 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 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;observe_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 #包括 #包括分配。”#包括时间。”#包括 #包括 #包括数学。”# 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 0 ;温度=来源* * * * 0 1 +源* * * 1 1 +源* 1 2 + MAT 3 1 ;温度= * 0 2 +源* 2 * 1 +源2。 2 2 3 ;_3d_cpy(源、温度);/ /把三维坐标点从世界坐标变换成观察坐标无效world_to_ob(_3d *点,_3d2) 2 - x =点- X observe_mat 0 0 +点- Y * observe_mat 1 0 +点- 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 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;int,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 G J,Z);/ /球体绕Y轴转动后的坐标变换无效y_round(地球的球体,定义角度)浮Y 4 4;int,j;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 G J,Y);/ /球体绕X轴转动后的坐标变换无效x_round(地球的球体,定义角度)浮动x 4 4 ;int,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 G J,x);/ /初始化图形模式无效init_gph()检测;这句话的意思是(与GD,和通用,“D: turboc3”);设置填充模式(solid_fill,黑色);酒吧(0,0640480);/ /开辟一个用来存放球体数据的空间,并返回头地址地球create_globe()全球*;int,j;P =(地球)malloc(sizeglobe);对于(i = 0;i 温度 J =(_2d *)malloc(size2d);P 中心=(_3d *)malloc(size3d);P round_center =(_3d *)malloc(size3d);返回p;/ /把一个角化为0-360的角,要求是它的三角函数值不变国际get_angle(int角)角%360;如果(角度 xx0;P y = y0;P 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 0 =(环球-中心)- X;tempf 3 1 =(环球-中心)- Y;tempf 3 2 =(环球-中心)- Z;对于(i = 0;i G J,tempf);/ /球体初始化无效init_globe(地球的球体,半径,_3d *中心,_3d * rnd_center) int i,j;/ /截止=(地球)malloc(sizeglobe);“全球”-“R = R”;对于(i = 4;i G 我+ 4 J )- x = R *因为 get_angle(我18)COS get_angle(J36);(环球- G 我+ 4 J )- Y = R *因为 get_angle(我18)罪 get_angle(J36);(环球- G 我+ 4 J )- Z = R *罪 get_angle(我18);
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!