设计动物角色,代码如下:
#include<GL/glut.h>
#include<stdio.h>
#include<math.h>
#define PI 3.1416
//矩形绘制
void glRect(int leftX,int leftY,int rightX,int rightY,int MODE)
{
glBegin(MODE);
glVertex2d(leftX,leftY);
glVertex2d(rightX,leftY);
glVertex2d(rightX,rightY);
glVertex2d(leftX,rightY);
glEnd();
}
//画弧线
void glArc(double x,double y,double start_angle,double end_angle,double radius,int MODE){
glBegin(MODE);
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,int MODE)
{
//画全圆
glArc(x,y,0,2*PI,radius,MODE);
}
//画三角形
void glTri(int x1,int y1,int x2,int y2,int x3,int y3,int MODE){
glBegin(MODE);
glVertex2d(x1,y1);
glVertex2d(x2,y2);
glVertex2d(x3,y3);
glEnd();
}
//画四边形
void glFour(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int MODE){
glBegin(MODE);
glVertex2d(x1,y1);
glVertex2d(x2,y2);
glVertex2d(x3,y3);
glVertex2d(x4,y4);
glEnd();
}
//画五边形v
oid glFive(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int x5,int y5,int MODE){
glBegin(MODE);
glVertex2d(x1,y1);
glVertex2d(x2,y2);
glVertex2d(x3,y3);
glVertex2d(x4,y4);
glVertex2d(x5,y5);
glEnd();
}
//画线,传入两点坐标
void glLine(int x1,int y1,int x2,int y2,int MODE){
//画封闭线
glBegin(MODE);
glVertex2d(x1,y1);
glVertex2d(x2,y2);
glEnd();
}
//绘制圆角矩形
void glRoundRec(int centerX,int centerY,int width,int height,float cirR,int MODE){
//二分之PI,一个象限的角度
float PI_HALF = PI/2;
//划分程度,值越大画得越精细
float divide=20.0;
//圆角矩形的坐标
float tx,ty;
//画封闭曲线
glColor3f(1.0,0.0,0.0);
//画点大小
glBegin(MODE);
//四个象限不同的操作符
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();
}
//颜色定义
int border[3]={255,255,255};
int yellow[3]={253,193,79};
int blue[3]={111,130,144};
int black[3]={33,31,32};
int orange[3]={209,82,29};
int brown[3]={113,53,25};
int mi[3]={195,147,85};
int qianyellow[3]={182,121,54};
int shadow[3]={145,100,45};
//填充
void glFillCircle(double x, double y, double radius,int color[3]){
glColor3ub(color[0],color[1],color[2]);
glCircle(x,y,radius,GL_POLYGON);
}
void glFillTri(int x1,int y1,int x2,int y2,int x3,int y3,int color[3]){
glColor3ub(color[0],color[1],color[2]);
glTri(x1,y1,x2,y2,x3,y3,GL_POLYGON);
}
void glFillFour(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int color[3]){
glColor3ub(color[0],color[1],color[2]);
glFour(x1,y1,x2,y2,x3,y3,x4,y4,GL_POLYGON);
}
void glFillFive(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int x5,int y5,int color[3]){
glColor3ub(color[0],color[1],color[2]);
glFive(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,GL_POLYGON);
}
void glFillRect(int leftX,int leftY,int rightX,int rightY,int color[3]){
glColor3ub(color[0],color[1],color[2]);
glRect(leftX,leftY,rightX,rightY,GL_POLYGON);
}
void glFillArc(double x,double y,double start_angle,double end_angle,double radius,int color[3]){
glColor3ub(color[0],color[1],color[2]);
glArc(x,y,start_angle,end_angle,radius,GL_POLYGON);
}
void display(void){
glClearColor(1.0f,1.0f,1.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);
//背景
glBegin(GL_TRIANGLES);
glColor3f(1,1,1);
glVertex2f(400,70);
glColor3f(0,0.5,1);
glVertex2f(0,400);
glColor3f(1,1,1);
glVertex2f(0,70);
glEnd();
glBegin(GL_TRIANGLES);
glColor3f(0,0.5,1);
glVertex2f(0,400);
glColor3f(0,0.5,1);
glVertex2f(400,400);
glColor3f(1,1,1);
glVertex2f(400,70);
glEnd();
//山草地
glFillTri(-50,60,50,140,120,60,shan);
glFillTri(70,60,120,220,170,60,shan);
glFillTri(100,60,200,180,300,60,shan);
glFillTri(420,60,350,140,280,60,shan);
glFillTri(360,60,280,200,200,60,shan);
glBegin(GL_TRIANGLES);
glColor3f(0.45,0.52,0.64);
glVertex2f(0,90);
glColor3f(0.24,0.76,0.48);
glVertex2f(0,0);
glColor3f(0.24,0.76,0.48);
glVertex2f(400,0);
glEnd();
glBegin(GL_TRIANGLES);
glColor3f(0.45,0.52,0.64);
glVertex2f(0,90);
glColor3f(0.45,0.52,0.64);
glVertex2f(400,90);
glColor3f(0.24,0.76,0.48);
glVertex2f(400,0);
glEnd();
//耳朵
glFillFour(130.6,326.1,122.6,261.7,157.8,194.8,182.4,235.1,blue);
glFillFour(269.4,326.1,277.4,261.7,242.2,194.8,217.6,235.1,blue);
glFillFour(130.6,326.1,122.6,261.7,152.5,202,149.5,282.4,yellow);
glFillFour(269.4,326.1,277.4,261.7,247.5,202,250.5,282.4,yellow);
glFillTri(177.6,352.8,177.6,227.5,199.6,227.5,black);
glFillTri(222.4,352.8,222.4,227.5,200.4,227.5,black);
//脖子
glFillRect(156.6,140.3,243.4,0,qianyellow);
//头
glFillFive(200,233.7,164.7,244.3,141,158,179.9,46.9,200,36.1,orange);
glFillFive(200,233.7,235.3,244.3,259,158,220.1,46.9,200,36.1,orange);
glFillTri(200,218.5,170.2,126.5,229.8,126.5,brown); g
lFillTri(200,165.6,176,58.4,224,58.4,brown);
glFillFour(164.5,208.8,152,198,141,158,188.6,176,mi);
glFillFour(141,158,175,58.4,198,141,188.6,176,mi);
glFillFour(235.5,208.8,248,198,259,158,211.4,176,mi);
glFillFour(259,158,225,58.4,202,141,211.4,176,mi);
//眼睛
glFillFour(148.2,187.7,167,176,163.1,158,141,158,black);
glFillTri(130.9,173.4,145.8,187.2,145.8,181.7,black);
glFillCircle(146.7,184,3,black);
glFillFour(251.9,187.7,233,176,236.9,158,259,158,black);
glFillTri(269.1,173.4,254.2,187.2,254.2,181.7,black);
glFillCircle(253,184,3,black);
//嘴
glFillTri(200,72,175.5,59.6,225,59.6,black);
glFillFive(175.5,59.6,225,59.6,219.5,46.7,200,36.1,179.5,46.7,black);
//阴影
glFillTri(181.5,105,167,176,163.1,158,shadow);
glFillTri(218.5,105,233,176,236.9,158,shadow);
glFlush();
}
void Reshape(int w,int h){
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);
}
int main(int argc,char *argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);
glutInitWindowPosition(100,100);
glutInitWindowSize(800,400);
glutCreateWindow("Hello World");
glutDisplayFunc(display);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
}
效果图: