计算机图形学划线实验报告.docx

上传人:b****6 文档编号:15512092 上传时间:2023-07-05 格式:DOCX 页数:12 大小:229.69KB
下载 相关 举报
计算机图形学划线实验报告.docx_第1页
第1页 / 共12页
计算机图形学划线实验报告.docx_第2页
第2页 / 共12页
计算机图形学划线实验报告.docx_第3页
第3页 / 共12页
计算机图形学划线实验报告.docx_第4页
第4页 / 共12页
计算机图形学划线实验报告.docx_第5页
第5页 / 共12页
计算机图形学划线实验报告.docx_第6页
第6页 / 共12页
计算机图形学划线实验报告.docx_第7页
第7页 / 共12页
计算机图形学划线实验报告.docx_第8页
第8页 / 共12页
计算机图形学划线实验报告.docx_第9页
第9页 / 共12页
计算机图形学划线实验报告.docx_第10页
第10页 / 共12页
计算机图形学划线实验报告.docx_第11页
第11页 / 共12页
计算机图形学划线实验报告.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

计算机图形学划线实验报告.docx

《计算机图形学划线实验报告.docx》由会员分享,可在线阅读,更多相关《计算机图形学划线实验报告.docx(12页珍藏版)》请在冰点文库上搜索。

计算机图形学划线实验报告.docx

计算机图形学划线实验报告

《计算机图形学》实验报告

实验一直线、圆(弧)生成算法

一、实验目的及要求

1.了解光栅图形显示器的工作原理和特点;

2.学习C/VC环境下的基本绘图方法;

3.实践与巩固直线的基本生成算法。

 

4.掌握直线扫描转换算法的原理及实现;

5.学习圆(弧)的基本生成算法;

6.实践圆(弧)的基本生成算法;

7.掌握圆弧扫描转换算法的原理及实现;

二、理论基础

1、有关直线生成算法有

DDA(数值微分)、中点画线线算法、Bresenham生成算法

数值微分法先算出直线的斜率,然后从起点开始,确定最佳逼近于直线的y坐标。

假设起点的坐标为整数。

让x递增1,y相应递增k。

中点划线算法中若直线在x方向增加一个单位,y的增量只能在0、1之间。

假设当前像素点已经确定,下一像素点就只可能有两种情况,将这两点的中点带入直线方程中,通过中点在直线的上、下方来判断下一点的坐标。

Bresenham算法是通过各行、各列像素中心构造一组虚拟网络格线,按直线从起点到中点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素。

2、有关画圆的算法

圆的扫描转换(中点画圆法)、Bresenham画圆算法

圆的扫描转换算法同中点画线类似,将圆分为8份,先讨论圆的第一象限上半部分,从(0,R)点顺时针确定最佳逼近于该圆弧的像素序列。

之后通过对称画出全部圆。

Bresenham画圆算法考虑圆在第一象限上的点,每确定一像素,则下一像素有三种可能,通过判断右下方的像素与圆的位置关系再分为三种情况,之后通过这三个点与圆的距离远近确定最佳逼近像素。

三、算法设计与分析

1、数值微分法

intx0=0,y0=0,x1=800,y1=400;//数值微分法,|k|<=1

floatdx,dy,k,x,y;

dx=x1-x0;

dy=y1-y0;

k=dy/dx;

y=y0;

for(x=x0;x<=x1;x++)

{

pDC->SetPixel(x,int(y+0.5),color);

y=y+k;

}

该程序中每一步的x、y值是用前一步的值加上一个增量来获得的。

在程序中y与k必须用浮点数表示,每一步都必须对y进行取整。

此程序只能用于计算|k|<=1的情形,当直线的斜率的绝对值超过1是,必须把x、y的地位进行交换,y每增加一,x相应增加1/k.

2中点画线法

COLORREFcolor=RGB(100,25,108);

intx0=0,y0=0,x1=800,y1=400;//中点画线法,0

inta,b,d1,d2,d,x,y;

a=y0-y1;

b=x1-x0;

d=2*a+b;

d1=2*a;

d2=2*(a+b);

x=x0;

y=y0;

pDC->SetPixel(x,y,color);

