微信客户端网站建设,南通网站制作维护,seo外包方法,网络搭建安全分析作者#xff1a;非妃是公主 专栏#xff1a;《计算机图形学》 博客地址#xff1a;https://blog.csdn.net/myf_666 个性签#xff1a;顺境不惰#xff0c;逆境不馁#xff0c;以心制境#xff0c;万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、二维观察基本… 作者非妃是公主 专栏《计算机图形学》 博客地址https://blog.csdn.net/myf_666 个性签顺境不惰逆境不馁以心制境万事可成。——曾国藩 文章目录专栏推荐专栏系列文章序一、二维观察基本流程二、算法原理三、OpenGL代码实现四、效果展示the end…… 专栏推荐
专栏名称专栏地址软件工程专栏——软件工程计算机图形学 专栏——计算机图形学 操作系统专栏——操作系统软件测试专栏——软件测试机器学习专栏——机器学习数据库专栏——数据库算法专栏——算法
专栏系列文章
文章名称文章地址直线生成算法(DDA算法)计算机图形学01——DDA算法中点BH算法绘制直线计算机图形学02——中点BH算法改进的中点BH算法计算机图形学03——改进的中点BH算法中点Bresenham画椭圆计算机图形学04——中点BH绘制椭圆中点BH算法绘制任意斜率直线计算机图形学05——中点BH算法绘制任意斜率的直线中点Bresenham画圆计算机图形学06——中点BH算法画圆有效边表法的多边形扫描转换计算机图形学07——有效边表法绘制填充多边形中点BH算法绘制抛物线 100xy2100x y^2100xy2计算机图形学08——中点BH绘制抛物线二维观察之点的裁剪计算机图形学09——二维观察之点裁剪二维观察之线的裁剪计算机图形学10——二维观察之线裁剪二维观察之多边形的裁剪计算机图形学11——二维观察之多边形裁剪二维图形的几何变换计算机图形学12——二维图形几何变换三维图形的几何变换计算机图形学13——三维图形几何变换三维图形的投影变换计算机图形学14——三维图形投影变换
序
计算机图形学英语computer graphics缩写为CG是研究计算机在硬件和软件的帮助下创建计算机图形的科学学科是计算机科学的一个分支领域主要关注数字合成与操作视觉的图形内容。虽然这个词通常被认为是指三维图形事实上同时包括了二维图形以及影像处理。 一、二维观察基本流程 在二维观察中需要在观察坐标系下对窗口进行裁剪即只保留窗口内的那部分图形去掉窗口外的图形。 二、算法原理 其中
wxl表示显示窗口左边界(window x left)。wxr表示显示窗口右边界(window x right)。wyb表示显示窗口左边界(window y below)。wyt表示显示窗口左边界(window y top)。 三、OpenGL代码实现
算法代码如下
/// summary
/// 点的裁剪
/// /summary
/// param namepnts储存点的数组/param
/// param namewxl窗口的左边缘/param
/// param namewxr窗口的右边缘/param
/// param namewyb窗口的下边缘/param
/// param namewyt窗口的上边缘/param
/// returns在窗口内的点的数组/returns
vectorVERTEX cropPoint(vectorVERTEX pnts, int wxl, int wxr, int wyb, int wyt) {vectorVERTEX res;for (int i 0; i pnts.size(); i) {VERTEX tmp;tmp.x pnts[i].x;tmp.y pnts[i].y;if (tmp.x wxl tmp.xwxr tmp.ywyb tmp.y wyt) {res.push_back(tmp);}}return res;
}测试代码及 OpenGL 代码框架如下
void drawPoints1() {vectorVERTEX res _polygon;glColor3f(1.0f, 0.0f, 0.0f); // 设置颜色为红色进行填充glPointSize(5);glBegin(GL_POINTS);for (int i 0; i res.size(); i) {glVertex2i(res[i].x, res[i].y);}glEnd();
}void drawPoints2() {vectorVERTEX res cropPoint(_polygon, 20, 200, 30, 200); glColor3f(1.0f, 0.0f, 0.0f); // 设置颜色为红色进行填充glPointSize(5);glBegin(GL_POINTS);for (int i 0; i res.size(); i) {glVertex2i(res[i].x, res[i].y);}glEnd();
}// 显示图形
void Display(void) {glClear(GL_COLOR_BUFFER_BIT); //用当前背景色填充窗口glColor3f(0.0f, 0.0f, 0.0f);// 此处需增加调用基本图形生成函数Bhline(20, 30, 200, 30);Bhline(200, 30, 200, 200);Bhline(200, 200, 20, 200);Bhline(20, 200, 20, 30);drawPoints1();glFlush();
}// 第2个窗口中的图形绘制
void Displayw(void)
{glClear(GL_COLOR_BUFFER_BIT);glColor3f(0.0f, 0.0f, 0.0f);// 此处进行裁剪Bhline(20, 30, 200, 30);Bhline(200, 30, 200, 200);Bhline(200, 200, 20, 200);Bhline(20, 200, 20, 30);drawPoints2();glFlush();
}// 键盘响应函数
void KeyEvent(unsigned char key, int x, int y) {switch (key) {case r:{glutPostRedisplay();}break;default: break;}
}int main(int argc, char* argv[]) {VERTEX p[7] { {210, 160}, {90, 240}, {30, 140}, {90, 20}, {180, 100}, {240, 20}, {360, 180} };for (int i 0; i 7; i) _polygon.push_back(p[i]);glutInit(argc, argv); // glut初始化glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 初始化窗口的显示模式glutInitWindowSize(winWidth, winHeight); // 设置窗口的尺寸glutInitWindowPosition(0, 200); // 设置窗口的位置glutCreateWindow(原始图形); // 创建一个窗口glutDisplayFunc(Display); // 设置当前窗口的显示回调函数glutReshapeFunc(ChangeSize); // 指定窗口大小变化响应函数glutKeyboardFunc(KeyEvent); // 指定键盘响应函数Initial(); // 完成窗口初始化glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(winWidth, winHeight); // 设置窗口的尺寸glutInitWindowPosition(50 winWidth, 200); // 设置窗口的位置glutCreateWindow(裁剪后的图形);glutDisplayFunc(Displayw); // 设置当前窗口的显示回调函数glutReshapeFunc(ChangeSize); // 指定窗口大小变化响应函数Initial();glutMainLoop(); //启动主GLUT事件处理循环return 0;
}四、效果展示
从图中可以看出经过裁剪只剩下了方框内的点。 the end……
有效边表法的多边形扫描转换算法到这里就要结束啦~~到此既是缘分欢迎您的点赞、评论、收藏关注我不迷路我们下期再见 我是Cherries一位计算机科班在校大学生写博客用来记录自己平时的所思所想 内容繁杂又才疏学浅难免存在错误欢迎各位大佬的批评指正 我们相互交流共同进步 注本文由非妃是公主发布于https://blog.csdn.net/myf_666转载请务必标明原文链接https://blog.csdn.net/myf_666/article/details/128508578