一个简单的三维程式(C语言)

2008-02-23 05:25:47来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

/*这是个简单的三维引擎程式,模仿三个天体的运动,一个行星绕轴自转,两个卫星分别绕行星的
经线和纬线做公转。(在turboc3.0下编译成功)*/

#include<stdio.h>
#include<dos.h>
#include<conio.h>
#include<graphics.h>
#include<stdlib.h>
#include<alloc.h>
#include<time.h>
#include<bios.h>
#include<string.h>
#include<math.h>
#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 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
{//纬度圈由赤道加上南北半球的各四个纬度圈共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 Sin[360],Cos[360]; //存放三角函数值的两个数组,能够减少大量的浮点运算,以提高效率
size_t Size2D,Size3D,Sizeaxle,Sizeglobe; //各结构体的尺寸
_3D *Observe; //观察者所在的位置坐标
Globe *Moon1,*Moon2,*Earth; //卫星1,卫星2,地球 三个球体
int Zangle=5; //转动角速度

//建立三角函数表
void create_table()
{int i;
for(i=0;i<360;i )
{Sin[i]=sin(i*PAI/180);
Cos[i]=cos(i*PAI/180);
}
}

//初始化观察者位置
void init_observe()
{Observe=(_3D *)malloc(Size3D);
Observe->x=160;
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[i][j]=0;
for(i=0;i<4;i )
mat[i][i]=1;
}

//把三维坐标点1的值赋给点2
void _3D_cpy(_3D *point1,_3D *point2)
{point1->x=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);
Size3D=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_Mat[i][j]=0;
World_Mat[i][j]=0;
}
for(i=0;i<4;i )
{Observe_Mat[i][i]=1;
World_Mat[i][i]=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[i][j]=mat1[i][0]*mat2[0][j] mat1[i][1]*mat2[1][j] mat1[i][2]*mat2[2][j] mat1[i][3]*mat2[3][j];
}

//复制矩阵2到矩阵1
void mat_cpy(float mat1[4][4],float mat2[4][4])
{int i,j;
for(i=0;i<=3;i )
for(j=0;j<=3;j )
mat1[i][j]=mat2[i][j];
}

//根据观察者位置建立观察坐标矩阵
void create_obMat()
{float _2Dr,_3Dr;
_2Dr=pow((pow(Observe->x,2) pow(Observe->y,2)),0.5);
_3Dr=pow((pow(Observe->x,2) pow(Observe->y,2) pow(Observe->z,2)),0.5);
Observe_Mat[0][0]=Observe->y/_2Dr*-1;
Observe_Mat[0][1]=Observe->x*Observe->z/_2Dr/_3Dr*-1;
Observe_Mat[0][2]=Observe->x/_3Dr*-1;
Observe_Mat[1][0]=Observe->x/_2Dr;
Observe_Mat[1][1]=Observe->y*Observe->z/_2Dr/_3Dr*-1;
Observe_Mat[1][2]=Observe->y/_3Dr*-1;
Observe_Mat[2][1]=_2Dr/_3Dr;
Observe_Mat[2][2]=Observe->z/_3Dr*-1;
Observe_Mat[3][2]=_3Dr;
Observe_Mat[3][3]=1;
}

//三维坐标点对指定矩阵变换以得到新的三维坐标
void _3D_mult_mat(_3D *Source,float mat[4][4])
{_3D *temp;
temp=(_3D *)malloc(Size3D);
temp->x=Source->x*mat[0][0] Source->y*mat[1][0] Source->z*mat[2][0] mat[3][0];
temp->y=Source->x*mat[0][1] Source->y*mat[1][1] Source->z*mat[2][1] mat[3][1];
temp->z=Source->x*mat[0][2] Source->y*mat[1][2] Source->z*mat[2][2] mat[3][2];
_3D_cpy(Source,temp);
}

//把三维坐标点从世界坐标变换成观察坐标
void world_to_ob(_3D *point1,_3D *point2)
{point2->x=point1->x*Observe_Mat[0][0] point1->y*Observe_Mat[1][0]
point1->z*Observe_Mat[2][0] Observe_Mat[3][0];
point2->y=point1->x*Observe_Mat[0][1] point1->y*Observe_Mat[1][1]
point1->z*Observe_Mat[2][1] Observe_Mat[3][1];
point2->z=point1->x*Observe_Mat[0][2] point1->y*Observe_Mat[1][2]
point1->z*Observe_Mat[2][2] Observe_Mat[3][2];
}

//把三维坐标投影为二维坐标
void _3Dto_2D(_3D *_3Dpoint,_2D *_2Dpoint)

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: C 继承性应用实例—日期和时间

下一篇: C语言中的三大定律