while(x

{

if(d<0)

{

x++;

y++;

d+=d2;

}

else

{

x++;

d+=d1;

}

pDC->SetPixel(x,y,color);

}

该程序只能用于计算斜率在0、1之间的直线,从中点划线法思想计算得出的初值d0=a+0.5b为浮点型数据,由于我们只需要d的符号,而且d的增量都是整数,只是其初始值包含小数,因此,在程序中我们可以用2d代替d,来摆脱小数,

在画别的的情况斜率的直线时,将此程序中的a,b,x,y做相应的改变,具体在源程序中呈现。

当画任意起始点的直线时,只需将x0、x1、y0、y1的次序做相应的调整使之满足程序所给条件。

3、Bresenham生成算法

intx0=0,y0=0,x1=800,y1=200;//0

intx,y,dx,dy,i;

floatk,e;

dx=x1-x0;

dy=y1-y0;

k=(float)dy/(float)dx;

e=-0.5;x=x0;y=y0;

for(i=0;i

{

pDC->SetPixel(x,y,255);

x=x+1;

e=e+k;

if(e>=0)

{

y=y+1;

e=e-1;

}

}

该程序原本要通过直线与网格交点与0.5之间的关系来判断下一像素点是取右方还是右上方(以斜率大与一为例),改进后的程序用e=d-0..5的正负判断下一像素点的取值。

当e大于0即对应d>0.5的情况,给e减去1以保证在d始终在0、1之间。

在画其他斜率时只需根据实际情况对该程序做一定的改动。

详细见源代码中

4、中点画圆法

COLORREFcolor=RGB(100,25,108);

intx,y,r=200;

floatd;

x=0;y=r;d=1-r;

pDC->SetPixel(x,y,color);

while(x

{

if(d<0)

{

d+=2*x+3;

x++;

}

else

{

d+=2*(x-y)+5;

x++;y--;

}

pDC->SetPixel(x+200,y+200,color);

pDC->SetPixel(x+200,-y+200,color);

pDC->SetPixel(-x+200,-y+200,color);

pDC->SetPixel(-x+200,y+200,color);

pDC->SetPixel(y+200,x+200,color);

pDC->SetPixel(y+200,-x+200,color);

pDC->SetPixel(-y+200,-x+200,color);

pDC->SetPixel(-y+200,x+200,color);

}

在画圆时用中点画圆法画出1/8圆,在描点时进行八次对称得到整个的图形。

5、Bresenham画圆算法

intr=200;

intx,y,d,d1,d2,dir;

x=0;y=r;

d=2*(1-r);

while(y>=0)

{

pDC->SetPixel(x+200,y+200,100);

pDC->SetPixel(x+200,-y+200,100);

pDC->SetPixel(-x+200,y+200,100);

pDC->SetPixel(-x+200,-y+200,100);

if(d<0)

{

d1=2*(d+y)-1;

if(d1<=0)

dir=1;

else

dir=2;

}

elseif(d>0)

{

d2=2*(d-x)-1;

if(d2<=0)

dir=2;

else

dir=3;

}

else

{

dir=2;

}

switch(dir)

{

case1:

x++;

d+=2*x+1;

break;

case2:

x++;

y--;

d+=2*(x-y+1);

break;

case3:

y--;

d+=(-2*y+1);

break;

}

}

在画圆时用Bresenham圆法画出1/4圆,在描点时进行八次对称得到整个的图形。

四、程序调试及结果的分析

由于画图中不能像以前的C语言一样自己输入起点和终点,于是我将直线斜率的五中情况放在一个程序中,直接赋上多组初值以实现不同斜率的直线,所有的结果都画出来了,但是直线在水平、笔直时完全没有一点锯齿出现,在其他斜率时会产生小锯齿,这在绘成的圆中看的较为明显。

这些都是由于像素点的选取所产生的误差,但这都是不可避免的。

五、实验心得及建议

第一次做计算机图形学实验,直线的生成是图形学中最基本也是最常见的图形生成,其原理与实现方法直接关系到其他复杂图形生成的效率,在之前上课中学习了直线的生成算法,并对其进行了改进。

我选用的数值微分法和中点画线法进行实验,斜率在0和1之间的直线都很容易绘制,而在其他的斜率就要通过改变程序中的部分来实现。

像数值微分方法在绘制斜率大于1的图形时就必须将原来程序上的x,y的地位交换,y每增加1,x相应增加1/k。

在刚开始我将中点画线法和数值微分法放在同一程序中,中点画线法定义的整型变量x,y,而数值微分法需要的是浮点型的变量,之前没有注意到这一点导致数值微分法的直线画不出来,在自习检查之后才发现这一错误。

之后再用Bresenham画线法画线的过程中我解决了一些课堂遗留问题,对画线方法的认识更加深刻了。

另外,在画圆的过程中,我用中点画线法进行,花了1/8的圆通过对称得到整圆。

起初将圆心选在(0,0)点,一直出现的是1/4圆,我没有意识到对话框里显示的只是第一象限的点,一直以为绘图方法出现了问题。

之后我将圆心移到点(200,200)得到了整个圆。

第一次的实验相对比较简单,在以后的实验中要吸取教训,不犯同样的错误。

 

姓名

院系班级

学号

实验日期

指导教师

实验成绩

(注:

可编辑下载,若有不当之处,请指正,谢谢!

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

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2