直线段的扫描转换计算机专业OpenGL实验.docx

上传人:b****4 文档编号:24135739 上传时间:2023-05-24 格式:DOCX 页数:7 大小:17.64KB
下载 相关 举报
直线段的扫描转换计算机专业OpenGL实验.docx_第1页
第1页 / 共7页
直线段的扫描转换计算机专业OpenGL实验.docx_第2页
第2页 / 共7页
直线段的扫描转换计算机专业OpenGL实验.docx_第3页
第3页 / 共7页
直线段的扫描转换计算机专业OpenGL实验.docx_第4页
第4页 / 共7页
直线段的扫描转换计算机专业OpenGL实验.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

直线段的扫描转换计算机专业OpenGL实验.docx

《直线段的扫描转换计算机专业OpenGL实验.docx》由会员分享,可在线阅读,更多相关《直线段的扫描转换计算机专业OpenGL实验.docx(7页珍藏版)》请在冰豆网上搜索。

直线段的扫描转换计算机专业OpenGL实验.docx

直线段的扫描转换计算机专业OpenGL实验

Exp-University

实验报告

课程名称计算机图形学实验

实验项目直线段的扫描转换

专业班级姓名Exp学号

指导教师成绩日期

一、实验目的

1、通过实验,进一步理解直线段扫描转换的DDA算法、中点bresenham算法以及改进bresenham算法的基本原理;

2、掌握以上算法生成直线段的基本过程;

3、通过编程,会在C/C++环境下完成用DDA算法、中点bresenham算法及bresenham算法对任意直线段的扫描转换。

二、实验设备及实验环境

1、计算机(每人一台)

2、VC++或其他C/C++语言程序设计环境

三、实验学时

2学时

四、实验内容

用DDA算法中点bresenham算法及bresenham算法实现任意给定两点的直线段的绘制(直线宽度和线型可自定)。

注:

1、实验报告的内容:

一、实验目的;二、实验原理;三、实验步骤;四、实验结果;五、讨论分析

(完成指定的思考题和作业题);六、改进实验建议。

2、各专业可在满足学校对实验教学基本要求的前提下,根据专业特点自行设计实验报告的格式,所设

计的实验报告在使用前需交实践教学管理科备案。

五、实验步骤

1、复习有关直线扫描转换算法的基本原理,明确实验目的和要求;

2、依据算法思想,绘制程序流程图;

3、设计程序界面,要求操作方便;

4、用C/C++语言编写源程序并调试、执行;

5、分析实验结果

6、对程序设计过程中出现的问题进行分析与总结;

7、打印源程序或把源程序以文件的形式提交;

8、按格式要求完成实验报告。

六、实验报告要求:

1、各种算法的基本原理;

2、各算法的流程图

3、实验结果及分析(比较三种算法的特点,界面插图并注明实验条件)

4、实验总结(含问题分析及解决方法)

七、实验原理

1、DDA算法(数值微分法)

数值微分法(DDA法,DigitalDifferentialAnalyzer)是一种直接从直线的微分方程生成直线的方法。

给定直线的两端点P0(x0,y0)和P1(x1,y1),得到直线的微分方程如下:

DDA算法原理:

由于直线的一阶导数是连续的,而且对于△x和△y是成正比的,故此可以通过在当前位置上分别加上二个小增量来求下一点的x,y坐标,如下图所示。

则有:

其中,ε=1/max(|△x|,|△y|)

分两种情况讨论如下:

(1)max(|△x|,|△y|)=|△x|,即|k|≤1的情况:

(2)max(|△x|,|△y|)=|△y|,此时|k|≥1:

注意:

由于在光栅化的过程中不可能绘制半个像素点,因此对求出的xi+1,yi+1的值需要四舍五入。

2、中点Bresenham算法

给定直线的两个端点坐标,可以得到直线的方程为:

   此时直线将平面分成三个区域:

对于直线上的点,F(x,y)=0;对于直线上方的点,F(x,y)>0;对于直线下方的点,F(x,y)<0,如下图所示。

