1、多边形的扫描转换算法
2、掌握相关算法的原理及实现
3、实现算法代码,能处理任意凸多边形;
能正确处理特殊情形:交点取整、边界像素取舍等;
#include三、运行截图: 1、可处理凸多边形的情况——梯形 2、可处理凹多边形的情况——五角星 四、设置原点#include #include using namespace std; int num; //顶点个数 struct vertex { float ver_x; float ver_y; }; //链表的实现 typedef struct XET { float x; float dx, ymax; XET* next; }AET, NET; //结构体对于某一个点的实现 struct point { float x; float y; }; vertex* ver; void inputPoint() { cout << "请输入多边形顶点个数: "; cin >> num; ver = (vertex*)malloc(sizeof(vertex) * num);//输入顶点以(x,y)格式 cout << " =======按顺序输入每个顶点的x,y值,中间以空格隔开!=========" << endl; cout << " =======每输入完一个顶点,回车进入下一个顶点的输入!========" << endl; for (int i = 0; i < num; i++) { cout << "请输入第"<> ver[i].ver_x >> ver[i].ver_y; } } void Polygon() { int MaxY = 0; int i; for (i = 0; i < num; i++) { if (ver[i].ver_y > MaxY) MaxY = ver[i].ver_y; } //选出最大的顶点所对应的y值 AET* 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(1, 0, 0); //红色 glBegin(GL_POINTS); //一个点跟前面的点形成一条线段,同时跟后面一个点形成线段 for (i = 0; i < MaxY; i++) { for (int j = 0; j < num; j++) { if (ver[j].ver_y == i) { if (ver[(j + 1 + num) % num].ver_y > ver[j].ver_y) { NET* p = new NET; p->x = ver[j].ver_x; p->ymax = ver[(j + 1 + num) % num].ver_y; p->dx = (ver[(j + 1 + num) % num].ver_x - ver[j].ver_x) / (ver[(j + 1 + num) % num].ver_y - ver[j].ver_y); p->next = pNET[i]->next; pNET[i]->next = p; } if (ver[(j - 1 + num) % num].ver_y > ver[j].ver_y) { NET* p = new NET; p->x = ver[j].ver_x; p->ymax = ver[(j - 1 + num) % num].ver_y; p->dx = (ver[(j - 1 + num) % num].ver_x - ver[j].ver_x) / (ver[(j - 1 + num) % num].ver_y - ver[j].ver_y); p->next = pNET[i]->next; pNET[i]->next = p; } } } } //把新边表net[i]中的边节点用插入排序法插入AET表,使之按照x的坐标递增顺序排序 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表,把配对交点的区间(左闭右开)上的像素(x,y) AET* q = pAET; p = q->next; while (p) { //删掉扫描线高度等同于ymax的废弃点 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 (j), i); } p = p->next->next; } } glEnd(); glFlush(); } int main(int argc, char* argv) { glutInit(&argc, &argv); glutInitWindowSize(400, 300); glutCreateWindow("多边形的扫描转换算法"); inputPoint(); gluOrtho2D(0.0, 600.0, 0.0, 450.0); //设置原点在窗口左下方 glutDisplayFunc(Polygon);//调用函数 glutMainLoop(); }
本次实验将原点设置为窗口左下方:
gluOrtho2D(0.0, 600.0, 0.0, 450.0); //设置原点在窗口左下方
结束啦!下次实验是简单几何形体的平移、缩放、旋转等几何变换,加油!



