计算机图形学之组合图形的绘制(主要是渐变的实现)

设计动物角色,代码如下:

#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;
}

效果图:
在这里插入图片描述

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值