C++中的扫描线填充OpenGL/GLUT算法
Posted
技术标签:
【中文标题】C++中的扫描线填充OpenGL/GLUT算法【英文标题】:Scan-line fill OpenGL/GLUT algorithm in C++ 【发布时间】:2012-05-25 13:37:04 【问题描述】:我正在尝试学习在 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();
【问题讨论】:
上面的代码是你写的吗? 不,它来自互联网,对不起,如果这不是寻求此类帮助的地方:( 您的问题相当不具体。你实际上不理解/不能实施什么?有一些很好的文档(例如:techfak.uni-bielefeld.de/ags/wbski/lehre/digiSA/WS0607/3DVRCG/…)很好地解释了这个问题。 我完全没有得到扫描填充和边缘检测功能的确切目的,谢谢你的链接:-) 这是否意味着您不明白为什么要使用扫描填充?边缘检测是因为这就是填充的工作原理,逐段填充,直到填充整个图像。 【参考方案1】:scanfill 函数正在填充由四个 x-y 坐标描述的 4 边多边形所覆盖的像素。为此,它使用了 edgedetect 函数,该函数模拟绘制多边形的边缘并记住每个 y 坐标的最小和最大 x 坐标。然后,scanfill 函数遍历每个 y 坐标,并在记住的范围内绘制一条水平像素线。
【讨论】:
以上是关于C++中的扫描线填充OpenGL/GLUT算法的主要内容,如果未能解决你的问题,请参考以下文章