第三章 基本图形的扫描转换
第三章 基本图形的扫描转换讲解
本章学习目标
扫描转换的基本概念 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
圆的扫描转换
图像的扫描变换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次,这是低于临界 闪烁频率的。所以,当我们观看比较亮的细节时,仍会 感觉到行间闪烁
课程]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)用画面传送运动过程,许多画面快速地 逐一出现,视觉将运动连贯起来
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 圆的扫描转换
• 处理对象:圆心在原点的圆弧 • 利用圆的八对称性:
计算机图形学作业3-6
第三章作业1.(6分)名词解释:扫描转换、增量算法、反走样。
扫描转换:基本图形的光栅化就是在像素点阵中确定最佳逼近与理想图形的像素点集,并用指定颜色显示这些像素点集的过程。
当光栅化与按扫描线顺序绘制图形的过程集合在一起时,也称为扫描转移。
增量算法:在一个迭代算法中,如果每一步X,Y值是用前一步的值加上一个增量来获得的,那么,这个算法就称为增量算法。
反走样:用于减轻走样的技术称为反走样或者称为抗锯齿。
2.(10分)计算起点坐标为(0,0),终点坐标(12,9)直线的中点Bresenham算法的每一步坐标值以及中点偏差判别式d的值,填入表3-1中,并用黑色绘制图3—29中的直线段的扫描转换像素。
图3—29 像素点阵x y d x y d0 0 —0。
25 7 5 —0.51 1 0 8 6 —0。
252 1 —0.75 9 6 03 2 —0.5 10 7 —0.754 3 -0.25 11 8 -0.55 3 0 12 9 —0.256 4 —0.75表3—1 x,y和d的值第四章作业1.(10分)名词解释:四邻接点、八邻接点、四连通域、八连通域、种子填充算法.四邻接点:对于多边形区域内部任意一个种子像素,其上、下、左、右这四个像素,称为四邻接点。
八邻接点:对于多边形区域内部任意一个种子像素,其上、下、左、右以及左上、左下、右上、右下这八个像素,称为八邻接点.四连通域:对于多边形区域内部任意一个种子子素出发,通过访问其上、下、左、右这四个邻接点可以遍历区域内部的所有像素,该多边形区域称为四连通域.八连通域:对于多边形区域内部任意一个种子子素出发,通过访问其上、下、左、右以及左上、左下、右上、右下这八个邻接点可以遍历区域内部的所有像素,该多边形区域称为八连通域.种子填充算法:从区域内任意一个种子像素开始,由内向外将填充色扩散到整个多边形区域的填充过程。
2. (10分)试写出图4—43所示多边形的边表和扫描线y =4的有效边表。
基本图形的扫描转换
= 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章 图形变换
对Y轴镜射 O
原始位置 X
对原点镜射
对X轴镜射
图3.4 镜射变换
Y 原始位置
4.对±45°线的镜射变换 (1)对+45°线的镜射
对+45°线 镜射
O
X
对+45°线的镜射应有: x* y, y* x ,
其镜射变换为
对-45°线镜
x
y y
x x
y
0 1
1 0
x
yT
射
图3.5 ±45°线镜射变换
在沿X轴的错切变换中,y坐标不变,x坐标有一增量。变换后原来 平行于Y轴的直线,向X轴方向错切成与X轴成一定的角度。而在沿 Y轴的错切变换中,x坐标不变,y坐标有一增量。变换后原来平行 于X轴的直线,向Y轴方向错切成与Y轴成一定的角度。
x *
y * x cy
y bx x
y
1 c
b 1
x
yT
式中
T
x1 y1 1 1 1 1
x2
y2 1 3 1 1
x3
y3
1
x4 y4 1
3 2 1 1 2 1
Y D(1,2)
A(1,1) O
C(3,2)
B(3,1) X
采用齐次坐标表示点主要有以下两个优点: (1)它为几何图形的二维、三维甚至高维空间的坐标变换提供了统 一的矩阵运算方法,并可以方便地将它们组合在一起进行组合变换。 (2)对于无穷远点的处理比较方便。例如,对于二维的齐次坐标
3.1 点的矩阵表示 3.2二维图形的基本变换 3.3 二维齐次坐标和齐次变换矩阵 3.4二维图形的组合变换 3.5三维图形的变换
3.6三维图形的投影变换
3.1 点的矩阵表示 3.1.1 点的矩阵表示
第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
03-扫描转换和区域填充
(3)最后考虑多边形的连贯性,即当某条边与当前扫描线 相交时,它很可能也与下一条扫描线相交。 为了避免求交运算,需要引进一套特殊的数据结构。这套 数据结构在后面的消隐算法中还要出现。
数据结构:
活性边表(AET):把与当前扫描线相交的边称为活性边,并把 它们按与扫描线交点x坐标递增的顺序存放在一个链表中。 结点内容(一个结点在数据结构里可用结构来表示) x: 当前扫描线与边的交点坐标 △x: 从当前扫描线到下一条扫描线间x的增量 ymax: 该边所交的最高扫描线的坐标值ymax x △x ymax
4 3
2
1
0
5 -3 P1P2
从上面这个指针数组 里面就知道多边形是从 哪里开始的。在这个指 针数组里只有1、2、3、 5处有边,因此当从下往 上进行扫描转换的时候, 从y=1开始做,而在1这 条线上有两条边进来了, 然后就把这两条边放进 活性边表来处理。
8 7 6 5 4 3 2
P6(2,7)
P4(11,8) F G B P5(5,5) P3(11,3) C D
即每做一次新的扫描线时,要对已有的边进行三 个处理:一是否被去除掉;如果不被去除,第二就 要对它的数据进行更新,。所谓更新数据就是要更 新它的x值,即x+△x;最后,就是有没有新的边进 来,新的边在NET里,可以插入排序插进来。 这个算法过程从来没有求交,这套数据结构使得 你不用求交点!避免了求交运算。
对于每条穿越多边形的 扫描线,X-扫描线算法确 定扫描线与多边形边相交 区间的像素点位置。
如扫描线y=3与多边形的 边界相交于4点:(2,3) 、(4,3)、(7,3)、 (9,3)。
y 12 11 10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10 11 12 x
计算机图形学课件: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)
第三章基本图形的扫描转换
基本图形的扫描转换。绘制像素点函数的原型为
BOOL SetPixelV(int x, int y, COLORREF crColor);
直线、圆、椭圆的扫描转换主要使用Bresenham算法 实现。
Br样 适用于CRT光栅显示器。
Jack Elton Bresenham
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。
3.1.2 构造中点误差项
is his most well-known innovation. “Algorithm for computer control of a digital plotter”。
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.
直线、圆、椭圆是二维场景中的最基本图形。尽管 MFC的CDC类已经提供了相关的绘制函数,但直接使用 这些函数仍然无法满足真实感图形绘制的要求。光栅扫
计算机图形学(圆弧的扫描转换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)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.实例
起点(2,1),终点(10,7),写出每步 fi,xi,yi
3.1.4 任意斜率直线的一般性算法
算法开始假设了直线的斜率为0≤k≤1,则 |△x|≥|△y|,x0<x1,y0<y1 。除假设情况外,另外还有7 种情况算法不能处理。
|k|=∞ k =-1 k<-1 k>1 0≤k≤1 k =0 0≤k≤1 -1≤k<0 k =1
3.1 直线的扫描转换
直线的扫描转换是在屏幕像素点阵中确定最佳逼近于 理想直线的像素点集的过程。计算机图形学要求直线的绘 制速度要快,即尽量使用加减法(增量算法),避免乘、 除 、 开 方 、 三 角 等 复 杂 运 算 。 最 著 名 的 算 法 是 由 J.E. Bresenham于1965年提出的Bresenham算法。
第三章
本章学习目标
扫描转换的基本概念 Jack Elton Bresenham简介 直线的扫描转换算法 圆的扫描转换算法
本章内容
直线的扫描转换 圆的扫描转换 本章小结
直线、圆、椭圆是二维场景中的最基本图形。尽管 MFC的CDC类已经提供了相关的绘制函数,但直接使用 这些函数仍然无法满足真实感图形绘制的要求。光栅扫
Bresenham算法的特点: •Bresenham 算法是一个经典的增量算法。在一个迭代 算法中,如果每一步的x,y值是用前一步的值加上一个 增量来获得的,那么这种算法就称为增量算法。
•Bresenham 算法有几种变体,计算方法略有不同。本
章只介绍中点 Bresenham 算法( Midpoint Bresenham Algorithm)。 •对于直线,中点 Bresenham 算法与 Bresenham 算法产 生同样的像素点,而且还可以扩展为更复杂的图形扫描
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”。
y
O
直线的扫描转换
x
光栅扫描显示器的本质决定它难以生成完美的直线 段,也不能保证直线段精确地通过起点和终点。绘制直 线段的基本要求: •直线要直。要求具有精确的起点和终点。 •直线无方向性。从起点绘制到终点的直线段与从终点 绘制到起点的直线段要重合。 •直线的绘制速度要快。即尽量使用加减法整数运算, 避免乘、除、开方、三角等复杂运算。
-1≤k<0
k>-1
k<-1
直线斜率的对称性
3.1.4 任意斜率直线一般性算法
原算法做如下改动:
(1) |△x|<|△y|情况处理 当|△x|<|△y|时,交换x与y,并设标志变量 interchange=1; 否则interchange=0; 原程序中:当interchange=1 时,x=x+1变成y=y+1, 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
直线、圆、椭圆的扫描转换主要使用Bresenham算法 实现。
Bresenham算法最初是为数字绘图仪提出,但同样 适用于CRT光栅显示器。
Jack Elton Bresenham
Plotter movement
Bresenham retired from of service at IBM as a
3.2 圆的扫描转换
圆的扫描转换是在屏幕像素点阵中确定最佳逼近于 理想圆的像素点集的过程。圆的绘制可以使用简单方程 画圆算法或极坐标画圆算法,但这些算法涉及开方运算 或三角运算,效率很低。主要讲解仅包含加减运算的顺 时针绘制 1/8 圆的中点 Bresenham 算法原理,根据对称 性可以绘制整圆 。
(3-7)
(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; }
直线的中点Bresenham算法小结: 1. 确定主位移方向。在主位移方向上每次加1,另一个 方向上加不加1,取决于中点误差项。 2. 计算f的初始值。 3. 区分f <0与f≥0两种情况,分别计算f的递推公式。 4. 算法中只有整数加减运算,效率很高
后面讲解的圆的中点Bresenham算法与椭圆的中点 Bresenham算法,采用类似的步骤。 直线是构成复杂图形的基本图元,场景中的模型往 往由成千上万条直线组成,所以直线的中点Bresenham 算法是本章学习的重点,自定义CLine类来绘制直线段。
y
O
x
圆的扫描转换
提出问题: •默认的圆是圆心位于坐标系原点,半径为R的圆。 屏幕设备坐标系的原点位于左上角,绘制结果为 1/4 圆, 需要进行圆心平移或使用自定义坐标系可以绘制整圆。 •圆是椭圆的特例,使用椭圆中点 Bresenham 算法也可 绘制。
y
O x
O
x
y
设备坐标系
自定义坐标系
3.2.1 算法原理
(3)同理,令s2=sign(y1-y0), y=y+1变成y=y+s2
具体算法(一)
int x=x0,y=y0; int dx=abs(x0-x1),dy=abs(y0-y1); int temp,interchange,f,i; int s1,s2; if (x1>x0) s1=1; else s1=-1;//sign(x1-x0) if (y1>y0) s2=1; else s2=-1; //sign(y1-y0) if (dy>dx) {temp=dx; dx=dy; dy=temp; interchange=1; } else interchange=0;
P(-y,-x),P(y,-x),P(-x,y)。
圆心在原点、半径为R的圆方程的隐函数表达式为:
F ( x, y) x 2 y 2 R 2 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),
具体算法(二)
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
u
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。
3.1.2 构造中点误差项
其中,因为(x 0,y 0)在直线上,所以
y0 kx0 b 0
则:
d 0 0.5 k
(3-6)
3.整数中点误差项
令fi=2di△x可去掉前面公式中的浮点数 则有
f 0 x 2y
f i1 f i 2x 2y f i 0 fi 0 f i 2y
yi 1.5 k ( xi 2) b
yi 0.5 k ( xi 1) b 1 k
di 1 k
⑵当d≥0时
di 1 F ( xi 2, yi 0.5) yi 0.5 k ( xi 2) b yi 0.5 k ( xi 1) b k di k
转换算法,如绘制圆的中点Bresenham算法和绘制椭圆
的中点Bresenham算法。
3.1.1 算法原理
直线的中点Bresenham算法的原理:每次在主位移 方向上走一步,另一个方向上走不走步取决于中点误 差项的值。 给定理想直线的起点坐标为P0(x0,y0),终点坐标 为P1(x1,y1),则直线的隐函数方程为:
(d i 0) (d i 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) (a)di<0