扫描线算法实现
来源:互联网 发布:mac ansible 编辑:程序博客网 时间:2024/06/03 12:52
vs2015环境
#include"stdafx.h"#include "gl/glut.h"#include "windows.h"const int POINTNUM = 5; typedef struct XET{float x;float dx, ymax;XET* next;}AET, NET;struct point{float x;float y;}polypoint[POINTNUM] = { 250,50,550,150,550,400,250,250,100,350 };//polypoint[POINTNUM] = { 250,50,550,150,550,400,250,250,100,350 };//polypoint[POINTNUM] = { 250,50,550,150,550,400,250,250,100,350,100,100,120,30 };//polypoint[POINTNUM] = { 250,50,550,150,550,400};//polypoint[POINTNUM] = { 250,50,550,150,550,400,250,250 };void PolyScan(){//求y最大值int MaxY = 0;int i;for (i = 0; i < POINTNUM; i++) {if (polypoint[i].y > MaxY) {MaxY = polypoint[i].y;}}//初始化NET和AETAET *pAET = new AET;pAET->next = NULL;NET *pNET[1024];for (i = 0; i <= MaxY; i++){pNET[i] = new NET;pNET[i]->next = NULL;}glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0,0.0,1.0); glPointSize(4.0);//点大小glBegin(GL_POINTS);//更新NETfor (i = 0; i <= MaxY; i++){for (int j = 0; j < POINTNUM; j++) {if (polypoint[j].y == i) {if (polypoint[(j - 1 + POINTNUM) % POINTNUM].y>polypoint[j].y){NET *p = new NET;p->x = polypoint[j].x;p->ymax = polypoint[(j - 1 + POINTNUM) % POINTNUM].y;p->dx = (polypoint[(j - 1 + POINTNUM) % POINTNUM].x - polypoint[j].x) / (polypoint[(j - 1 + POINTNUM) % POINTNUM].y - polypoint[j].y);p->next = pNET[i]->next;pNET[i]->next = p;}if (polypoint[(j + 1 + POINTNUM) % POINTNUM].y>polypoint[j].y) {NET *p = new NET;p->x = polypoint[j].x;p->ymax = polypoint[(j + 1 + POINTNUM) % POINTNUM].y;p->dx = (polypoint[(j + 1 + POINTNUM) % POINTNUM].x - polypoint[j].x) / (polypoint[(j + 1 + POINTNUM) % POINTNUM].y - polypoint[j].y);p->next = pNET[i]->next;pNET[i]->next = p;}}}}//更新AET并且排序for (i = 0; i <= MaxY; i++){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){while (tq->next && p->x >= tq->next->x) {tq = tq->next;}NET *s = p->next;p->next = tq->next;tq->next = p;p = s;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;}}p = pNET[i]->next;q = pAET;while (p){while (q->next && p->x >= q->next->x) {q = q->next;}NET *s = p->next;p->next = q->next;q->next = p;p = s;q = pAET;}p = pAET->next;while (p && p->next){for (float j = p->x; j <= p->next->x; j++) {glVertex2i(static_cast<int>(j), i);}p = p->next->next;}}glEnd();glFlush();}void init(void){glClearColor(1.0, 1.0, 1.0, 0.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0, 600.0, 0.0, 450.0);}void main(int argc, char* argv){glutInit(&argc, &argv); //glutInitWindowPosition(50, 100); glutInitWindowSize(960, 540);//窗口大小1920 * 1080 glutCreateWindow("Scan_line"); init(); glutDisplayFunc(PolyScan); glutMainLoop(); }
0 0
- 扫描线算法实现
- OpenGL实现多边形扫描转换的扫描线算法
- c实现的扫描线算法
- 扫描线填充算法,单链表实现
- SCAN扫描算法 java实现
- 二维区域扫描线填充算法的实现
- C语言实现的扫描线种子填充算法
- 扫描线多边形填充算法及其OpenGL实现
- 多边形扫描线算法
- 扫描线算法
- 扫描线填充算法
- 多边形的扫描转换之扫描线算法 c++实现 vc6.0控制台
- Z字形扫描C语言算法实现
- Haskell lesson:实现Graham扫描算法
- Haskell基础课:实现Graham扫描算法
- 扫描线区域填充算法
- 多变形扫描线算法
- 扫描线填充算法类
- web.xml中load-on-startup的作用
- 伸展树:逐层伸展
- 递归更新svn路径的bat脚本
- hibernate双向多对多关联
- Day50:Fail to interview Migu,pass a travel towards XiaMen
- 扫描线算法实现
- hdu 5949 Relative atomic mass 2016ACM/ICPC沈阳赛区现场赛B
- javaee之hibernate之many-to-one
- codeforces305b
- 如何在VS2013中使用caffe接口
- Linux下deb包和rpm包的安装方法
- Java API—— Scanner类
- GORM的基础CRUD
- 遮罩窗口 - 给窗口增加半透明模糊遮罩