多边形的扫描转换

实验环境

Visual Studio 2019

三、实验步骤/过程

#include <iostream>  

#include<GL/glut.h>

#include <windows.h>

using namespace std;

int n;

struct vertex {

    float ver_x;

    float ver_y;

};

typedef struct XET {

    float x;

    float dx, ymax;

    XET* next;

}AET, NET;

struct point {

    float x;

    float y;

};

vertex* ver;

inline void input() {

    cout << "输入要显示的多边形共有几个顶点" << endl;

    cin >> n;

    ver = (vertex*)malloc(sizeof(vertex) * n);//输入顶点以(x,y)格式

    for (int i = 0; i < n; i++) {

        cout << "按顺序输入每个顶点的想x,y值,每输入完一个顶点,点击回车进入下一个顶点的输入" << endl;

        cin >> ver[i].ver_x >> ver[i].ver_y;

    }

}

void Polygon() {

    int MaxY = 0;

    int i;

    for (i = 0; i < n; i++) {

        if (ver[i].ver_y > MaxY)

            MaxY = ver[i].ver_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 < n; j++) {

            if (ver[j].ver_y == i) {

                if (ver[(j + 1 + n) % n].ver_y > ver[j].ver_y) {

                    NET* p = new NET;

                    p->x = ver[j].ver_x;

                    p->ymax = ver[(j + 1 + n) % n].ver_y;

                    p->dx = (ver[(j + 1 + n) % n].ver_x - ver[j].ver_x) / (ver[(j + 1 + n) % n].ver_y - ver[j].ver_y);

                    p->next = pNET[i]->next;

                    pNET[i]->next = p;

                }

                if (ver[(j - 1 + n) % n].ver_y > ver[j].ver_y) {

                    NET* p = new NET;

                    p->x = ver[j].ver_x;

                    p->ymax = ver[(j - 1 + n) % n].ver_y;

                    p->dx = (ver[(j - 1 + n) % n].ver_x - ver[j].ver_x) / (ver[(j - 1 + n) % n].ver_y - ver[j].ver_y);

                    p->next = pNET[i]->next;

                    pNET[i]->next = p;

                }

            }

        }

    }

    glClear(GL_COLOR_BUFFER_BIT);

    if (n % 2 == 0) {

        glColor3f(1.0, 0.0, 0.0);     // 设置当前色为红色

    }

    else

    {

        glColor3f(0.0, 0.0, 1.0);     // 设置当前色为蓝色

    }

    glBegin(GL_POINTS);

    for (i = 0; i <= MaxY; i++) {

        AET* p = new AET;

        p = pAET->next;

        AET* n = new AET;

        //将新边表中的活性边按照从左到右的顺序排序

        if (pNET[i]->next && pNET[i]->next->next) {

            if (pNET[i]->next->dx > 0) {

                NET* t = new NET;

                t = pNET[i]->next;

                n = pNET[i]->next->next;

                t->next = NULL;

                n->next = NULL;

                pNET[i]->next = n;

                n->next = t;

            }

        }

        //更新活性边表中的活性边x坐标的值

        while (p) {

            p->x = p->x + p->dx;

            p = p->next;

        }

        p = pAET->next;

        n = pAET;

        //删掉扫描线高度等同于ymax的废弃点

        while (p) {

            if (p->ymax == i) {

                n->next = p->next;

                p = n->next;

            }

            else {

                p = p->next;

                n = n->next;

            }

        }

        //插入新点,按照顺序插入

        p = pAET->next;

        n = pAET;

        NET* a = new NET;

        a = pNET[i]->next;

        if (a) {

            NET* b = new NET;

            b = a;

            while (b->next) {

                b = b->next;

            }

            if (!pAET->next) {

                pAET->next = a;

            }

            else {

                while (p) {

                    if (a->x < p->x) {

                        b->next = p;

                        n->next = a;

                        break;

                    }

                    if (!p->next) {

                        p->next = a;

                        break;

                    }

                    n = n->next;

                    p = p->next;

                }

            }

        }

        //填充2

        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 init(void) {

    glClearColor(1.0, 1.0, 1.0, 0.0);   //设置底色 红绿蓝和alpha

    glMatrixMode(GL_PROJECTION);      //这个是投影的意思

    gluOrtho2D(0.0, 600, 0.0, 450); //gluOrtho2D是指屏幕区域对应的模型坐标范围

}

int main(int argc, char* argv) {

    glutInit(&argc, &argv);

    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

    glutInitWindowPosition(50, 100);

    glutInitWindowSize(400, 300);

    glutCreateWindow("图形学实验一");

    input();

    init();

    glutDisplayFunc(Polygon);

    glutMainLoop();

}

实验结果

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦极必反

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值