图5-2直线将平面分为三个区域

   基本原理:

根据直线的斜率确定或选择变量在x或y方向上每次递增一个单位,而另一方向的增量为1或0,它取决于实际直线与相邻像素点的距离,这一距离称为误差项。

   如下图所示,假定0≤k≤1,x是最大位移方向。

算法每次在x方向上加1,y方向上加0或加1。

设当前点是P(xi,yi),则下一个点在Pu(xi+1,yi+1)和Pd(xi+1,yi)中选一。

以M点表示Pu与Pd的中点,又设Q点是理想直线与垂线x=xi+1的交点,根据Q点与M点的位置判断选取哪一个点。

图5-3Brensemham算法生成直线的原理

构造判别式如下:

   当d<0时,M在Q点下方,Pu距离Q点近,取Pu点;

   若d>0,M在Q点上方,Pd距离Q点近,取Pd点;

   若d=0,M与Q点重合,Pu和Pd都合适,约定取Pd。

故有:

 

误差项递推:

(1)当d<0时,下一个候选点为(xi+1,yi+1),再下两个候选点为(xi+2,yi+1)和

(xi+2,yi+2),他们的中点为(xi+2,yi+,故有:

此时,d的增量为1-k。

(2)当d>0时,下一个候选点为(xi+1,yi),再下两个候选点为(xi+2,yi)和(xi+2,yi+1),他们的中点为(xi+2,yi+,故有:

此时,d的增量为-k。

 

初始值d的计算:

但此时算法中仍然包含了浮点数运算,由于这里我们仅使用了判别式d的符号,所以可以用2d△x代替d来摆脱小数。

用2d△x代替d,令D=2d△x则:

 

3、改进Bresenham算法

基本原理:

假定直线段的0≤k≤1,如下图所示,过各行、各列像素中心构造一组虚拟网格线,按直线起点到终点的顺序计算直线与各垂直网格线的交点,交点与网格线的误差值为d。

   当d>时,直线更接近于像素点(x+1,y+1),当d<时,更接近于(x+1,y);当d=时,约定取(x+1,y)。

图5-4改进的Brensemham算法绘制直线的原理

误差项d的初始值为0,每走一步有d=d+k,一旦y方向上走了一步,就要把d减去1。

即有:

改进1:

令e=d-

改进2:

用E=2e△x来替换e

 

八、算法流程

1、DDA算法(数值微分法)

适用于任意斜率的直线

2、中点Bresenham算法

以下算法流程仅适用于斜率为0

对于斜率为k>1的直线,只需交换x、y的地位即可。

对于负斜率(包括-1

而对于水平、垂直、和k=±1的直线,无需使用扫描算法,直接绘制即可。

3、改进Bresenham算法

以下算法流程仅适用于斜率为0

对于斜率为k>1的直线,只需交换x、y的地位即可。

对于负斜率(包括-1

而对于水平、垂直、和k=±1的直线,无需使用扫描算法,直接绘制即可。

九、实验结果及分析

以下实验窗口所显示的直线为随机生成两端点后再绘制,并非通过鼠标点击输入端点。

1、DDA扫描算法绘制效果

由于描点较密集,通过拉伸窗体放大后可清晰看到“粒子”的效果:

DDA算法的核心代码为:

voidDDALine(intStrX,intStrY,intEndX,intEndY)

{

intdx=EndX-StrX;

intdy=EndY-StrY;

doublex=(double)StrX;

doubley=(double)StrY;

intepsl=max(abs(dx),abs(dy));

doublexIncre=(double)dx/(double)epsl;

doubleyIncre=(double)dy/(double)epsl;

/*描点*/

glBegin(GL_POINTS);

for(intk=0;k<=epsl;k++)

{

_str()函数把srting类型的k转换为constchar*类型,最终实现了在OpenGL窗口上输出直线斜率。

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

当前位置:首页 > 经管营销 > 人力资源管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1