扫描线算法实现

来源:互联网 发布: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
原创粉丝点击