代码:
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++ 运行结果: