具体内容参考博客:https://blog.csdn.net/qq_38345598/article/details/84553043
实心五边形
任意给定5个顶点坐标,利用多边形填充的扫描线算法编写程序,生成一个实心五边形。
运行截图
代码(转载)
#include <GL/glut.h>
#include <windows.h>
const int POINTNUM = 5;
typedef struct XET{
float x;
float dx, ymax;
XET* next;
}AET, NET;
struct point{
float x;
float y;
}
point[POINTNUM] = { 400, 100, 500, 250, 275, 400, 50, 250, 150, 100};
void PolyScan(){
int MaxY = 0;
int i;
for (i = 0; i < POINTNUM; i++){
if (point[i].y > MaxY)
MaxY = point[i].y;
}
AET *pAET = new AET;
pAET->next = NULL;
NET *pNET[1024];
for (i = 0; i <= MaxY; i++){
pNET[i] = new NET;
pNET[i]->next = NULL;
}
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 0.0, 0.0);
glBegin(GL_POINTS);
for (i = 0; i < MaxY; i++){
for (int j = 0; j < POINTNUM; j++){
if (point[j].y == i){
if (point[(j - 1 + POINTNUM) % POINTNUM].y > point[j].y){
NET *p = new NET;
p->x = point[j].x;
p->ymax = point[(j - 1 + POINTNUM) % POINTNUM].y;
p->dx = (point[(j - 1 + POINTNUM) % POINTNUM].x - point[j].x) / (point[(j - 1 + POINTNUM) % POINTNUM].y - point[j].y);
p->next = pNET[i]->next;
pNET[i]->next = p;
}
if (point[(j + 1 + POINTNUM) % POINTNUM].y > point[j].y){
NET *p = new NET;
p->x = point[j].x;
p->ymax = point[(j + 1 + POINTNUM) % POINTNUM].y;
p->dx = (point[(j + 1 + POINTNUM) % POINTNUM].x - point[j].x) / (point[(j + 1 + POINTNUM) % POINTNUM].y - point[j].y);
p->next = pNET[i]->next;
pNET[i]->next = p;
}
}
}
}
for (i = 0; i <= MaxY; i++){
NET *p = pAET->next;
while (p){
p->x = p->x + p->dx;
p = p->next;
}
AET *tq = pAET;
p = pAET->next;
tq->next = NULL;
while (p){
while (tq->next && p->x >= tq->next->x)
tq = tq->next;
NET *s = p->next;
p->next = tq->next;
tq->next = p;
p = s;
tq = pAET;
}
AET *q = pAET;
p = q->next;
while (p){
if (p->ymax == i){
q->next = p->next;
delete p;
p = q->next;
}
else{
q = q->next;
p = q->next;
}
}
p = pNET[i]->next;
q = pAET;
while (p){
while (q->next && p->x >= q->next->x)
q = q->next;
NET *s = p->next;
p->next = q->next;
q->next = p;
p = s;
q = pAET;
}
p = pAET->next;
while (p && p->next){
for (float j = p->x; j <= p->next->x; j++){
glVertex2i(static_cast<int>(j), i);
}
p = p->next->next;
}
}
glEnd();
glFlush();
}
void main(int argc, char* argv){
glutInit(&argc, &argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowPosition(400, 100);
glutInitWindowSize(800, 600);
glutCreateWindow("扫描线算法-实心五边形");
glClearColor(1.0, 1.0, 1.0, 0.0);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0, 600.0, 0.0, 450.0);
glutDisplayFunc(PolyScan);
glutMainLoop();
}