1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
| #include #include #define PI 3.1415926//画矩形,传入的是左下角XY坐标和右上角XY坐标void glRect(int leftX,int leftY,int rightX,int rightY){//画封闭曲线 glBegin(GL_LINE_LOOP);//左下角 glVertex2d(leftX,leftY);//右下角 glVertex2d(rightX,leftY);//右上角 glVertex2d(rightX,rightY);//左上角 glVertex2d(leftX,rightY);//结束画线 glEnd(); }//画圆角矩形,传入矩形宽高,角半径,矩形中心点坐标void glRoundRec(int centerX,int centerY,int width,int height,float cirR){//二分之PI,一个象限的角度float PI_HALF = PI/2;//划分程度,值越大画得越精细float divide=20.0;//圆角矩形的坐标float tx,ty; //画封闭曲线 glBegin(GL_LINE_LOOP);//四个象限不同的操作符int opX[4]={1,-1,-1,1};int opY[4]={1,1,-1,-1};//用来计数,从第一象限到第四象限float x=0;//x自增时加的值float part=1/divide;//计算内矩形宽高一半的数值int w=width/2-cirR;int h=height/2-cirR;//循环画线for(x=0;x<4;x+=part){//求出弧度float rad = PI_HALF*x;//计算坐标值 tx=cirR*cos(rad)+opX[(int)x]*w+centerX; ty=cirR*sin(rad)+opY[(int)x]*h+centerY;//传入坐标画线 glVertex2f(tx,ty); }//结束画线 glEnd(); }//画弧线,相对偏移量XY,开始的弧度,结束的弧度,半径void glArc(double x,double y,double start_angle,double end_angle,double radius) { //开始绘制曲线 glBegin(GL_LINE_STRIP);//每次画增加的弧度double delta_angle=PI/180;//画圆弧for (double i=start_angle;i<=end_angle;i+=delta_angle) {//绝对定位加三角函数值double vx=x+radius * cos(i);double vy=y+radius*sin(i); glVertex2d(vx,vy); }//结束绘画 glEnd(); }//画圆void glCircle(double x, double y, double radius) { //画全圆 glArc(x,y,0,2*PI,radius); } //画三角形,传入三个点的坐标void glTri(int x1,int y1,int x2,int y2,int x3,int y3){//画封闭线 glBegin(GL_LINE_LOOP);//一点 glVertex2d(x1,y1);//二点 glVertex2d(x2,y2);//三点 glVertex2d(x3,y3);//结束画线 glEnd(); }//画线,传入两点坐标void glLine(int x1,int y1,int x2,int y2){//画封闭线 glBegin(GL_LINE_STRIP);//一点 glVertex2d(x1,y1);//二点 glVertex2d(x2,y2);//结束画线 glEnd(); }//函数用来画图void display(void) {//GL_COLOR_BUFFER_BIT表示清除颜色 glClear(GL_COLOR_BUFFER_BIT);//设置画线颜色 glColor3f(0.5,0.5,0.5);//画点大小 glPointSize(2);//画圆角矩形,大肚子 glRoundRec(0,0,146,120,15);//画圆,中间小圈 glCircle(0,0,10);//画矩形,脖子 glRect(-25,60,25,76);//画圆角矩形,大脸 glRoundRec(0,113,128,74,10);//两个眼睛 glCircle(-30,111,10); glCircle(30,111,10);//两条天线 glLine(-35,150,-35,173); glLine(35,150,35,173);//圆角矩形,两个耳朵 glRoundRec(81,115,20,34,5); glRoundRec(-81,115,20,34,5);//圆弧,画嘴 glArc(0,133,11*PI/8,13*PI/8,45);//画三角,肚子里的三角 glTri(-30,-15,30,-15,0,28);//画矩形,胳膊连接处 glRect(-81,43,-73,25); glRect(81,43,73,25);//画矩形,上臂 glRect(-108,45,-81,0); glRect(108,45,81,0);//画矩形,中臂 glRect(-101,0,-88,-4); glRect(101,0,88,-4);//画矩形,下臂 glRect(-108,-4,-81,-37); glRect(108,-4,81,-37);//画圆形,手掌 glCircle(-95,-47,10); glCircle(95,-47,10);//画腿连接处 glRect(-41,-62,-21,-66); glRect(41,-62,21,-66);//画圆角矩形,大长腿 glRoundRec(-32,-92,38,52,10); glRoundRec(32,-92,38,52,10);//画矩形,脚踝 glRect(-41,-125,-21,-117); glRect(41,-125,21,-117);//画矩形,大脚掌 glRect(-59,-125,-8,-137); glRect(59,-125,8,-137);//保证前面的OpenGL命令立即执行,而不是让它们在缓冲区中等待 glFlush(); }//窗口大小变化时调用的函数void ChangeSize(GLsizei w,GLsizei h) { //避免高度为0if(h==0) { h=1; } //定义视口大小,宽高一致 glViewport(0,0,w,h);int half = 200;//重置坐标系统,使投影变换复位 glMatrixMode(GL_PROJECTION); //将当前的用户坐标系的原点移到了屏幕中心 glLoadIdentity(); //定义正交视域体 if(w//如果高度大于宽度,则将高度视角扩大,图形显示居中 glOrtho(-half,half,-half*h/w,half*h/w,-half,half); } else {//如果宽度大于高度,则将宽度视角扩大,图形显示居中 glOrtho(-half*w/h,half*w/h,-half,half,-half,half); } }//程序入口int main(int argc, char *argv[]){//对GLUT进行初始化,并处理所有的命令行参数 glutInit(&argc, argv);//指定RGB颜色模式和单缓冲窗口 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);//定义窗口的位置 glutInitWindowPosition(100, 100);//定义窗口的大小 glutInitWindowSize(400, 400);//创建窗口,同时为之命名 glutCreateWindow("OpenGL");//设置窗口清除颜色为白色 glClearColor(1.0f,1.0f,1.0f,1.0f);//参数为一个函数,绘图时这个函数就会被调用 glutDisplayFunc(&display);//参数为一个函数,当窗口大小改变时会被调用 glutReshapeFunc(ChangeSize); //该函数让GLUT框架开始运行,所有设置的回调函数开始工作,直到用户终止程序为止 glutMainLoop();//程序返回return 0; }
|