扫描线填充.zip

  • mingyi-y
    了解作者
  • C/C++
    开发工具
  • 1KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 0
    下载次数
  • 2020-06-17 18:34
    上传日期
编译环境:vs opengl 实现一个六边形的扫描线填充
扫描线填充.zip
  • 扫描线填充.cpp
    3.7KB
内容介绍
#include<iostream> #include<gl/glut.h> #include<algorithm rel='nofollow' onclick='return false;'> #include<vector> #include<stack> #include<queue> using namespace std; int maxn = 9999; struct point{ float x, y; point(){} point(int xx, int yy) :x(xx), y(yy) {} }; vector<point> vertice; typedef struct XET{ float x; float dx; float ymax; XET* next; }AET, NET;//AET 活性边表; NET新边表 void draw_a_point(int x, int y){ glBegin(GL_POINTS); glColor3f(1, 0, 0); glVertex2f(x, y); glEnd(); glFlush(); } void PolyScan(){ vertice.push_back(point(200, 200)); vertice.push_back(point(300, 200)); vertice.push_back(point(350, 350)); vertice.push_back(point(250, 450)); vertice.push_back(point(150, 400)); vertice.push_back(point(100, 300)); vertice.push_back(point(200, 200)); //得到最高点的y坐标 int Max_Y = 0; for (int i = 0; i < vertice.size(); i++) if (vertice[i].y > Max_Y) Max_Y = vertice[i].y; //初始化AET表 AET* pAET = new AET; pAET->next = NULL; //初始化NET表 NET* pNET[800]; for (int i = 0; i <= Max_Y; i++){ pNET[i] = new NET; pNET[i]->next = NULL;; } //扫描并且建立NET表 int len = vertice.size(); for (int i = 0; i <= Max_Y; i++){ for (int j = 0; j < len; j++){ if (i == vertice[j].y){ //如果一个点和前一个点有一条边相连,则该点和后面一个点也相连 if (vertice[(j - 1 + len) % len].y > vertice[j].y){ NET* p = new NET; p->x = vertice[j].x; p->ymax = vertice[(j - 1 + len) % len].y; float DX = vertice[(j - 1 + len) % len].x - vertice[j].x; float DY = vertice[(j - 1 + len) % len].y - vertice[j].y; p->dx = DX / DY; p->next = pNET[i]->next; pNET[i]->next = p; } if (vertice[(j + 1) % len].y > vertice[j].y){ NET* p = new NET; p->x = vertice[j].x; p->ymax = vertice[(j + 1) % len].y; float DX = vertice[(j + 1) % len].x - vertice[j].x; float DY = vertice[(j + 1) % len].y - vertice[j].y; p->dx = DX / DY;//dx为直线斜率的倒数 p->next = pNET[i]->next; pNET[i]->next = p; } } } } //建立并且更新活性边表AET for (int i = 0; i <= Max_Y; i++){ //计算新的交点 更新AET NET* p = pAET->next; while (p){ p->x = p->x + p->dx; p = p->next; } //排序 AET* tq = pAET; p = pAET->next; tq->next = NULL; while (p != NULL){ while (tq->next != NULL && tq->next->x <= p->x) tq = tq->next; //把这一段小的整体向前移动 NET* t = p->next; p->next = tq->next; tq->next = p; p = t; tq = pAET; } AET* q = pAET; p = q->next; while (p){ if (p->ymax == i){ q->next = p->next; delete p; p = q->next; } else{ q = q->next; p = q->next; } } //将NET中的新点用插入法插入AET,按x递增的顺序排列 p = pNET[i]->next; q = pAET; while (p){ while (q->next != NULL && p->x >= q->next->x) q = q->next; NET* t = p->next; p->next = q->next; q->next = p; p = t; q = pAET; } //配对后填充颜色 p = pAET->next; while (p != NULL && p->next != NULL) { for (float j = p->x; j <= p->next->x; j++){ draw_a_point(j, i); } p = p->next->next;//考虑端点情况 } } glFlush(); } void display(){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0, 0.4, 0.2); glPointSize(1); glBegin(GL_POINTS); PolyScan(); glEnd(); glFlush(); } int main(int argc, char* argv[]){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(100, 50); glutInitWindowSize(800, 500); glutCreateWindow("扫描线填充"); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0, 800, 0, 500); glClearColor(1, 1, 1, 1); glClear(GL_COLOR_BUFFER_BIT); glutDisplayFunc(&display); glutMainLoop(); return 0; }
评论
    相关推荐
    • 扫描线填充多边形
      通过扫描线实现多边形区域填充的算法实现,代码是基于C++和OpenGL
    • 多边形扫描线填充(有序边算法实现)
      编写C++MFC程序,要求在MFC的视图中利用鼠标画多边形,并按要求利用横线或竖线进行填充。利用对话框控制线的数量或密度,以及横线或竖线,并可以重复画线填充
    • 扫描线填充算法的OpenGL实现
      基于AEL(活化边表)的扫描线填充算法的OpenGL实现。该算法包含一个基于GLUT的事件捕获框架用于绘制多边形。
    • 扫描线填充算法的OpenGL实现
      基于AEL(活化边表)的扫描线填充算法的OpenGL实现。该算法包含一个基于GLUT的事件捕获框架用于绘制多边形。
    • vc2005下用opengl实现扫描线填充算法
      本程序是在vc2005环境下用opengl实现的扫描线填充方法,不过仅能应用于多边形填充。用户可通过橡皮筋绘图绘制多边形。
    • OPENGL扫描线填充算法
      完整的OPENGL扫描线算法,基于VS2017开发。文件已经打好,自己找个路径放就行
    • 多边形填充扫描线算法
      vs2008下 opengl实现,多边形扫描线填充算法。 用到glut库 鼠标左右键实现选点和填充
    • 扫描线填充算法的OpenGL实现
      基于AEL(活化边表)的扫描线填充算法的OpenGL实现。该算法包含一个基于GLUT的事件捕获框架用于绘制多边形。
    • 扫描填充.zip
      c++实现扫描线填充算法,实现逐行扫描并且填充区域内容
    • codesforimageprocessing.rar
      实现简单图像处理,包括256色转灰度图、Hough变换、Walsh变换、中值滤波、二值化变换、亮度增减、傅立叶变换、反色、取对数、取指数、图像平移、图像旋转、图像细化、图像缩放、图像镜像、均值滤波、对比度拉伸、拉普拉斯锐化(边缘检测)、方块编码、梯度锐化、灰度均衡、直方图均衡、离散余弦变换、维纳滤波处理、逆滤波处理、阈值变换、高斯平滑。