光栅图形学(4)-边界标志算法

文章目录[x]
  1. 1:介绍
  2. 2:伪代码
  3. 3:代码

介绍


在帧缓冲器中对多边形的每条边进行直线扫描转换,然后对每条与多边形相交的扫描线依次从左到右的顺序,逐个访问该扫描线上的像素。使用一个布尔值inside来表示当前点是否在多边形内。inside的初值为false,每当当前访问的像素是被多边形的边界(即认为是在打上标志的点)时,就对inside取反。若inside为真,说明该像素在多边形内,则将该像素填充颜色。

伪代码


以 《计算机图形学基础教程(第二版)》算法程序2.7为例:

void edgemark_fill(ploydef, color)
{
    对多边形ploydef每条边进行直线扫描转换
    for (每条与多边形ploydef相交的扫描线y)
    {
        inside = false;
        for(扫描线上每个像素x)    
        {
            if (像素x被打上标志)
                inside = !inside;
            if (inside) 
                drawpixel(x,y,color)
            else
                drawpixel(x,y,background)
        }
    }
}

 

代码


直线扫描转换 略...

//n多边形边数, points顶点数组
void EdgeMarkFill(int n, int *points, Color& color, Color& backgroundColor)
{
    bool inside = false;
    Color c = backgroundColor;
    int maxX = 0, minX = 0, maxY = 0, minY = 0;
    int i = 0, j = 0;

    //求maxX和minX
    for (i = 0, maxX = minX = points[0]; i < n * 2; i += 2)
    {
        if (maxX < points[i]) 
            maxX = points[i]; 
        if (minX > points[i])
            minX = points[i];
    }
    //求maxY和minY
    for (i = 1, maxY = minY = points[1]; i < n * 2; i += 2)
    {
        if (maxY < points[i]) 
            maxY = points[i]; 
        if (minY > points[i])
            minY = points[i];
    }

    //下面进行边标志填充
    for (i = minY + 1; i < maxY; i++)
    {
        inside = false;
        for (j = minX; j < maxX; j++) 
        { 
            c = RenderSystem::current->GetRasterizer()->GetPixel(j, i);
            if (c == color)
                inside = !inside;

            if (inside)
                RenderSystem::current->GetRasterizer()->DrawPixel(j, i, color);
            //else
                //RenderSystem::current->GetRasterizer()->DrawPixel(j, i, backgroundColor);
        }
    }
}

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像