扫描线填充算法--有效边表填充算法

代码:

draw.cpp //using OpenGL

#include "opengl.h"

#include

#include

#include

#include

#define PN 6

int

point [N ][2]={{40, 5},{75, 40},{60, 70},{35, 50},{25, 80},{5, 30}};

//AE

struct AE{

AE(float _x, float _dx, int

_ymax){x =_x; dx =_dx; ymax =_ymax;}

float x;

float dx;

int ymax;

void operator ++(int ){

x+=dx ;

}

};

//AET

//which eage is on the right

bool fill_comp(const AE& ae1, const AE& ae2){ if (ae1. x

return true ;

}

if (ae1. x ==ae2. x &&ae1. dx

return true ;

}

return false ;

}

void fillline(int y, int x1, int x2){

for (int i=x1; i

flush();

}

void fill(){

//make k=(x2-x1)/(y2-y1)

float k[PN ]={0.0};for (int

i =0; i !=PN ; i ++){k [i ]=((float )(point [(i +1)%PN ][0]-point [i ][0])/(float )(point [(i +1)%PN ][1]-point [i ][1]));}

//find min and max with selection sort.

int min=point [0][1],max =min ; for (int

i =0; i !=PN ; i ++){if (point [i ][1]>max ){max =point [i ][1];};;if (point [i ][1]

//make scanning line list

std::vector *ET = new std::vector [max -min +1]; //make ET

//

for (int i = 0; i

//get ymin, ymax

int yminn=point [i ][1]

int ymaxn=point [i ][1]>=point [(i +1)%PN ][1] ? i : (i +1)%PN ;

AE *tmp = new

AE (point [yminn ][0],k [i ],point [ymaxn ][1]);

//insert node

ET[point [yminn ][1]-min ].push_back(*tmp );

}

//init AET

std::vector AET;

for (int i=0; i !=max -min +1; i ++){

//insert node from ET to AET

for (int ii=0; ii !=ET [i ].size ();ii ++){

//sort with selection sort.

AET. insert (std ::upper_bound(AET . begin (), AET . end (),ET [i ][ii ],fill_comp), ET [i ][ii ]);

}

//delete y=ymax,"下闭上开"

for (int

ii =0; ii !=AET . size ();){if (i +min ==AET [ii ].ymax )

{AET . erase (AET . begin ()+ii );}else {ii ++;}}

//draw

{

bool flag=false ;

for (int ii=0; ii !=AET . size ();ii ++){

if (flag )

fillline (i +min ,(int )(AET [ii -1].x +0.5),(int )(AET [ii ].x +0.5));

//if(flag)

std::cout

flag=!flag ;

} }

for (int ii=0; ii !=AET . size ();ii ++){AET [ii ]++;} }

delete [](ET );

}

void draw(){

drawgrid(0.8, 0.8, 0.8);

setcolor(1, 0.5, 0.5);

fill();

draweage(point , PN );

}

int main(int n, char *avg []){

init(n , avg , "L2" );

reinit(draw );

loop();

return 0;

}

opengl.h

#include

#define N 100

#define GRIDSIZE 5

int size=N *GRIDSIZE ;

void init(int argc, char ** argv, char *title ){

//init openGL

size = N * GRIDSIZE;

glutInit(&argc , argv);

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

glutInitWindowPosition(10, 10);

glutInitWindowSize(size , size);

glutCreateWindow(title );

glClearColor(1.0, 1.0, 1.0, 1.0); //white

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(0.0, 0.0, 0.0); //black

gluOrtho2D(0, size, 0, size);

}

void reinit(void (*p )()){

glutDisplayFunc(p );

}

void flush(){

glFlush();

}

void loop(){

glutMainLoop();

}

void clear(){

glClearColor(1.0, 1.0, 1.0, 1.0); //white

glClear(GL_COLOR_BUFFER_BIT);

}

void setcolor(double r, double g, double b){

glColor3f(r , g, b);

}

void drawline(int x1, int y1, int x2, int y2){

glBegin(GL_LINES);

glVertex2i(x1, y1);

glVertex2i(x2, y2);

glEnd();

flush();

}

void drawgrid(double r, double g, double b){

int i = 0;

glColor3f(r , g, b);

for (i = 0; i != N * GRIDSIZE ; i += GRIDSIZE ) { drawline (i , 0, i, size); }

for (i = 0; i != N * GRIDSIZE ; i += GRIDSIZE ) { drawline (0, i , size, i); }

flush();

}

void drawpoint(int x, int y){

glPointSize((double ) GRIDSIZE );

glBegin(GL_POINTS);

glVertex2i(x * GRIDSIZE, y * GRIDSIZE);

glEnd();

flush();

}

void draweage(int p[][2],int pn){

if (pn

setcolor(0, 0.8, 0.8);

for (int i=0; i !=pn -1; i ++){

drawline (p [i ][0]*GRIDSIZE , p [i ][1]*GRIDSIZE , p [i +1][0]*GRID SIZE , p [i +1][1]*GRIDSIZE );

}

drawline (p [pn -1][0]*GRIDSIZE , p [pn -1][1]*GRIDSIZE , p [0][0]*GRIDSIZE , p [0][1]*GRIDSIZE );

}

运行环境: ubuntu 13.10 + g++ 运行结果:

代码:

draw.cpp //using OpenGL

#include "opengl.h"

#include

#include

#include

#include

#define PN 6

int

point [N ][2]={{40, 5},{75, 40},{60, 70},{35, 50},{25, 80},{5, 30}};

//AE

struct AE{

AE(float _x, float _dx, int

_ymax){x =_x; dx =_dx; ymax =_ymax;}

float x;

float dx;

int ymax;

void operator ++(int ){

x+=dx ;

}

};

//AET

//which eage is on the right

bool fill_comp(const AE& ae1, const AE& ae2){ if (ae1. x

return true ;

}

if (ae1. x ==ae2. x &&ae1. dx

return true ;

}

return false ;

}

void fillline(int y, int x1, int x2){

for (int i=x1; i

flush();

}

void fill(){

//make k=(x2-x1)/(y2-y1)

float k[PN ]={0.0};for (int

i =0; i !=PN ; i ++){k [i ]=((float )(point [(i +1)%PN ][0]-point [i ][0])/(float )(point [(i +1)%PN ][1]-point [i ][1]));}

//find min and max with selection sort.

int min=point [0][1],max =min ; for (int

i =0; i !=PN ; i ++){if (point [i ][1]>max ){max =point [i ][1];};;if (point [i ][1]

//make scanning line list

std::vector *ET = new std::vector [max -min +1]; //make ET

//

for (int i = 0; i

//get ymin, ymax

int yminn=point [i ][1]

int ymaxn=point [i ][1]>=point [(i +1)%PN ][1] ? i : (i +1)%PN ;

AE *tmp = new

AE (point [yminn ][0],k [i ],point [ymaxn ][1]);

//insert node

ET[point [yminn ][1]-min ].push_back(*tmp );

}

//init AET

std::vector AET;

for (int i=0; i !=max -min +1; i ++){

//insert node from ET to AET

for (int ii=0; ii !=ET [i ].size ();ii ++){

//sort with selection sort.

AET. insert (std ::upper_bound(AET . begin (), AET . end (),ET [i ][ii ],fill_comp), ET [i ][ii ]);

}

//delete y=ymax,"下闭上开"

for (int

ii =0; ii !=AET . size ();){if (i +min ==AET [ii ].ymax )

{AET . erase (AET . begin ()+ii );}else {ii ++;}}

//draw

{

bool flag=false ;

for (int ii=0; ii !=AET . size ();ii ++){

if (flag )

fillline (i +min ,(int )(AET [ii -1].x +0.5),(int )(AET [ii ].x +0.5));

//if(flag)

std::cout

flag=!flag ;

} }

for (int ii=0; ii !=AET . size ();ii ++){AET [ii ]++;} }

delete [](ET );

}

void draw(){

drawgrid(0.8, 0.8, 0.8);

setcolor(1, 0.5, 0.5);

fill();

draweage(point , PN );

}

int main(int n, char *avg []){

init(n , avg , "L2" );

reinit(draw );

loop();

return 0;

}

opengl.h

#include

#define N 100

#define GRIDSIZE 5

int size=N *GRIDSIZE ;

void init(int argc, char ** argv, char *title ){

//init openGL

size = N * GRIDSIZE;

glutInit(&argc , argv);

glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);

glutInitWindowPosition(10, 10);

glutInitWindowSize(size , size);

glutCreateWindow(title );

glClearColor(1.0, 1.0, 1.0, 1.0); //white

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(0.0, 0.0, 0.0); //black

gluOrtho2D(0, size, 0, size);

}

void reinit(void (*p )()){

glutDisplayFunc(p );

}

void flush(){

glFlush();

}

void loop(){

glutMainLoop();

}

void clear(){

glClearColor(1.0, 1.0, 1.0, 1.0); //white

glClear(GL_COLOR_BUFFER_BIT);

}

void setcolor(double r, double g, double b){

glColor3f(r , g, b);

}

void drawline(int x1, int y1, int x2, int y2){

glBegin(GL_LINES);

glVertex2i(x1, y1);

glVertex2i(x2, y2);

glEnd();

flush();

}

void drawgrid(double r, double g, double b){

int i = 0;

glColor3f(r , g, b);

for (i = 0; i != N * GRIDSIZE ; i += GRIDSIZE ) { drawline (i , 0, i, size); }

for (i = 0; i != N * GRIDSIZE ; i += GRIDSIZE ) { drawline (0, i , size, i); }

flush();

}

void drawpoint(int x, int y){

glPointSize((double ) GRIDSIZE );

glBegin(GL_POINTS);

glVertex2i(x * GRIDSIZE, y * GRIDSIZE);

glEnd();

flush();

}

void draweage(int p[][2],int pn){

if (pn

setcolor(0, 0.8, 0.8);

for (int i=0; i !=pn -1; i ++){

drawline (p [i ][0]*GRIDSIZE , p [i ][1]*GRIDSIZE , p [i +1][0]*GRID SIZE , p [i +1][1]*GRIDSIZE );

}

drawline (p [pn -1][0]*GRIDSIZE , p [pn -1][1]*GRIDSIZE , p [0][0]*GRIDSIZE , p [0][1]*GRIDSIZE );

}

运行环境: ubuntu 13.10 + g++ 运行结果:


相关文章

  • 计算机图形学究极题库 - 副本
  • 名词解释: 1.图形:能够在人们视觉系统中形成视觉印象的对象称为图形,包括自然景物和人工绘图. 2.像素图:点阵法列举图形中的所有点.用点阵法描述的图形称为像素图. 3.参数图:参数法描述图形的形状参数和属性参数.用参数法描述的图形称为参数 ...查看


  • 计算机图形学作业3-6
  • 第三章作业 1. (6分)名词解释:扫描转换.增量算法.反走样. 扫描转换:基本图形的光栅化就是在像素点阵中确定最佳逼近与理想图形的像素点集,并用指定颜色显示这些像素点集的过程.当光栅化与按扫描线顺序绘制图形的过程集合在一起时,也称为扫描转 ...查看


  • 计算机图形学全部知识点
  • 1. 计算机图形学的研究内容 什么是计算机图形学? (1/2) 什么是计算机图形学? (2/2) 什么是交互式计算机图形学? (1/3) 什么是交互式计算机图形学? (2/3) 什么是交互式计算机图形学? (3/3) 基本概念--图形 图形 ...查看


  • 计算机图形学知识点
  • 总复习知识点 第1章 绪论 数字图像处理.计算机图形学.计算机模式识别概念.关系.区别 计算机图形学的应用范围和实例 第2章 计算机图形系统硬件 计算机图形系统工作流程.基本组成和典型计算机图形系统 计算机图形系统设备: 图形输入设备: 掌 ...查看


  • 图形学试题
  • C 1.触摸屏是( ) 设备. A )输入 B )输出 C )输入输出 D )既不是输入也不是输出 B 2.计算机绘图设备一般使用什么颜色模型?( ) A )RGB : B )CMY : C )HSV : D )HLS A 3. 计算机图形 ...查看


  • [数字图形设计]题目与答案1
  • 数字图形设计练习题1和答案 单选题 1. 假设RGB 光栅系统的设计采用8×10 英寸的屏幕,每个方向的分辨率为每英寸100 个象素.如果每个像素6 位,存放在帧缓冲器中,则帧缓冲器需要多大存储容量(字节数)( ) A. 150000B. ...查看


  • 2016年山东省放射医学技术高级(师)专业实践能力考试题
  • 2016年山东省放射医学技术高级(师)专业实践能力考试 题 本卷共分为2大题60小题,作答时间为180分钟,总分120分,80分及格. 一.单项选择题(在每个小题列出的四个选项中只有一个是符合题目要求的,请将其代码填写在题干后的括号内.错选 ...查看


  • 数据挖掘算法研究与综述
  • 第26卷第9期 V01.26 No.9 计算机工程与设计 ComputerEngineeringandDesign 2005年9月 Sept.2005 数据挖掘算法研究与综述 邹志文, 朱金伟 (江苏大学计算机学院,江苏镇江212013) ...查看


  • 网络安全问答题
  • 1.网络攻击和防御分别包括哪些内容? 2.从层次上,网络安全可以分成哪几层?每层有什么特点? 3.为什么要研究网络安全? 1.简述OSI参考模型的结构 2.简述TCP/IP协议族的基本结构,并分析每层可能受到的威胁及如何防御. 5.简述常用 ...查看


热门内容