2D太阳系绘制
试验六 2D太阳系绘制 一、试验目的 1、驾驭2D太阳系绘制方法 2、驾驭矩阵堆栈流程 3、进一步驾驭复合2D图形变换 二、试验环境 硬件要求: PC机,主流配置,最好为独立显卡,显存512M以上。 软件环境: 操作系统:Windows XP。 语言开发工具:Microsoft Visual studio 2021,Visual C++。 三、试验内容与要求 要求: 试验课上老师要求的效果截图、及其相应代码 拷贝到试验报告文档里。 WORD文档命名方式:学号姓名-试验序号-试验名称。 内容: 1、 太阳半径Rs,地球半径Re,月球半径Rm,每个球都会自转,地球绕太阳公转,月球绕地球公转。 2、 根本框架程序 3、设计世界坐标系,设计裁剪窗口大小,编写2D太阳系代码。 4、效果截图 图6-1 2D太阳系效果 5、分别在太阳、地球、月球位置添加中文字体“太阳〞、“地球〞、“月球〞 6、在修改的代码上加上自己的一些点缀修饰性图形 四、 参考函数: 1、 void glPushMatrix(void) 功能:把当前操作矩阵压入矩阵堆栈,记住当前所在的位置。 复制活动栈顶的当前矩阵并将其存入其次个栈位置 2、void glPopMatrix(void) 功能:当前操作矩阵出栈,它下面的矩阵作为当前矩阵,返回到以前所在的位置。 破坏栈顶矩阵,栈的其次个矩阵成为当前矩阵。假如要弹出栈顶,栈内至少要有2个矩阵,否那么就会出错。 3、中文字体绘制 在程序头部声明所用到的字体函数 void selectFont(int size, int charset, const char* face); //选择字体 void drawCNString(const char* str); //生成中文字体函数 //在绘制局部调用字体函数,写中文字 selectFont(48, GB2312_CHARSET, “楷体_GB2312“); //设置字体楷体24号字 glRasterPos2f(250, 550); //定位首字位置 drawCNString(“Hello,大家好“); //写字“Hello,大家好〞 /************************************************************************/ /* 选择字体函数 */ /************************************************************************/ void selectFont(int size, int charset, const char* face) { HFONT hFont = CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0, charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, face); HFONT hOldFont = (HFONT)SelectObject(wglGetCurrentDC(), hFont); DeleteObject(hOldFont); } /************************************************************************/ /* 生成中文字体函数 */ /************************************************************************/ void drawCNString(const char* str) { int len, i; wchar_t* wstring; HDC hDC = wglGetCurrentDC(); GLuint list = glGenLists(1); // 计算字符的个数 // 假如是双字节字符的〔比方中文字符〕,两个字节才算一个字符 // 否那么一个字节算一个字符 len = 0; for(i=0; str[i]!= \0 ; ++i) { if( IsDBCSLeadByte(str[i]) ) ++i; ++len; } // 将混合字符转化为宽字符 wstring = (wchar_t*)malloc((len+1) * sizeof(wchar_t)); MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstring, len); wstring[len] = L \0 ; // 逐个输出字符 for(i=0; i