详情请见 http://cuiqingcai.com/1597.html   http://cuiqingcai.com/1640.html

#include<windows.h>
#include<iostream>
#include<GL/glut.h>
#include <math.h>
#include<stack>
#define PI 3.1415926
using namespace std;int halfWidth,halfHeight;
GLubyte borderColor[3];struct Point
{int x;int y;
};//画矩形,传入的是左下角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();
}//传入两个颜色的RGB值,比较是否相同,容差为dis
bool sameColor(int r1,int g1,int b1,int r2,int g2,int b2){//容差度int dis = 10;if(abs(r1-r2)<=dis&&abs(g1-g2)<=dis&&abs(b1-b2)<=dis){return true;}else{return false;}
}//画点
void glPoint(int x,int y,int r,int g,int b){glColor3ub (r,g,b);glPointSize(1);glBegin(GL_POINTS);glVertex2i(x,y);glEnd();glFlush();
}//种子填充算法
void zzFill(int startX,int startY,int r,int g,int b){GLubyte iPixel[3];stack<Point> pixelStack;//x,y是给定的种子像素点,rgb就是要填充的颜色的RGB值Point point  = {startX,startY};pixelStack.push(point);int saveX;int xRight,xLeft;int x,y;//如果栈不为空while(!pixelStack.empty()){//获取最顶端的元素Point tempPoint=pixelStack.top();//删除最顶端的元素pixelStack.pop();saveX=tempPoint.x;x=tempPoint.x;y=tempPoint.y;glReadPixels(x+halfWidth,y+halfHeight,1,1,GL_RGB,GL_UNSIGNED_BYTE,&iPixel);//如果没有到达右边界,就填充while(!sameColor(iPixel[0],iPixel[1],iPixel[2],borderColor[0],borderColor[1],borderColor[2])){glPoint(x,y,r,g,b);x=x+1;glReadPixels(x+halfWidth,y+halfHeight,1,1,GL_RGB,GL_UNSIGNED_BYTE,&iPixel);}xRight=x-1;x=saveX-1;glReadPixels(x+halfWidth,y+halfWidth,1,1,GL_RGB,GL_UNSIGNED_BYTE,&iPixel);//如果没有到达左边界,就填充while(!sameColor(iPixel[0],iPixel[1],iPixel[2],borderColor[0],borderColor[1],borderColor[2])){glPoint(x,y,r,g,b);x=x-1;glReadPixels(x+halfWidth,y+halfWidth,1,1,GL_RGB,GL_UNSIGNED_BYTE,&iPixel);}//保存左端点xLeft=x+1;//从右边的点开始x=xRight;//检查上端的扫描线y=y+1;while(x>=xLeft){glReadPixels(x+halfWidth,y+halfWidth,1,1,GL_RGB,GL_UNSIGNED_BYTE,&iPixel);if(!sameColor(iPixel[0],iPixel[1],iPixel[2],borderColor[0],borderColor[1],borderColor[2])&&!sameColor(iPixel[0],iPixel[1],iPixel[2],r,g,b)){//如果上方的点不是边界点,直接压入Point p={x,y};pixelStack.push(p);//压入之后停止循环break;}else{x--;glReadPixels(x+halfWidth,y+halfWidth,1,1,GL_RGB,GL_UNSIGNED_BYTE,&iPixel);}}//检查下端的扫描线y=y-2;//从右边的点开始x=xRight;while(x>=xLeft){glReadPixels(x+halfWidth,y+halfWidth,1,1,GL_RGB,GL_UNSIGNED_BYTE,&iPixel);if(!sameColor(iPixel[0],iPixel[1],iPixel[2],borderColor[0],borderColor[1],borderColor[2])&&!sameColor(iPixel[0],iPixel[1],iPixel[2],r,g,b)){//如果上方的点不是边界点,直接压入Point p={x,y};//压入之后停止循环pixelStack.push(p);break;}else{x--;glReadPixels(x+halfWidth,y+halfWidth,1,1,GL_RGB,GL_UNSIGNED_BYTE,&iPixel);}}}
}//函数用来画图
void display(void)
{//GL_COLOR_BUFFER_BIT表示清除颜色glClear(GL_COLOR_BUFFER_BIT);//设置画线颜色//glColor3f(0.5,0.5,0.5);glColor3ub(100,100,100);borderColor[0]=borderColor[1]=borderColor[2]=100;//画点大小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);//灰色:195,195,195//黄色:255,243,0//红色:237,28,36//深灰色:126,126,126//脖子zzFill(0,70,195,195,195);//头zzFill(-50,110,195,195,195);zzFill(0,93,195,195,195);//肚子zzFill(-50,0,195,195,195);//耳朵zzFill(-80,115,126,126,126);zzFill(80,115,126,126,126);//肚子三角zzFill(-20,-10,255,243,0);//肚子红色圆zzFill(0,0,237,28,36);//zzFill(-50,0,128,255,33);//大臂zzFill(-90,30,126,126,126);zzFill(90,30,126,126,126);//小臂zzFill(-90,-20,126,126,126);zzFill(90,-20,126,126,126);//手zzFill(-75,40,195,195,195);zzFill(75,40,195,195,195);//手zzFill(-95,-47,195,195,195);zzFill(95,-47,195,195,195);//大腿连接处zzFill(-40,-64,195,195,195);zzFill(40,-64,195,195,195);//大腿zzFill(-40,-100,126,126,126);zzFill(40,-100,126,126,126);//脚踝zzFill(-40,-121,195,195,195);zzFill(40,-121,195,195,195);//脚掌zzFill(-40,-130,126,126,126);zzFill(40,-130,126,126,126);system("pause");//保证前面的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<h) {//如果高度大于宽度,则将高度视角扩大,图形显示居中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);halfHeight=halfWidth=200;//创建窗口,同时为之命名glutCreateWindow("OpenGL");//设置窗口清除颜色为白色glClearColor(1.0f,1.0f,1.0f,1.0f);//参数为一个函数,绘图时这个函数就会被调用glutDisplayFunc(&display);//参数为一个函数,当窗口大小改变时会被调用glutReshapeFunc(ChangeSize);//该函数让GLUT框架开始运行,所有设置的回调函数开始工作,直到用户终止程序为止glutMainLoop();//程序返回return 0;
}

