第三章 基本图形的扫描转换讲解
课程]3.2图像的扫描变换
分解力
水平分解力N 垂直分解力M
通常用黑白相间的条纹数来描述,常称为线数
• 1. 垂直分解 图像垂直分解力 ——系统沿图像垂直方向所能分解的 力
像素(或黑白相间的条纹数)。它受扫描行数Z限制, 并小于扫描行数Z。因为在分解图像时并非每一行都有效
①垂直扫描中,有若干行作场逆程回扫 即:有效行数为:Z(1-β)( β: 场扫描逆程系数 ) ②扫描线的有效率问题 (如图)
Z max
M max 573 819 0.7 0.7
常用水平一行像素数与有效行数的乘积表示系统的分 解力或显示格式,并与存储量相对应。扫描行数Z根据 应用要求计算,对常规广播电视全球只有525行和625 行
3.2.2 逐行扫描与隔行扫描
• 当行扫描电流与场扫描电流同时分别流过 行、场偏转线圈时,电子束就在水平偏转 力与垂直偏转力的综合作用下匀速直线进 行扫描
1、扫描方式与图像的幅型
• 常用的扫描方式 1)机械扫描:飞点扫描 2)光束或电子束扫描(图像中应用最多): 随机扫描、光栅扫描、径向扫描、螺旋扫 描 • 图像的幅型 图像的尺寸和几何形状不仅影响电子束的 扫描和偏转方式,而且还决定图像信号的 频带和存储容量等重要参数
圆形屏幕:常采用径向或螺旋扫描
三维图像信号
fL(xm,yn,tk)
扫描
一维时间电信号
f ( t)
• 在摄像端通过图像扫描变换和光电变换, 将光电粑面的二维的平面像变成一维的时 间电信号 • 在显像端,通过相应的图像扫描和光电变 换重现图像
行扫描————水平扫描 扫描
场扫描———垂直扫描
3.2.1 扫描方式与图像的分解力
• 扫描:将光图像转换成顺序传送的电信号 的过程及其逆过程称为扫描,以一定的规 则进行,例如在读书时眼睛按照从左往右、 从上到下的规则扫描书本。 • 电视扫描的三个基本要素: 1)把图像分解成像素,逐个传输 2)像素的传输按照逐行进行 3)用画面传送运动过程,许多画面快速地 逐一出现,视觉将运动连贯起来
圆的扫描转换原理
1)若 ( , )<0,说明点 在圆内,则下一步应向圆外走,即 取
= +1, = 。
2)若 ( , )>0,说明点 在圆外,则下一步应向圆内走,即 取
= , = -1。
3)若 ( , )=0,说明点 在圆上,则下一步可以向圆外走,也可以向圆外走,这里规定 取 = +1, = 。
设R为弧AB的半径,记点P到原点的距离的平方பைடு நூலகம்圆的半径的平方之差为D(P),即
D(P)=( + -
根据D(P)定义,如果点Q在圆内,则D(Q)<0,如果Q在圆外,则D(Q)>0。假定 为圆弧上的点,则D( )>0,D( )<0。令
=D( )+D( )=( +1)2+ - +( -1)2+( -1)2-
正负法:该方法主要用于笔试绘图仪中,由于笔试绘图仪只有水平或垂直方向的运动,绘图笔每次只能向正右方或正下方运动,因此相应地在画圆时,只能从当前像素移动到其正右方或正下方的像素。
圆心在原点、半径R的圆方程的函数表达式为:
F(x,y)= + - =0
对于圆上的点,F(x,y)=0;对于圆内的点,F(x,y)<0;对于圆外的点,F(x,y)>0。对于第一象限内四分之一圆弧AB的绘制方法,利用对称性很容易绘制圆的其他部分。这里顺时针方向生成圆弧,并假定圆心和起点均精确地落在像素上。设起点A为 ( , ),则有 =0, =R。
Bresenham算法:画第一象限内八分之一个圆AB,从A点开始,顺时针画点,其他7个对称点即可。
从点A开始向右下方逐点寻找显示弧AB要用的点,如果 是已选中的一个表示圆弧上的点,由于圆弧在A、B两点之间斜率小于等于1,所以下一个点 ( +1, )或 ( +1, -1),选 还是选 ,取决于哪一个点更接近于弧AB。
计算机图形学_基本算法
应不同的设备。
12
返回
2
Ø曲线也可由直线段逼近生成 Ø解决的问题:给定直线两端点P0(x0,y0)
和P1(x1,y1),画出该直线。 主要步骤可以表示如下:
13
初值
偏差判别
移动绘图 偏差计算
终点 判断
N
Y 结束
图2-2 一般线段绘制过程的主要步骤示意图
• 偏差判别:根据当前绘图点位置与理想位置的偏差情况,确定
在不考虑线宽时,一维图形的扫描转 换主要是确定一维的像素序列,二维图 形的扫描转换是确定平面区域所对应的 像素集(称为区域填充)。
5
Ø 一般微机系统板上都配有图形显示缓冲区,
为了快速、及时地控制图形的输出,系统在基
本内存中开辟了从
A0000H ~ CFFFFH的256K字节
甚至到FFFFFH的512K字节
29
返回
因递推公式: Xi+1=Xi+1 yi+1 = kxi+1+b= k1xi+b+k∆x= yi+k∆x
所以:当 ∆x =1; yi+1 = yi+k。 即当x每递增1,y递增k(即直线斜率)
y
yi+1
2第三章基本图形的扫描转换
P(x,y)
3.3 椭圆的扫描转换
椭圆函数:F(x,y)= b2 x2 + a2 y2 - a2 b2
切线斜率 = -1 M1 上半部分 下半部分 M2
平面曲线在某点的偏导数(F’x,F’y) 为曲线在该点的法向量
偏导数:F’x(x,y)= 2b2x F’y(x,y)= 2a2y
在上半部分,法向量的y分量大, 2b2x < 2a2y 在下半部分,法向量的x分量大, 2b2x > 2a2y
椭圆弧的上半部分:
d1=F(Xp+1,Yp-0.5)= b2(Xp+1)2+a2(Yp-0.5)2-a2b2 • 若d1<0,中点在椭圆内,取正右方像素,判别式 更新为:d1'=F(Xp+2,Yp-0.5)=d1+b2(2Xp+3) d1的增量为b2(2Xp+3) • 当d1>=0,中点在椭圆外,取右下方像素, 判 别 式 更 新 为 :d1'=F(Xp+2,Yp1.5)=d1+b2(2Xp+3)+a2(-2Yp+2) d1的增量为b2(2Xp+3)+a2(-2Yp+2) • d1的初始条件:椭圆弧起点为(0,b), • d10=F(1,b-0.5)=b*b+a*a*(-b+0.25)
• •
实验内容:
– 适用于任意情况的DDA、Bresenham算法。
实验内容和步骤:
① 创建单文档MFC应用程序; ② 在OnDraw函数中编写代码;
③ 完成DDA、Bresenham算法;
④ 通过对话框进行起点和终点的输入。
3.2 圆的扫描转换
• 处理对象:圆心在原点的圆弧 • 利用圆的八对称性:
基本图形的扫描转换
= xi +1/k 即当y每递增1时,x递增斜率1/k
18 of 126
输出坐标求整
• 由于屏幕上的坐标为整数坐标,则真正作 为输出显示为:y输出=ROUND(yn),其中函 数ROUND ()是指舍尾的整数 • 因此y输出和yn 之间的量化误差最大为1。 为了改善这方面的误差,使x和y的值增加 0.5,使量化误差在(-0.5,0.5)范围之间 x=x0+0.5 y=y0+0.5 • ROUND(a)=(int)(a+0.5)
– (5)显示线段的速度应快
• 生成直线可用软件和硬件来实现,一般情况下,硬 件要比软件实现得快。
14 of 126
3.1.2 数值微分DDA直线生成算法
• 数值微分法,DDA(Digital Differential Analyzer)是根据数学上直线的微分方程来设计 的 • 设A(x0,y0),B(x1,y1)是直线的端点坐标,首先计 算出直线的斜率 k=dy/dx=△y/△x=(y1-y0)/(x1-x0) 直线方程为:y=kx+B 或 x=1/k*y+T
确定一个像素集合及其颜色用于显示一个图形的过程称为图形的扫描转换或光栅化也叫图形的生成126图形生成图形生成是根据图形的几何信息和属性信息结合图形生成算法计算出要显示的中间像素而不像图像生成是保存了图像的每一像素点的信息基本图形的生成首先要根据基本图形的特征找出它的几何信息然后根据一定的生成算法实时地在显示器上显示出完整的图形126图形扫描转换步骤一般分为两个步骤
24 of 126
3.1.3 中点直线生成算法
• 假定直线斜率0<K<1,且 已确定点亮象素点P(xi,yi), 则下一个与直线最接近的 像素只能是P1(xi+1,yi)点或 P2(xi+1,yi+1)点。设 M(xi+1,yi+0.5)为中点,Q 为交点 • 问题:如何确定下一个点 亮的象素?
计算机图形学之扫描转换线画图元的方法
扫描转换线画图元实验目的:通过上机实践,在C语言环境下实现扫描转换线画图元(直线、圆、椭圆)。
基本思想:利用计算出落在图元上或充分靠近它的一串像素,并以此像素集近似代替原连续图元在屏幕上的显示。
1、扫描转换直线段:(生成直线段的DDA算法)假设需扫描转换的直线段为P0(x0,y0)P1(x1,y1),再令∆x=x1-x0,∆y=y1-y0,斜率m=∆y/∆x,直线方程可以表示为:y=m*x+B ,求表示直线段P 0P1的像素集的最简单方法是利用直线方程直接计算。
以一个像素为单位分割区间[x0,x1],得到上的一个划分:x0,x1,…,x n,根据直线方程得到直线段上对应于横坐标xi的点的纵坐标为y i =m* x i +B,于是就得到了直线段上的点列{(x i,y i)},如图:利用公式:y i+1=mx i+1+B=m(x i+1)+B=mx i+B+m=y i+m得到直线。
2、扫描转换圆弧:该图元是利用圆的八对称性,扫描圆的八分之一弧而进行作图的。
利用函数CirclePoints()显示圆弧上任意一点(x,y)及其七个对称点;如图所示:在作图过程中需要设置中心坐标,否则程序默认圆心(0,0),这样我们看到的将会是1/4圆弧。
关于算法课本中已经讲的很清楚了,这里就不赘述了;3、扫描转换椭圆弧: 我们知道椭圆的方程为: X 2/a+y 2/b=1椭圆弧的画法类似于圆弧的画法,即只需要讨论第一象限内椭圆弧的生成。
进一步可以将椭圆弧分为上下两部分,其分界点为切线斜率为-1的点P ,再由公式: (yy x F x y x F ∂∂∂∂),(,),()=(2b 2x,2a 2y ) 因为(x,y )点的切向与法向垂直,为(-2a 2y , 2b 2x ),从而切线斜率为-1的满足 2b 2x=2a 2y ⇔b 2x=a 2y 由此编程可以得到椭圆。
扫描转换直线段、圆、椭圆的程序如下:#include <stdio.h> #include<graphics.h> #include<math.h> #include<conio.h> /*----画线段----*/void LineDDA(int x0,int y0,int x1,int y1,int color) {int x;float dy ,dx,y ,m; dx=x1-x0; dy=y1-y0; m=dy/dx; y=y0;for(x=x0;x<=x1;x++){putpixel(x,(int)(y+0.5),color); y+=m; }}/*----画圆----*/void CirclePoints( int xo,int yo,int x,int y,int color){putpixel(x+xo,y+yo,color); /*在坐标x,y指定的位置上画一个点*/ putpixel(y+yo,x+xo,color);putpixel(-y+yo,x+xo,color);putpixel(-x+xo,y+yo,color);putpixel(y+yo,-x+xo,color);putpixel(x+xo,-y+yo,color);putpixel(-x+xo,-y+yo,color);putpixel(-y+yo,-x+xo,color);}void MidPointCircle(int xo,int yo,int radius,int color){int x,y,d,deltaE,deltaSE;x=0;y=radius;d=5-4*radius;deltaE=12;deltaSE=20-8*radius;CirclePoints(xo,yo,x,y,color);while(y>x){if(d<=0){d+=deltaE;deltaSE+=8;}else{d+=deltaSE;deltaSE+=16;y--;}deltaE+=8;x++;CirclePoints(xo,yo,x,y,color);}}/*----画椭圆----*/void EllipsePoints(int x_c,int y_c,int x,int y,int color){putpixel(x+x_c,y+y_c, color);putpixel(-x+x_c,y+y_c,color);putpixel(-x+x_c,-y+y_c,color);putpixel(x+x_c,-y+y_c,color);}void MidPointEllipse(int x_c,int y_c,int a,int b,int color) {long x,y,d,xP,yP,squarea,squareb;squarea=(long)a*a;squareb=(long)b*b;xP=(int)(0.5+(float)squarea/sqrt((float)(squarea+squareb))); yP=(int)(0.5+(float)squareb/sqrt((float)(squarea+squareb))); x=0;y=b;d=4*(squareb-squarea*b)+squarea; /*初始化*/ EllipsePoints(x_c,y_c,x,y,color);while(x<=xP){if(d<=0)d+=4*squareb*(2*x+3);else{d+=4*squareb*(2*x+3)-8*squarea*(y-1);y--;}x++;EllipsePoints(x_c,y_c,x,y,color);}x=a;y=0;d=4*(squarea-a*squareb)+squareb;EllipsePoints(x_c,y_c,x,y,color);while(y<=yP){if(d<=0)d+=4*squarea*(2*y+3);else{d+=4*squarea*(2*y+3)-8*squareb*(x-1);x--;}y++;EllipsePoints(x_c,y_c,x,y,color);}}void main(){int a0,b0,a1,b1,c_color;int p0,q0,r,c_color1;int m0,n0,m1,n1,c_color2;int graphdriver,graphmode;graphdriver=VGA;graphmode=VGAHI;initgraph(&graphdriver,&graphmode,"\\TC");cleardevice();printf("enter the line start:");scanf("%d,%d",&a0,&b0);printf("enter the line end:");scanf("%d,%d",&a1,&b1);printf("enter the color mumber:");scanf("%d",&c_color);cleardevice();LineDDA(a0,b0,a1,b1,c_color);getch();cleardevice();printf("enter the center :"); /*输入图圆中心*/scanf("%d,%d",&p0,&q0);printf("enter the radius:"); /*输入图圆半径*/scanf("%d",&r);printf("enter the color mumber:"); /* 输入颜色值*/scanf("%d",&c_color1);cleardevice();MidPointCircle(p0,q0,r,c_color1);getch();cleardevice();printf("enter the center :"); /*输入中心坐标*/scanf("%d,%d",&m0,&n0);printf("enter the chang duan zhou chang:"); /*输入长短轴长*/scanf("%d,%d",&m1,&n1);printf("enter the color mumber:");scanf("%d",&c_color2);cleardevice();MidPointEllipse(m0,n0,m1,n1,c_color2);getch();closegraph();}在程序运行过程中,当然也出现了不少错误,这里只举一两例加以说明(1)、程序在运行过程中,在画椭圆的时候,图象中只有四个点,而不是连续的曲线,经过查阅书籍以及请教同学发现在函数体中缺少了math.h头文件,所以加上文件包含命令#include<math.h>即可出现连续的椭圆图象。
第3章03扫描
第5章扫描特征
3.3.1 扫描特征基本操作
1. 扫描工具与对话框
图3-2 扫描工具与对话框
第3章基础实体特征创建
2. 草绘与扫描属性设置
图3-3 草绘与扫描属性设置
第3章基础实体特征创建
3. 扫描属性与特征成型
图3-4 扫描属性与特征成型
第3章基础实体特征特征的建构。 范例 :轨迹线不封闭的扫描特征的建构。
第3章 扫描特征
3.3 扫描特征 3.3.1 扫描特征基本操作 3.3.2 扫描特征操作实例
第3章扫描特征
3.3 扫描特征
扫描特征(SWEEP)就是将某一草绘截面沿着轨迹线 移动而产生的特征,通过扫描可以形成实体、薄板或曲面 等。创建扫描特征时,需要确定扫描截面轮廓和扫描轨迹 线等特征参数。
图3-1 扫描特征
图3-5 扫描特征
第3章基础实体特征创建
1. 扫描工具与对话框 .
图3-6 扫描工具与对话框
第3章基础实体特征创建
2. 草绘扫描轨迹 .
图3-7 草绘扫描轨迹
第3章基础实体特征创建
3. 草绘扫描截面与成型 .
图3-8 草绘扫描截面与成型
第3章 二维线画图元的扫描转换
di 0 d i 2y d i 1 d i 2(y x) d 0 i
Bresenham算法
ei k ei 1 ei k 1
ei 0 ei 0
ei k ei 1 ei k 1
ei 0 ei 0
开始 void MidPointLine(int x0,int y0,int x1,int y1,int Color) { 初始x0,y0,x1,y1 计算初始ΔxΔy int deltaX = x1-x0; 计算初始d int deltaY = y1-y0; int d = deltaX - 2 * deltaY; 画点 int CurrentX = x0; int CurrentY = y0; int IncreaseNE = 2 * (deltaX - deltaY); 计算下一个d d>0 int IncreaseE = -2 * deltaY; do d+=e d+=ne 计算下一个x,y y++ y不变 { putpixel(CurrentX, CurrentY, Color); if (d > 0) 不到终点 d += IncreaseE; else 结束 { ( x0 , y0,r ) ( x0, y0) d += IncreaseNE; CurrentY ++; d 0 x 2y } di 0 CurrentX ++; d i 2y } while ( CurrentX < x1 ); d i 1 } di 0 d i 2(y x)
扫描转换直线段(6/7)
1 1 yi 1 [ yi ,r , yi ,r 1 ) 2 2
计算机图形学课件:5 椭圆的扫描转换
❖ 屏幕上位于yik和yik+1两条扫描线之间的长方 形区域被P 的边分割成若干梯形(三角形可看 作其中一底边长为零的梯形),这些梯形具有下 列性质:
2020/10/7
25
Region Coherence(2)
b2(xi 0.5 )2 a2(yi 1)2 a2b2 a2( 2 yi 3 )
d2 a2( 2 yi 3 )
2020/10/7
13
In region 2
d2<0,当前取Pr(xi+1, yi-1), 下一步的中点取(xi +1.5, yi-2)
P
yi
yi-1
yi-2
d'2 F(xi 1.5, yi 2) b2 (xi 1.5)2 a2( yi 2)2 a2b2
3.3椭圆的扫描转换 Scan converting ellipses
Characteristics of ellipses(1)
❖ Equation of standard ellipses
x2 y2 a2 b2 1
(-x,y)
y
(x,y) b
a
x
(-x,-y)
(x,-y)
对称性(symmetry)
{d1+= bb (2x+3); x++;} else
{d1+= bb (2x+3)+ aa (-2y+2); x++; y--;} Putpixel(x, y); } //上半部分椭圆弧
第一象限椭圆弧扫描转换中点算法(2)
计算机图形学(圆弧的扫描转换II)
椭圆弧 的生成
xi 1 a cos( i ) , yi 1 b sin( i )
由此可得
xi 1 xi y M y i 1 i
cos 其中 M b sin a
a sin b cos
P(xi,yi) P (x +1,y ) u i i M(xi+1,yi-0.5) Pd(xi+1,yi-1)
如果d1i >0,中点在椭圆外,应取右下方像素Pd(xi+1,yi-1) 判别式更新为:d1(i+1)=F(xi+2,yi-1.5)=d1i+b2(2xi+3)+2a2(-yi+1) 如果d1i ≤0,中点在椭圆内,应取正右方像素Pu(xi+1,yi) 判别式更新为:d1(i+1)=F(xi+2,yi-0.5)=d1i+b2(2xi+3) 判别式初值为:d10=F(1,b-0.5)=b2+a2(-b+0.25)
■ 圆穿越⑤区域时,D(Hi) > 0,D(Li) = 0,有 Di = | D(Hi) |-| D(Li) | = D(Hi) = di
结论: di的符号与Di的符号是否一致
2009-2010-2:CG:SCUEC
6
判别式di的增量计算
di = D(Hi)+D(Li) = [(xi-1+1)2+yi-12-R2]+[(xi-1+1)2+(yi-1-1)2-R2] 若di<0,表示Hi点更接近圆周,
2009-2010-2:CG:SCUEC
3
判别式的改进
第三章 图形基元扫描转换算法的实现
第3章图形基元扫描转换算法的实现目前,我们最常用的图形显示设备是光栅扫描式图形显示器,简称光栅显示器。
光栅显示器是一种画点设备,它可以看作是一个像素点矩阵,每个像素可以用一种或多种的颜色显示,分别称为单色显示器或彩色显示器。
在光栅显示器上显示的任何一种图形,实际上都是一些具有一种或多种颜色的像素的集合。
例如,光栅显示器不能直接从像素矩阵中的一个像素到另一个像素画一条直线,只能用尽可能的靠近这条直线路径上的像素点集合来近似的表示这条直线。
将图形描述转换成用像素点集合来表示的过程称为扫描转换。
为了降低图形扫描转换的复杂度,我们往往将复杂图形分解成一些基本的简单图形的组合,这些基本图形称为图形基元。
图形基元的选择可以有不同的方法,但是通常都会把线段、圆和多边形选为图形基元。
本章将通过MFC编程的方式实现线段、圆和多边形的扫描转换算法,并创建一个MFC应用程序项目来演示这些扫描转换算法的结果。
为了能够更好的演示扫描转化算法的结果,我们创建一个MFC应用程序项目(除了选择单文档外,其它选项使用默认选择),项目名称为ScanarithDemo,然后创建一个普通类CDraw,我们在该类中实现扫描转换算法。
为视图类CScanarithDemoView添加WM_LBUTTONDOWN(鼠标左键按下)消息、WM_LBUTTONDBLCLK(鼠标左键双击)消息、WM_MOUSEMOVE(鼠标移动)消息和WM_KEYDOWN(键盘按键按下)消息的处理函数,这样我们可以更灵活的决定图形基元的形状,然后调用相应的扫描转换函数进行绘制。
为了能够选择不同的扫描转换函数,我们在CScanarithDemoView类中添加如下成员变量,并在构造函数中设置它们的初始值为0:public://选择绘制哪种图形基元int m_SelectDraw;//选择使用哪种扫描转换算法int m_SelectArithmetic;再在CScanarithDemoView类中添加如下成员变量:public://节点列表CArray<CPoint,CPoint> m_PointsList;CArray是MFC封装的列表类,其对象声明方式与CList相同,上面的声明表示列表中存放的是CPoint对象。
计算机图形学-基本图形生成算法-图形的扫描转换
v 当i>0时,D在圆外,③④
Pi(xi,yi) H (xi+1,yi
)
v v
情形③,选mv ,mD d’=mD - mV =|(xi+1)2+(yi-1)2-R2
中最小者 ④ V③ | - |xi2+(yi-1)2-R2|(xi,yi-1)
D
(xi+1,yi-1)
=(xi+1)2+(yi-1)2-R2 + xi2+(yi-1)2-R2
v 构造一个行列式值为1的矩阵
v 对应的圆方程递推关系为 xn+1 = xn + єyn yn+1 = -єxn +(1-є2)yn= yn- єxn+1
DDA画圆法(3/3)
v 针对不同象限及顺逆时针画圆,赋给є适当的 符号
v є不同,圆形状不同, є大近似椭圆
Bresenham画圆算法(1/7)
v 三个常用算法:
1数值微分法(DDA) 2中点画线法 3Bresenham算法。
数值微分(DDA)法(1/5)
v 已知线段端点:P0(x0,y0), P1(x1,y1) v 直线方程
y=kx+b {(xi, yi)}, i=0,….n. v 浮点数取整 : yi=round(yi)=(int)(yi+0.5)
Bresenham画线算法(3/11)
v最大位移方向每次走一步
k<1时,x为最大位移方向
vy方向走步与否
P2
e’
取决于误差e值的大小
v误差计算
e P P1
v初值:e0= y/ x
v当e≥0.5时,最接近P2(xi+1,yi+1)
图像的扫描变换PPT课件
d. 消去行场逆程后的扫描光栅
第13页/共29页
逐行扫描电流波形: (a)行扫描锯齿波电流 (b)场扫描锯齿波电流
第14页/共29页
• 逐行扫描行场扫描关系
➢帧频:fF
场频: fV
行频: fH =1/ TH
➢ 逐行扫描方式中,每场的光栅都应互相重叠
➢ 设每场扫描行数为Z,则:
TV=ZTH
fH=ZfV
而且 THv TH f
行扫描周期:来回扫描一次所需时间 TH THf THr
行扫描逆程系数 一般18%左右
:逆程所占行周期的比例,即
THr TH
第6页/共29页
• 场扫描:垂直方向一行接着一行的扫描称为场扫
描正程:从上到下的过程
逆程:快速返回起点的过程
场扫描正程时间: TVr 场扫描逆程时间: TVf
场扫描周期 TV TVf TVr
场扫描逆程系数 :逆程所占行周期的比例,即 TVr ,一般在8%左右
TV
• 逆程消隐:为了使图像清晰而均匀,在逆程期间不
传送图像。在广播电视中所采取的措施是在逆程时
间让扫描电子束截止,使之不显示图像,即消隐
被消隐掉的扫描逆程不能分解图像
第7页/共29页
• 标称分解力:扫描的行数越多,分解成的像素数 越多,景物的细节就显示得越清楚,即主观感觉的 图像清晰度越高。可以用扫描行数Z来表示图像系统 的பைடு நூலகம்称分解力
第19页/共29页
•隔行扫描的缺点
(1)行间闪烁效应
在隔行扫描中,整个画面的变化是按场频重复的,它高 于临界闪烁频率因而没有大面积闪烁感。但就每行而言, 它仍是按帧频重复的,即每秒重复25次,这是低于临界 闪烁频率的。所以,当我们观看比较亮的细节时,仍会 感觉到行间闪烁
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本章学习目标
扫描转换的基本概念 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
圆的扫描转换
提出问题:
•默认的圆是圆心位于坐标系原点,半径为R的圆。 屏幕设备坐标系的原点位于左上角,绘制结果为1/4圆, 需要进行圆心平移或使用自定义坐标系可以绘制整圆。 •圆是椭圆的特例,使用椭圆中点Bresenham算法也可 绘制。
O
x
y
设备坐标系
y
O
x
自定义坐标系
3.2.1 算法原理
fi 0 fi 0
(3-8)
仍然根据(3-3)判断下一个点的y值
4.算法:
x=x0;y=y0; dx=x1-x0;dy=y1-y0; f=dx-2*dy;//式(3-7) for (i=1; i<=dx+1; i++) {setpixel(x,y,color); //画点 x=x+1; if (f<0) {y=y+1; //式(3-3) f=f+2*dx;}//式(3-8) f=f-2*dy; }
yi 1.5 k(xi 2) b
yi 0.5 k(xi 1) b 1 k
di 1 k ⑵当d≥0时
di1 F(xi 2, yi 0.5) yi 0.5 k(xi 2) b yi 0.5 k(xi 1) b k di k
具体算法(二)
f=dx-2*dy; for (i=1;i<=dx;i++) {setpixel(x,y,color); if (interchange==1) y=y+s2; else x=x+s1;//x++; if (f<0)
{if (interchange==1) x=x+s1; else y=y+s2;//y++ f=f-2*dx; } f=f+2*dy; }//for
5.实例
起点(2,1),终点(10,7),写出每步 fi,xi,yi
3.1.4 任意斜率直线的一般性算法
算法开始假设了直线的斜率为0≤k≤1,则 |△x|≥|△y|,x0<x1,y0<y1 。除假设情况外,另外还有7 种情况算法不能处理。
k =-1
|k|=∞ k =1
k<-1
k>1
-1≤k<0 0≤k≤1
3.1 直线的扫描转换
直线的扫描转换是在屏幕像素点阵中确定最佳逼近于 理想直线的像素点集的过程。计算机图形学要求直线的绘 制速度要快,即尽量使用加减法(增量算法),避免乘、 除 、 开 方 、 三 角 等 复 杂 运 算 。 最 著 名 的 算 法 是 由 J.E. Bresenham于1965年提出的Bresenham算法。
x0<x1,y0<y1 。 所 以 确 定 x 方 向 为 主 位 移 方 向 。 按 照 Bresenham原理,x方向上每次加1,y方向上加不加1取
决于中点误差项的值。
Pu
Pu
Pu
M
M
P(xi,yi)
Pd
P(xi,yi)
Pd
P(xi,yi)
Pd
直线中点Bresenham算法原理
假定直线的当前点是P,沿主位移x方向走一步,下 一点只能在Pu 和Pd两点中选取,Pu和Pd的中点为M 。显 然,若中点M在理想直线的下方,则Pu点距离直线近, 否则选取Pd。
直线是构成复杂图形的基本图元,场景中的模型往 往由成千上万条直线组成,所以直线的中点Bresenham 算法是本章学习的重点,自定义CLine类来绘制直线段。
3.2 圆的扫描转换
圆的扫描转换是在屏幕像素点阵中确定最佳逼近于 理想圆的像素点集的过程。圆的绘制可以使用简单方程 画圆算法或极坐标画圆算法,但这些算法涉及开方运算 或三角运算,效率很低。主要讲解仅包含加减运算的顺 时针绘制1/8圆的中点Bresenham算法原理,根据对称 性可以绘制整圆 。
It determines which points on a 2-dimensional raster should be plotted in order to form a straight line between two given points, and is commonly used to draw lines on a computer screen. It is one of the earliest algorithms discovered in the field of computer graphics.
直线的中点Bresenham算法小结: 1. 确定主位移方向。在主位移方向上每次加1,另一个
方向上加不加1,取决于中点误差项。 2. 计算f的初始值。 3. 区分f <0与f≥0两种情况,分别计算f的递推公式。 4. 算法中只有整数加减运算,效率很高
后面讲解的圆的中点Bresenham算法与椭圆的中点 Bresenham算法,采用类似的步骤。
P(-y,-x),P(y,-x),P(-x,y)。
x=-y
x=0
P(-x,y)
x=y P(x,y)
P(-y,x) P(-y,-x)
P(y,x) y=0
P(y,-x)
P(-x,-y)
P(x,-y)
圆的对称性
圆心在原点、半径为R的圆方程的隐函数表达式为:
F(x, y) x2 y2 R2 0
(3-9)
圆将平面划分成三个区域:对于圆上的点,F(x,y) =0;对于圆外的点,F(x,y)>0;对于圆内的点,F (x,y)<0。
根据圆的对称性,可以用四条对称轴x=0,y=0,x =y,x=-y将圆分成8等份。只要绘制出第一象限内的 1/8圆弧,根据对称性就可绘制出整圆,这称为八分法 画圆算法。假定第一象限内的任意点为P(x,y),可以顺 时针确定另外7个点:P(y,x),P(-y,x),P(x,-y),P(-x,-y),
Bresenham算法的特点: •Bresenham算法是一个经典的增量算法。在一个迭代 算法中,如果每一步的x,y值是用前一步的值加上一个 增量来获得的,那么这种算法就称为增量算法。 •Bresenham算法有几种变体,计算方法略有不同。本 章只介绍中点 Bresenham算法( Midpoint Bresenham Algorithm)。 •对于直线,中点Bresenham算法与Bresenham算法产 生同样的像素点,而且还可以扩展为更复杂的图形扫描 转换算法,如绘制圆的中点Bresenham算法和绘制椭圆 的中点Bresenham算法。
Bresenham retired from of service at IBM as a Senior Technical Staff Member in 1987. He taught for 16 years at Winthrop University.
Bresenham ‘s line algorithm, developed in 1965, is his most well-known innovation. “Algorithm for computer control of a digital plotter”。
3.1.2 构造中点误差项
从Pi(xi,yi)点出发选取下一像素时,需将Pu和Pd的 中点M(x i+1,y i+0.5)代入隐函数方程,构造中点误差 项di 。
di F (xi 1, yi 0.5) yi 0.5 k(xi 1) b(3-2)
yi1
yi yi ,
BOOL SetPixelV(int x, int y, COLORREF crColor);
直线、圆、椭圆的扫描转换主要使用Bresenham算法 实现。
Bresenham算法最初是为数字绘图仪提出,但同样 适用于CRT光栅显示器。
Jack Elton Bresenham
Plotter movement
y=y+1变成x=x+1;
(2) 如果x0>x1 , x=x+1变成x=x-1; 一般地:令s1=sign(x1-x0), x=x+1变成x=x+s1