收藏 分享(赏)

实验三、画圆与凸多边形填充算法.doc

上传人:精品资料 文档编号:8286952 上传时间:2019-06-18 格式:DOC 页数:19 大小:76.66KB
下载 相关 举报
实验三、画圆与凸多边形填充算法.doc_第1页
第1页 / 共19页
实验三、画圆与凸多边形填充算法.doc_第2页
第2页 / 共19页
实验三、画圆与凸多边形填充算法.doc_第3页
第3页 / 共19页
实验三、画圆与凸多边形填充算法.doc_第4页
第4页 / 共19页
实验三、画圆与凸多边形填充算法.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

1、华北水利水电大学 计算机图形学 实验报告2017-2018 学年 第一学期 2014 级 计算机科学与技术 专业指导老师 曹源昊 班级 2014157 学号 201415717 姓名 李卫朋 实验三、画圆与凸多边形填充算法1. 实验目的练习直线和圆的光栅扫描线算法,多边形的扫描转换算法。2. 实验内容和要求按要求完成以下三个作业。提交纸质实验报告,同时提交实验报告和源代码的电子版。(I). 利用 Bresenham 直线扫描算法绘制任意直线段。输入为起点坐标(x0,y0)和终点坐标(x1,y1)以及线宽 w,利用 Bresenham 算法计算离散的近似像素点,并在 OpenGL 窗口中绘制该线

2、段。要求绘制至少五条线段,具有不同的斜率,不同的起点和终点,不同的线宽。不允许直接调用 GL_LINES 来实现。(II). 利用中点画圆算法绘制圆。输入为圆心(xc,yc)和圆的的半径 r,利用中点画圆算法计算离散的近似像素点,并在 OpenGL 窗口中绘制。要求绘制至少四个圆,构成一个图案,比如奥迪车标或五环。(III). 实现多边形的扫描转换算法。输入一个凸多边形的顶点序列,利用活性边表计算每条扫描线上位于多边形内部的像素,并填充上一个新颜色,最终达到填充多边形内部的目的。建议:为了实现坐标点和像素的一一对应,建议坐标轴的范围和窗口像素宽高一致,比如:glutInitWindowSize

3、(800, 600);/像素宽 800,高 600坐标系设定为:gluOrtho2D(-400, 400, -300, 300);/坐标轴 x 方向宽为 800,y 方向高为 6003. 算法描述使用 OpenGL 进行画图,采用 VS 编程环境。4. 源程序代码(1)/ bresenham 直线.cpp : 定义控制台应用程序的入口点。/#include “stdio.h“#include “stdafx.h“#include “glut.h“#include “stdlib.h“#include “math.h“#include “iostream“using namespace std;

4、GLsizei winWidth = 400, winHeight = 300; / 屏幕显示宽高.int a100,b100,c100,d100,n=-1;void init( )glClearColor(1.0, 1.0, 1.0, 1.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0, 200.0, 0.0, 150.0);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 t

5、woDy = 2*dy, twoDyMinusDx = 2*(dy - dx);int x,y;if(x0 xEnd)x = xEnd;y = yEnd;xEnd = x0;elsex = x0;y = y0;glBegin(GL_POINTS);glVertex2i(x,y);glEnd();while(xMaxY)MaxY=polypointi.y;/初始化 AET 表AET *pAET=new AET;pAET-next=NULL;/初始化 NET 表NET *pNET1024;for(i=0;inext=NULL;glClear(GL_COLOR_BUFFER_BIT); /赋值的窗体

6、显示. glColor3f(0.0,0.0,0.0); /设置直线的颜色红色glBegin(GL_POINTS);/扫描并建立 NET 表for(i=0;ipolypointj.y)NET *p=new NET;p-x=polypointj.x;p-ymax=polypoint(j-1+POINTNUM)%POINTNUM.y;p-dx=(polypoint(j-1+POINTNUM)%POINTNUM.x-polypointj.x)/(polypoint(j-1+POINTNUM)%POINTNUM.y-polypointj.y);p-next=pNETi-next;pNETi-next=p

7、;if(polypoint(j+1+POINTNUM)%POINTNUM.ypolypointj.y)NET *p=new NET; p-x=polypointj.x;p-ymax=polypoint(j+1+POINTNUM)%POINTNUM.y;p-dx=(polypoint(j+1+POINTNUM)%POINTNUM.x-polypointj.x)/(polypoint(j+1+POINTNUM)%POINTNUM.y-polypointj.y);p-next=pNETi-next;pNETi-next=p;/建立并更新活性边表 AETfor(i=0;inext;while(p)p-

8、x=p-x + p-dx;p=p-next;/更新后新 AET 先排序/断表排序,不再开辟空间AET *tq=pAET;p=pAET-next;tq-next=NULL;while(p)while(tq-next NET *s=p-next;p-next=tq-next;tq-next=p;p=s;tq=pAET;/(改进算法)先从 AET 表中删除 ymax=i 的结点AET *q=pAET;p=q-next;while(p)if(p-ymax=i)q-next=p-next;delete p;p=q-next;elseq=q-next;p=q-next;/将 NET 中的新点增加 AET,

9、并用插入法按 X 值递增排序p=pNETi-next;q=pAET;while(p)while(q-next NET *s=p-next;p-next=q-next;q-next=p;p=s;q=pAET;/配对填充颜色p=pAET-next;while(p jnext-x;j+)glVertex2i(static_cast(j),i);p=p-next-next;/考虑端点情况glEnd();glFlush(); void init(void)glClearColor(1.0,1.0,1.0,1.0);/窗体的背景颜色设置为白色glMatrixMode(GL_PROJECTION);/glu

10、Ortho2D(0.0,600.0,0.0,450.0);gluOrtho2D(-400, 400, -300, 300);void main(int argc,char* argv)glutInit( /I 初始化 GLUT.glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); /设置显示模式:单个缓存和使用 RGB 模型glutInitWindowPosition(50,100); /设置窗体的顶部和左边位置glutInitWindowSize(800,600); /设置窗体的高度和宽度glutCreateWindow(“五角星“ ); /创建显示窗体init(); glutDisplayFunc(PolyScan); glutMainLoop(); 5. 实验结果(1)(2)(3)

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报