一、实验目的和要求
- 熟悉光栅图形学中的区域填充扫描线算法;
- 利用区域填充算法绘制多边形区域,区域由离散点组成;
- 应用OpenGL进行区域填充。
二、实验内容
用区域填充直线扫描法填充绘制六边形:
- 初始化一个空的栈用于存放种子点,将种子点(x, y)入栈;
- 判断栈是否为空,如果栈为空则结束算法,否则取出栈顶元素作为当前扫描线的种子点(x, y),y是当前的扫描线;
- 从种子点(x,y)出发,沿当前扫描线向左、右两个方向填充,直到边界。分别标记区段的左、右端点坐标为xLeft和xRight;
- 分别检查与当前扫描线相邻的y - 1和y + 1两条扫描线在区间[xLeft,xRight]中的像素,从xLeft开始向xRight方向搜索,若存在非边界且未填充的像素点,则找出这些相邻的像素点中最右边的一个,并将其作为种子点压入栈中,然后返回第2步;
三、实验过程及代码
#include<gl/glut.h>
#include<windows.h>
const int POINTNUM = 6; //多边形点数.
//定义结构体用于活性边表AET和新边表NET
typedef struct XET
{
float x;
float dx, ymax;
XET* next;
}AET, NET;
//定义点结构体point
struct point
{
float x;
float y;
}
polypoint[POINTNUM] = {
250,50,500,150,550,400,400,250,200,350,100,100 }; //多边形顶点
void PolyScan()
{
//计算最高点的y坐标(扫描到此结束)
int MaxY = 0;
int i;
for (i = 0; i<POINTNUM; i++)
if (polypoint[i].y>MaxY)
MaxY = polypoint[i].y;
//初始化AET表
AET *pAET = new AET;
pAET->next = NULL;
//初始化NET表
NET *pNET[1024];
for (i = 0; i