计算机图形学:机器人的画法与填充相关推荐

  1. 计算机图形学---DDA直线画法c#实现

    计算机图形学-DDA直线画法c#实现 DDA直线画法,即数值微分法,是计算机图形学中直线段扫描转换的经典算法之一,本篇文章将简单介绍DDA算法,并给出c#实现的代码. 一.DDA直线画法 设直线的斜截 ...

  2. 计算机图形学E4——OpenGL 区域种子填充

    其他计算机图形学实验见 链接 系统递归栈太慢了,用stack或者queue会好一点,本质一样,都是bfs //DFS 系统递归栈//#include<iostream> //#includ ...

  3. 计算机图形学 第4章 多边形填充

    目录 前驱知识 多边形的扫描转换 有效边表填充算法 原理 边界像素处理原则 怎么算交点 有效边 桶表与边表 桶表表示法 边缘填充算法 填充过程 在这里插入图片描述 区域填充算法/种子填充算法 种子填充 ...

  4. 计算机图形学有序边表作业,《计算机图形学》有序边表填充算法.docx

    实验报告 实验目的 1.掌握有序边表算法填充多边形区域; 2.理解多边形填充算法的意义: 3.增强C语言编程能力. 算法原理介绍 根据多边形内部点的连续性知:一条扫描线与多边形的交点中,入点和出点之间 ...

  5. 活性边表算法c语言,《计算机图形学》有序边表填充算法.doc

    PAGE PAGE 8 实 验 报 告 实验目的 掌握有序边表算法填充多边形区域: 理解多边形填充算法的意义: 增强C语言编程能力. 算法原理介绍 根据多边形内部点的连续性知:一条扫描线与多边形的交点 ...

  6. 计算机图形学-五角星的画法

    话不多说直接上实现效果图: 以下是步骤,首先看看如何确定点的坐标. 有以下说明: ① 坐标原点o(0,0)为坐标原点 ② 五角星的长轴为R = |oa|,长度已知 ③ 五角星的短轴为r = |oa1| ...

  7. c语言图形学扫描线填充算法,《计算机图形学》OpenGL实现扫描线填充算法

    顾名思义啊,就是在OpenGL中用扫描填充算法画一个稍微复杂的图形: #include #include #include #include #define COLOR_NEW 1.0,0.0,0.0 ...

  8. GIS地图界面和计算机图形学填充算法

    一 GIS地图界面 GIS程序最常见的界面就是,不同区域被边界隔开,填充为不同的颜色: 如下三个:是超图iServer自带: 京津地区土地利用现状,京津地区人口分布,京津地区地貌分布:用于学习是很好资 ...

  9. 计算机图案填充的两种方法,计算机图形学课件 第9讲 区域填充和字符处理.ppt...

    计算机图形学课件 第9讲 区域填充和字符处理 信息科学与工程学院 1999年7月 5.4.1 多边形的扫描转换 多边形的两种表示方法: 顶点表示:用多边形的顶点序列来刻划多边形.直观.几何意义强.占内 ...

最新文章

  1. 厦大肝癌研究成果登《细胞》顶刊背后:一作中途离世,捐献遗体用于医学研究...
  2. golang http 操作 简介
  3. python从入门到精通怎么样-Python 从入门到精通:一个月就够了
  4. python中异常的处理及断言,包括异常类型、异常捕获、主动跑出异常和断言
  5. bzoj2442codevs4654 单调队列优化dp
  6. java 画砖块,钢笔画入门:教你画砖块
  7. PHP编写命令行脚本和后台运行程序的注意事项
  8. 【钢铁缺陷检测算法】数据探索
  9. MUI全国城市区县级联json转换sql建表
  10. 数据优化——分库分表(三)中间件讲解
  11. 唐太宗灵州受降【会盟】的意义
  12. 分布式主动感知在智能运维中的实践
  13. 1308:【例1.5】高精除
  14. 算法题:岛屿最大面积
  15. 在电脑上怎么做判断题打√或x_电脑基础知识竞赛试题
  16. globk平差输出选项含义
  17. 产业互联网的黑马,Testin云测的变革
  18. 88 Three.js 导入FBX格式骨骼绑定模型
  19. 已解决org.springframework.beans.factory.UnsatisfiedDependencyException org.springframework.beans.factor
  20. 小米4c android版本号,小米4c的手机系统是什么?能升级安卓5.0吗?

热门文章

  1. android Tether 分析
  2. jump game ii
  3. Hacked Exam 14pts 2021Google codejam round1A
  4. amh搭建php网站,AMH6.0发布 (免费版本) – AMH终于可以免费用了。
  5. 韦东山freeRTOS系列教程之【第十章】软件定时器(software timer)
  6. 室内制图如何让您的办公室受益
  7. 问卷星问卷数据怎么快速导入SPSSAU?
  8. 区块链基本概念和名词解释
  9. 温州兰博基尼车主遭绑架案1名嫌犯获死刑-兰博基尼-女车主-绑架
  10. 使用Google学术自动生成标准的参考文献格式(Word版+LaTex版)