C++中的扫描线填充OpenGL/GLUT算法

7

我正在尝试学习OpenGL/GLUT中实现的扫描线填充算法。我无法理解这个概念。有人能简单地向我解释一下这个算法吗?该算法如下:

#include<GL/glut.h>

float x1,x2,x3,x4,y1,y2,y3,y4;

void draw_pixel(int x,int y)
{
    glColor3f(0.0,1.0,1.0);
    glPointSize(1.0);
    glBegin(GL_POINTS);
    glVertex2i(x,y);
    glEnd();
}

void edgedetect(float x1,float y1,float x2,float y2,int *le,int *re)
{
    float temp,x,mx;
    int i;

    if(y1>y2)
    {
        temp=x1,x1=x2,x2=temp;
        temp=y1,y1=y2,y2=temp;
    }

    if(y1==y2)
        mx=x2-x1;
    else
        mx=(x2-x1)/(y2-y1);

    x=x1;

    for(i=int(y1);i<=(int)y2;i++)
    {
        if(x<(float)le[i]) le[i]=(int)x;
        if(x>(float)re[i]) re[i]=(int)x;
        x+=mx;
    }
}

void scanfill(float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4)
{
    int le[500],re[500],i,j;

    for(i=0;i<500;i++)
        le[i]=500,re[i]=0;

    edgedetect(x1,y1,x2,y2,le,re);
    edgedetect(x2,y2,x3,y3,le,re);
    edgedetect(x3,y3,x4,y4,le,re);
    edgedetect(x4,y4,x1,y1,le,re);

    for(j=0;j<500;j++)
    {
        if(le[j]<=re[j])
            for(i=le[j];i<re[j];i++)
                draw_pixel(i,j);
    }
}


void display()
{
    x1=250.0;y1=200.0;x2=150.0;y2=300.0;x3=250.0;
    y3=400.0;x4=350.0;y4=300.0;
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0,0.0,1.0);
    glBegin(GL_LINE_LOOP);
    glVertex2f(x1,y1);
    glVertex2f(x2,y2);
    glVertex2f(x3,y3);
    glVertex2f(x4,y4);
    glEnd();

    scanfill(x1,y1,x2,y2,x3,y3,x4,y4);

    glFlush();
}


void init()
{
    glClearColor(1.0,1.0,1.0,1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0,499.0,0.0,499.0);
}

void main(int argc,char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowSize(500,500);

    glutCreateWindow("scanline");
    glutDisplayFunc(display);

    init();
    glutMainLoop();
}

1
你写了上面的代码吗? - John Riselvato
不好意思,这是从互联网上找到的内容,如果这不是寻求此类帮助的地方,请见谅 :( - Hirvesh
你的问题比较不具体。你到底不理解什么或者无法实现什么?有一些很好的文档(例如:http://www.techfak.uni-bielefeld.de/ags/wbski/lehre/digiSA/WS0607/3DVRCG/Vorlesung/13.RT3DCGVR-vertex-2-fragment.pdf)非常清楚地解释了这个问题。 - Constantinius
我并没有完全理解scanfill和edge detect函数的确切目的,顺便感谢提供链接 :-) - Hirvesh
这是否意味着您不理解为什么要使用扫描填充?边缘检测是因为这就是填充的工作方式,逐个部分填充直到整个图像被填满。 - John Riselvato
1个回答

4

扫描填充函数(fill function)会填充由四个x-y坐标描述的4边形所覆盖的像素。为此,它使用了边缘检测函数(edgedetect function),模拟绘制多边形的边缘并记住每个y坐标的最小和最大x坐标。然后,扫描填充函数遍历每个y坐标,在记忆的范围内绘制水平像素线。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接