计算机图形直线扫描转换生成
实验报告文档

done=TRUE;
}else if((code0.all&code1.all)!=0){
done=TRUE;
}else{
if(code0.all!=0){
x = x0; y = y0;
dx = x1 - x0; dy = y1 - y0;
d = dx - 2 * dy;
UpIncre=2*dx-2*dy;DownIncre=-2*dy;
while(x<=x1)
{
putpixel(x,y);
printf("x = %d , y = %d \n",x,y);
对剩余部分,把它作为新的线段看待,又从头开始考虑。两遍循环之后,就能确定该线段是部分截留下来,还是全部舍弃。
1、分区编码
延长裁剪边框将二维平面分成九个区域,每个区域各用一个四位二进制代码标识。各区代 码值如图中所示。
2、判别
根据C1和C2的具体值,可以有三种情况:
(1)C1=C2=0,表明两端点全在窗口内,因而整个线段也在窗内,应予保留。
(2)C1&C2≠0(两端点代码按位作逻辑乘不为0),即C1和C2至少有某一位同时为1,表明两端点必定处于某一边界的同一外侧,因而整个线段全在窗外,应予舍弃。
(3)不属于上面两种情况,均需要求交点。
3、求交点
假设算法按照:左、右、下、上边界的顺序进行求交处理,对每一个边界求完交点,并相关处理后,算法转向第2步,重新判断,如果需要接着进入下一边界的处理。
实验
类型
设计型
综合型
创新型
√
实
验
目
的
或
要
求
1.实验内容
计算机科学技术:计算机图形学题库三

计算机科学技术:计算机图形学题库三1、名词解释扫描转换答案:在矢量图形中,多边形用顶点序列来表示,为了在光栅显示器或打印机等设备上显示多边形,必须把它转换为点阵表示。
这种转换称为扫描转换。
2、单选下面对光栅扫描图形显示器描述正确的是()A.荧光粉涂层均匀离散分布;B.是一种点画设备;C.电子束从顶到底扫描;D.通过控制电子束的强弱实现色彩的强弱;答案:A3、填空题计算机图形系统由()系统和软件系统组成。
答案:硬件4、填空题在处理图形时常常涉及的坐标系有模型坐标系(),世界坐标系,观察坐标系,设备坐标系。
答案:局部坐标系5、单选计算机图形学与计算机图象学的关系是()。
A.计算机图形学是基础,计算机图象学是其发展B.不同的学科,研究对象和数学基础都不同,但它们之间也有可转换部分C.同一学科在不同场合的不同称呼而已D.完全不同的学科,两者毫不相干答案:B6、问答题简述中点分割法进行裁剪的过程?答案:中点分割剪取法,主要是对线段不断地进行对分,并排除在区域外的部分,找出线段落在窗口内的部分。
其方法主要是通过求出离线段的一个端点最近并且在区域内的点的方法,来确定线段落在窗口内的端点。
7、问答题局部光照模型和全局光照模型的不同之处是什么?答案:局部光照模型主要是考虑光源发出的光对物体的直接影响。
另外,全局光照模型除了处理光源发出的光之外,还考虑其他辅助光的影响,如光线穿过透明或半透明物体,以及光线从一个物体表面反射到另一个表面等。
8、判断题彩色阴极射线管主要是由红绿蓝三个彩色电子束的亮度不同,进而组合形成各种色彩的。
答案:错9、问答题什么叫做走样?什么叫做反走样?反走样技术包括那些?答案:走样指的是用离散量表示连续量引起的失真。
为了提高图形的显示质量。
需要减少或消除因走样带来的阶梯形或闪烁效果,用于减少或消除这种效果的方法称为反走样。
其方法是①前滤波,以较高的分辨率显示对象;②后滤波,即加权区域取样,在高于显示分辨率的较高分辨率下用点取样方法计算,然后对几个像素的属性进行平均得到较低分辨率下的像素属性。
第三章 基本图形的扫描转换讲解

本章学习目标
扫描转换的基本概念 Jack Elton Bresenham简介 直线的扫描转换算法 圆的扫描转换算法
本章内容
直线的扫描转换 圆的扫描转换 本章小结
直线、圆、椭圆是二维场景中的最基本图形。尽管 MFC的CDC类已经提供了相关的绘制函数,但直接使用 这些函数仍然无法满足真实感图形绘制的要求。光栅扫 描显示器是画点设备,基本图形的光栅化就是在像素点 阵中确定最佳逼近于理想图形的像素点集,并用指定颜 色显示这些像素点集的过程。当光栅化与按扫描线顺序 绘制图形的过程结合在一起时,也称为扫描转换。本章 从基本图形的生成原理出发,使用绘制像素点函数实现 基本图形的扫描转换。绘制像素点函数的原型为
1,
(di 0) (di 0)
(3-3)3.1.3 递推公式来自1.中点误差项的递推公式
M(x i+2,y i+1.5)
M(x i+2,y i+0.5)
Pu
Pu
Pi(xi,yi)
Pd
Pd
(a)di<0
Pi(xi,yi) (b)di≥0 中点的递推
(1)当d<0时
di1 F(xi 2, yi 1.5)
k y y1 y0 x x1 x0
直线水平方向位移 :
x x1 x0
直线垂直方向位移 :
y y1 y0
理想直线将平面划分成三个区域:对于直线上的 点,F(x,y)=0;对于直线上方的点,F(x,y)>0; 对于直线下方的点,F(x,y)<0。
假 设 直 线 的 斜 率 为 0≤k≤1 , 则 |△x|≥|△y| ,
y
O
x
圆的扫描转换
计算机图形学划线实验报告

实验一直线、圆(弧)生成算法一、实验目的及要求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、数值微分法int x0=0,y0=0,x1=800,y1=400;2中点画线法COLORREF color=RGB(100,25,108);int x0=0,y0=0,x1=800,y1=400; 5的正负判断下一像素点的取值。
当e大于0即对应d>的情况,给e减去1以保证在d始终在0、1之间。
在画其他斜率时只需根据实际情况对该程序做一定的改动。
《计算机图形学》实验指导书

计算机图形学实验指导书袁科计算机技术实验中心目录实验一实现DDA、中点画线算法和Bresenham画线算法 (24)实验二实现Bezier曲线 (25)实验三实现B样条曲线 (26)实验四实现多边形填充的边界标志算法 (27)实验五实现裁剪多边形的Cohen-Sutherland算法 (28)实验六二维图形的基本几何变换 (30)实验七画图软件的编制 (31)实验一实现DDA、中点画线算法和Bresenham画线算法【实验目的】1、掌握直线的多种生成算法;2、掌握二维图形显示原理。
【实验环境】VC++6.0/ BC【实验性质及学时】验证性实验,2学时,必做实验【实验内容】利用任意的一个实验环境,编制源程序,分别实现直线的三种生成算法,即数字微分法(DDA)、中点画线法以及Bresenham画线算法。
【实验原理】1、数字微分法(Digital Differential Analyzer,DDA)算法思想:基于直线的微分方程来生成直线。
ε=1/max(|△x|,|△y|)max(|△x|,|△y|)=|△x|,即|k|≤1 的情况:max(|△x|,|△y|)=|△y|,此时|k|≥1:2、中点画线法算法思想:每次在最大位移方向上走一步,另一方向是否走步取决于误差项的判断。
3、Bresenham画线算法算法思想:其基本思想同中点算法一样,即每次在最大位移方向上走一步,而另一个方向是否走步取决于误差项的判断。
【实验要求】1.上交源程序;2.上交实验报告,实验报告内容如下:(1) 实验名称(2) 实验目的(3) 算法实现的设计方法及程序流程图(4) 程序结果分析【分析与思考】(1) 上述所阐述的三个算法,其基本算法只能适用于直线的斜率(|K|<=1) 的情形,如何将上述算法进行推广,使其能够处理任意斜率的直线?(2) 计算机显示屏幕的坐标圆心在哪里,与我们平时的习惯有什么差异,如何协调二者?实验二 实现Bezier 曲线【实验目的】1、掌握Bezier 曲线的定义;2、能编程实现N 次Bezier 曲线的绘制与显示。
《计算机图形学》练习题答案

《计算机图形学》练习题(答案)《计算机图形学》练习题1.直线扫描转换的Bresenham算法(1) 请写出生成其斜率介于0和1之间的直线的Bresenham算法步骤。
(2) 设一直线段的起点和终点坐标分别为(1,1)和(8,5),请用Bresenham算法生成此直线段,确定所有要绘制象素坐标。
(1)①输入线段的两个端点,并将左端点存储在(x0,y0)中②将(x0,y0)装入帧缓存,画出第一个点③计算常量∆x, ∆y, 2∆y, and 2∆y-2∆x,并得到决策参数的第一个值:p0 = 2∆y - ∆x④从k=0开始,在沿线路径的每个xk处,进行下列检测:如果pk < 0,下一个要绘制的点就是(xk +1,yk) ,并且pk+1 = pk + 2∆y否则下一个要绘制的点就是(xk +1, yk +1),并且 pk+1 = pk + 2∆y- 2∆x⑤重复步骤4,共∆x-1次(2)m=(5-1)/(8-1)=0.57∆x=7 ∆y=4P0=2∆y-∆x=12∆y=8 2∆y-2∆x=-6 k pk (xk+1,yk+1)0 1 (2,2)1 -5 (3,2)2 3 (4,3)3 -3 (5,3)4 5 (6,4)5 -1 (7,4)6 7 (8,5)2.已知一多边形如图1所示,其顶点为V1、V2、V3、V4、V5、V6,边为E1、E2、E3、E4、E5、E6。
用多边形的扫描填充算法对此多边形进行填充时(扫描线从下到上)要建立边分类表(sorted edge table)并不断更新活化边表(active edge list)。
(1)在表1中填写边分类表中每条扫描线上包含的边(标明边号即可);(2)在表2中写出边分类表中每条边结构中各成员变量的初始值(3) 指出位于扫描线y=6,7,8,9和10时活化边表中包含那些边,并写出这些边中的x值、ymax值、和斜率的倒数值1/m。
表1边分y1边 x y max 1/m 4 1 1 97 4 60 05 1 9 76 0 0 61 9 6 6 0 0Y 值(Scan Line Number ) 边(Edge Number ) 1 0 2 0 3 0 4 E1 5 E6,E2 6 E6 7 E3 8 E5,E3 9E4 10 01 2 3 4 5 6 7 8 9 1表 2 边的初7 1 18 7 790 1-18 2 7 9 9 1 -19 3 36 9 991-13. 二维变换(1) 记P(xf,yf)为固定点,sx、sy分别为沿x 轴和y轴方向的缩放系数,请用齐次坐标(Homogeneous Coordinate)表示写出二维固定点缩放变换的变换矩阵。
计算机图形处理基础

13
第二章 计算机图形处理基础
2.2 基本算法 2.2.4 区域填充 2.2.4.1 单一颜色的多边形区域填充 1、多边形区域填充基本内容 多边形区域填充的基本想法是:按顺 序计算扫描线与多边形的相交区间, 然后对这些区间的象素赋上相应的颜 色。
14ቤተ መጻሕፍቲ ባይዱ
第二章 计算机图形处理基础
2.2 基本算法 2.2.4 区域填充 2.2.4.1 单一颜色的多 边形区域填充 1、多边形区域填充基 本内容
15
第二章 计算机图形处理基础
2.2 基本算法 2.2.4 区域填充 2.2.4.1 单一颜色的多边形区域填充 1、多边形区域填充基本内容
多边形对于一条扫描线的处理步骤为: (1)计算扫描线与多边形的交点; (2)把所有交点按x坐标递增顺序进行排序; ( 3 )将排序的交点进行配对,确定欲填充的区间 。如第一点与第二点,第三点与第四点等。 (4)对配对区间内的象素进行相应的颜色设置。
7
第二章 计算机图形处理基础
2.2 基本算法 2.2.1直线的扫描转换 3、布莱森汉姆画线法
8
第二章 计算机图形处理基础
2.2 基本算法 2.2.2圆弧的扫描转换算法 1、中点画圆法
9
第二章 计算机图形处理基础
2.2 基本算法 2.2.2圆弧的扫描转换算法 2、布莱森汉姆画圆法
10
第二章 计算机图形处理基础
V2
M
U ( xu , y u )
W
V1
6
第二章 计算机图形处理基础
2.2 基本算法 2.2.1直线的扫描转换 3、布莱森汉姆画线法 本算法与中点画线法类似,通过在每列 像素中确定与理想直线位置最近的像素 来进行直线的扫描转换。 其基本原理为:通过各行、列像素点中 心构造一组虚拟网格线,按直线从起点 到终点的顺序计算其与各垂直网格线的 交点,然后确定该列像素中与此交点最 近的像素。
东北大学计算机图形学4

DDA算法原理
• 对求出的xi+1,yi+1进行四舍五入,即 round(xi+1)=(int)(x i+1+0.5)或round(y i+1)=(int)(y i+1+0.5)
DDA算法原理
xi 1 xi x yi 1 yi y
其中,
yi+1 ε△y yi xi ε△x xi+1 x
y
1 / | x |, | x || y | 1 / max(|x |, | y |) 1 / | y |, | y || x |
示例图片
右图中,
红色填充点表示的线段: 起点为(0,0) 终点为(10,20)
绿色填充点表示的线段:
起点为(0,0) 终点为(20,10)
• • • • • • • • • • • • • • • • •
Void DDAline(int x0,int y0,int x1,int y1) { int dx,dy,epsl,k; 变量定义:整数型: dx,dy,epsl,k; float x,y,xIncre,yIncre; 符点型:x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; 变量赋初值:线段起点与终点的x,y轴向 x=(float)x0; y=(float)y0; 增量;起点变量类型转换后赋值。 if( abs(dx)>abs(dy)) epsl=abs(dx); else 求x,y轴向增量的大值。 epsl=abs(dy); xIncre=(float)dx/(float)epsl; 求线段在x,y轴向上的步进增量 yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { putPixel((int)(x+0.5),(int)(y+0.5))); x+=xIncre; y+=yIncre; } 增量式依次计算线段上个点,并输出。 }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西安工程大学实验报告
课程实验名称第 1 页共 5 页
系别实验日期年月日
专业班级组别_____________ 实验报告日期年月日
姓名学号报告退发 ( 订正、重做 )
E_mail:_________________________________ 教师审批评分___________________
直线扫描转换生成
一、实验目的和任务
1. 理解直线生成的基本原理
2. 编程实现Bresenham直线扫描生成算法
二、实验环境和设备
windows系统下 vs2012 c++
三、实验步骤和过程
过各行各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列像素中与此交点最近的像素
四、实验故障与排除
五、总结
附录
#include <glut.h>
void LineDDA(int x0, int y0, int x1, int y1/*,int color*/) {
int x, dy, dx, y;
float m;
dx = x1 - x0;
dy = y1 - y0;
m = dy / dx;
y = y0;
glColor3f(1.0f, 1.0f, 0.0f);
glPointSize(1);
for (x = x0; x <= x1; x++)
{
glBegin(GL_POINTS);
glVertex2i(x, (int)(y + 0.5));
glEnd();
y += m;
}
}
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0f, 0.0f, 0.0f);
glRectf(25.0, 25.0, 75.0, 75.0);
glPointSize(5);
glBegin(GL_POINTS);
glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.0f, 0.0f);
glEnd();
LineDDA(0, 0, 200, 300);
glBegin(GL_LINES);
glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(100.0f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(180.0f, 240.0f);
glEnd();
glFlush();
}
void Init()
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
}
void Reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("Hello World!");
Init();
glutDisplayFunc(myDisplay);
glutReshapeFunc(Reshape);
glutMainLoop();
return 0;
}。