计算机图形学实验三:多边形填充算法之活性边表方法实现
解救众多被计算机图形学实验所困扰的学生党们,本博客仅粘贴代码,活性边表实现多边形填充的原理请自行百度或Google,网上从来不缺原理。
注意,本博客中的代码运行不能实现含有内多边形如‘回’字型多边形。
ps:该实现结果为放大二十倍之后的结果,如果要更改放大倍数请修改函数Polyscan中末尾几行的代码glVertex2i(static_cast(j) * 20, i * 20); 内的扩大倍数20,同时将init函数中用于绘制表格的两个for循环函数中的x += 20及y += 20 的20改为你扩大的倍数。
代码在此,参考为上,借鉴最佳
#include "pch.h"
#include <iostream>
#include<windows.h>
#include<GL/glut.h>
const int POINTNUM = 4; //多边形点数.
const int WindowWidth = 600, WindowHeight = 320;
//bresenham算法,用于多边形的绘制
void BresenhamLine(int x0, int y0, int x1, int y1) {
int x01 = x0 * 20, y01 = y0 * 20, x11 = x1 * 20, y11 = y1 * 20;
int dx = x11 - x01, dy = y11 - y01;
if (dx == 0) {
if (dy < 0) {
int tempx0 = x01, tempy0 = y01;
x01 = x11, y01 = y11;
x11 = tempx0, y11 = tempy0;
}
for (int y = y01; y <= y11;) {
glVertex2i(x01, y);
y += 20;
}
}
else {
if (((dy > dx) && (dx < 0) && (dy * dx > 0)) || ((dy < dx) && (dy > 0))) {
//0<k<1
int tempy = y01;
int e = -dx;
if (dx < 0) {
int tempx0 = x01, tempy0 = y01;
x01 = x11, y01 = y11;
x11 = tempx0, y11 = tempy0;
dx = x11 - x01, dy = y11 - y01;
e = -dx;
tempy = y01;
}
for (int x = x01; x <= x11;) {
if (e < 0) {
glVertex2i(x, tempy);
e = e + 2 * dy;
x = x + 20;
}
else
{
e = e - 2 * dx;
tempy = tempy + 20;
glVertex2i(x, tempy);
e = e + 2 * dy;
x = x + 20;
}
}
}
else if (((dy < dx) && (dx < 0)) || ((dy > dx) && (dx > 0))) {
//k>1
int tempx = x01;
int e = -dy;
if (dx < 0) {
int tempx0 = x01, tempy0 = y01;
x01 = x11, y01 = y11;
x11 = tempx0, y11 =<