.
华北水利水电大学 计算机图形学 实验报告
2017--2018学年 第一学期 2014级 计算机科学与技术 专业
指导老师 曹源昊 班级 2014157 学号 201415717 姓名 李卫朋
实验三、画圆与凸多边形填充算法
1. 实验目的
练习直线和圆的光栅扫描线算法,多边形的扫描转换算法。 2. 实验内容和要求
按要求完成以下三个作业。提交纸质实验报告,同时提交实验报告和源代码的电子版。
(I). 利用Bresenham直线扫描算法绘制任意直线段。输入为起点坐标(x0,y0)和终点坐标(x1,y1)以及线宽w,利用Bresenham算法计算离散的近似像素点,并在OpenGL窗口中绘制该线段。要求绘制至少五条线段,具有不同的斜率,不同的起点和终点,不同的线宽。 不允许直接调用GL_LINES来实现。
(II). 利用中点画圆算法绘制圆。输入为圆心(xc,yc)和圆的的半径r,利用中点画圆算法计算离散的近似像素点,并在OpenGL窗口中绘制。要求绘制至少四个圆,构成一个图案,比如奥迪车标或五环。
(III). 实现多边形的扫描转换算法。输入一个凸多边形的顶点序列,利用活性边表计算每条扫描线上位于多边形内部的像素,并填充上一个新颜色,最终达到填充多边形内部的目的。
建议:为了实现坐标点和像素的一一对应,建议坐标轴的范围和窗口像素宽高一致,比如:
glutInitWindowSize(800, 600);//像素宽800,高600 坐标系设定为:
gluOrtho2D(-400, 400, -300, 300);//坐标轴x方向宽为800,y方向高为600 3. 算法描述
使用OpenGL进行画图,采用VS编程环境。 4. 源程序代码 (1)
// bresenham直线.cpp : 定义控制台应用程序的入口点。 //
#include \ #include \ #include \ #include \ #include \ #include \ using namespace std;
GLsizei winWidth = 400, winHeight = 300; // 屏幕显示宽高. int a[100],b[100],c[100],d[100],n=-1; void init( )
.
.
{ }
void lineBres(int x0,int y0,int xEnd,int yEnd) {
int dx = abs(xEnd - x0),dy = abs(yEnd - y0); int p = 2*dy - dx;
int twoDy = 2*dy, twoDyMinusDx = 2*(dy - dx); int x,y;
if(x0 > xEnd) {
glClearColor(1.0, 1.0, 1.0, 1.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, 200.0, 0.0, 150.0);
x = xEnd; y = yEnd; xEnd = x0;
} else {
x = x0; y = y0;
}
glBegin(GL_POINTS);
glVertex2i(x,y); glEnd();
while(x x++; if(p < 0) { } glBegin(GL_POINTS); y++; p += twoDyMinusDx; p += twoDy; else glVertex2i(x,y); glEnd(); } void displayFcn() { } . . } glColor3f(1.0, 0.0, 0.0); for(int i=0;i<=n;i++) { lineBres(a[i],b[i],c[i],d[i]); } glFlush(); void winReshpeFcn(GLint newWidth, GLint newHeight) { } int _tmain(int argc, char** argv) { } glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(100, 100); glutInitWindowSize(winWidth, winHeight); glutCreateWindow(\直线\); init(); int h=1; while(h==1) { } glutReshapeFunc(winReshpeFcn); glutMainLoop(); return 0; printf(\输入起点和终点的坐标\); n++; scanf_s(\,&a[n],&b[n],&c[n],&d[n]); glutDisplayFunc(displayFcn); printf(\继续输入请按1,退出请按0\); scanf_s(\,&h); winWidth = newWidth; winHeight = newHeight; glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, GLdouble(newWidth), 0.0, GLdouble(newHeight)); glClear(GL_COLOR_BUFFER_BIT); (2)// 中点画圆法.cpp : 定义控制台应用程序的入口点。 .