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

  • 格式:doc
  • 大小:63.00 KB
  • 文档页数:6

下载文档原格式

  / 13
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

代码:

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<=x2;i++) drawpoint(i,y);

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]

(i+1)%PN;

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();

return0;

}

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);