实验三、画圆凸多边形填充算法 下载本文

内容发布更新时间 : 2024/5/23 20:08:07星期一 下面是文章的全部内容请认真阅读。

.

华北水利水电大学 计算机图形学 实验报告

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 : 定义控制台应用程序的入口点。

.