圆的扫描转换
计算机图形学作业1

1.直线的扫描转换程序代码:figure('Name','数值微分法画直线','Color','w');axis([-2,6,-2,6]);AX=gca;grid(AX,'on');x0=0;y0=0;x1=5;y1=2;k=(y1-y0)/(x1-x0);x=x0;y=y0;while x<=x1hold on ;plot(x,round(y),'r.','MarkerSize',30);pause(2);x=x+1;y=y+k;end ;图像:-2-10123456-2-1123456figure('Name','中点画线法画直线','Color','w');axis([-2,6,-2,6]);AX=gca;grid(AX,'on');x0=0;y0=0;x1=5;y1=2;a=y0-y1;b=x1-x0;d=2*a+b;d1=2*a;d2=2*(a+b);x=x0;y=y0;hold on;plot(x,y,'r.','MarkerSize',30);while x<=x1if d<0x=x+1;y=y+1;d=d+d2;elsex=x+1;d=d+d1;end;hold on;plot(x,y,'r.','MarkerSize',30);pause(2);end;2.圆的扫描转换%step1 设置换面figure('Name','中点画圆法','Color','w'); axis([-10,10,-10,10]);AX=gca;grid(AX,'on');grid MINOR;%step2 初始点及圆半径x=0; %初始点y=5;r=5; %圆半径e=1-r;%step3 画图hold on;plot(x,y,'r.','MarkerSize',30); %顶点pause(1);plot(x,-y,'r.','MarkerSize',30); %底点 pause(1);plot(y,x,'r.','MarkerSize',30); %右顶点 pause(1);plot(-y,x,'r.','MarkerSize',30); %左顶点 pause(1);while x<=yif e<0e=e+2*x+3;x=x+1;elsee=e+2*(x-y)+5;x=x+1;y=y-1;end;hold on;plot(x,y,'r.','MarkerSize',30);pause(1);plot(y,x,'r.','MarkerSize',30);pause(1);plot(-x,y,'r.','MarkerSize',30);pause(1);plot(-y,x,'r.','MarkerSize',30);pause(1);plot(x,-y,'r.','MarkerSize',30); pause(1);plot(y,-x,'r.','MarkerSize',30);pause(1);plot(-x,-y,'r.','MarkerSize',30); pause(1);plot(-y,-x,'r.','MarkerSize',30); pause(2);end;3.颜色%step 1 设置画面figure('Name','色彩的运用','Color','w'); axis([-10,10,-10,10]);axis off;%step 2 初始点及圆的半径x=0;y=5;r=5;e=1-r;M=zeros(2,100); %用于存放圆上点的坐标的矩阵count=1; %计数器M(:,count)=[x;y]; %初始点坐标存入M中%step 3 生成八分之一的圆周上的点while x<=yif e<0e=e+2*x+3;x=x+1;elsee=e+2*(x-y)+5;x=x+1;y=y-1;end;count=count+1;M(:,count)=[x;y]; %新产生的点放入M end;%step4 生成整个圆周上的点x_ins=M(1,1:count); %八分之一圆弧y_ins=M(2,1:count);x_ins=[x_ins,y_ins(count:-1:1)]; %四分之一圆弧y_ins=[y_ins,x_ins(count:-1:1)];x_ins=[x_ins,x_ins(2*count:-1:1)]; %二分之一圆弧y_ins=[y_ins,-y_ins(2*count:-1:1)];x_ins=[x_ins,-x_ins]; %整个圆y_ins=[y_ins,-y_ins];%step5 画圆flag=0;c_ins=['r','g','b','y','m','c','w']; %颜色hold onfor i=1:2plot(x_ins(i),y_ins(i),'o','MarkerEdgeColor','w','MarkerFaceColor',c_ ins(i),'MarkerSize',15);end;pause(0.1);while flag<40*counthold onplot(x_ins(mod(flag+1,8*count)+1),y_ins(mod(flag+1,8*count)+1),'o','M arkerEdgeColor','w','MarkerFaceColor',c_ins(mod(mod(flag+1,8*count)+1 ,7)+1),'MarkerSize',15);plot(x_ins(mod(flag,8*count)+1),y_ins(mod(flag,8*count)+1),'o','Marke rEdgeColor','g','MarkerFaceColor','w','MarkerSize',10);pause(0.3);flag=flag+1;end;。
基本图形的光栅化算法

基本图形的光栅化算法如何在指定的输出设备上根据坐标描述构造基本⼆维⼏何图形(点、直线、圆、椭圆、多边形域、字符串及其相关属性等)。
图形⽣成的概念图形的⽣成:是在指定的输出设备上,根据坐标描述构造⼆维⼏何图形。
图形的扫描转换:在光栅显⽰器等数字设备上确定⼀个最佳逼近于图形的象素集的过程。
直线段的扫描转换直线的绘制要求(1)直线要直;(2)直线的端点要准确,⽆定向性⽆断裂;(3)直线的亮度、⾊泽要均匀;(4)画线的速度要快;(5)具有不同的⾊泽、亮度、线型等。
解决的问题:给定直线两端点P0(x0,y0)和P1(x1,y1),画出该直线。
逐点⽐较法:数值微分法(DDA法):增量算法直观、易实现不利于⽤硬件实现x(i+1) = x(i) + 1y(i+1) = y(i) + k中点Bresenhan算法:算法原理:根据直线的斜率确定或选择变量在x或y⽅向上每次递增⼀个单位,⽽另⼀⽅向的增量为1或0,它取决于实际直线与相邻象素点的距离,这⼀距离称为误差项。
中点Bresenham算法——算法步骤输⼊直线的两端点P0(x0,y0)和P1(x1,y1)。
计算初始值△x、△y、D=△x-2△y、x=x0、y=y0。
绘制点(x,y)。
判断D的符号。
若D<0,则(x,y)更新为(x+1,y+1),D更新为D+2△x-2△y;否则(x,y)更新为(x+1,y), D更新为D-2△y。
当直线没有画完时,重复上⼀步骤,否则结束。
改进的Bresenhan算法——算法步骤1.输⼊直线的两端点P0(x0,y0)和P1(x1,y1)。
2.计算初始值△x、△y、e=-△x、x=x0、y=y0。
3.绘制点(x,y)。
4.e更新为e+2△y,判断e的符号。
若e>0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2△x;否则(x,y)更新为(x+1,y)。
5.当直线没有画完时,重复步骤3和4。
否则结束。
圆的扫描转换解决的问题:绘出圆⼼在原点,半径为整数R的圆x2+y2=R2。
计算机图形学——圆的扫描转换(基本光栅图形算法)

计算机图形学——圆的扫描转换(基本光栅图形算法)与直线的⽣成类似,圆弧⽣成算法的好坏直接影响到绘图的效率。
本篇博客将讨论圆弧⽣成的3个主要算法,正负法、Bresenham 法和圆的多边形迫近法,在介绍算法时,只考虑圆⼼在原点,半径为R的情况。
⼀、正负法1、基本原理假设已选取Pi-1为第i-1个像素,则如果Pi-1在圆内,就要向圆外⽅向⾛⼀步;若已在圆外就要向圆内⾛⼀步。
总之,尽量贴近圆的轮廓线。
2、正负法的具体实现1)圆的表⽰:设圆的圆⼼为(0,0),半径为R,则圆的⽅程为:F(x,y)=x2+y2–R2=0当点(x,y)在圆内时,F(x,y)<0。
当点(x,y)在圆外时,F(x,y)>0。
2)实现步骤第1步:x0=0,y0=R第2步:求得Pi(x i,y i)后找点P i+1的原则为:当P i在圆内时(F(xi,yi)≤0),要向右⾛⼀步得P i+1,这是向圆外⽅向⾛去。
取x i+1= x i+1, y i+1= y i当P i在圆外时(F(xi,yi)>0),要向下⾛⼀步得P i+1,这是向圆内⽅向⾛去,取x i+1= x i, y i+1= y i-1⽤来表⽰圆弧的点均在圆弧附近且 F(xi, yi)时正时负假设已经得到点(x i, y i),则容易算出F(x i, y i),即确定了下⼀个点(x i+1, y i+1),则如何计算F(x i+1, y i+1),以确定下下个点(x i+2, y i+2)?分为两种情况:右⾛⼀步后:x i+1=x i+1,y i+1=y i,此时:F(x i+1, y i+1)=x i+12+y i2-R2=x i2+y i2-R2+2x i+1 = F(x i, y i)+2x i+1下⾛⼀步后:x i+1=x i,y i+1=y i-1, 此时:F(x i+1, y i+1)=x i2+(y i-1)2-R2= F(x i, y i)-2y i+1由此可得:确定了F(xi+1, yi+1)之后,即可决定下⼀个点(xi+2, yi+2),选择道理同上。
{实用}直线圆的各种插补算法

第四章、基本图形生成算法教学目的:1、知道图形生成中的基本问题;2、熟练掌握直线的扫描转换、圆与椭圆的扫描;3、掌握区域填充;4、了解线宽与线型的处理。
�在光栅显示器上显示的任何一种图形,实际上都是一些具有一种或多种颜色的象素的集合。
�生成算法即图形设备生成图形的方法,也叫光栅化或或图形的扫描转换,是确定一个象素集合及其颜色,用于显示一个图形的过程。
确定一个象素集合及其颜色,用于显示一个图形的过程,称为图形的扫描转换或光栅化。
�对图形的扫描转换分为两部分:先确定像素,再用图形的颜色或其他属性进行某种写操作。
绘图元素�构成图形的基本元素,主要有点、直线、圆和曲线等。
图形元素包含的信息:①图元的类型②图元的几何信息③图元的非几何信息;④图元的指针信息11、点22、位置33、像素44、直线55、曲线66、填充点、线图形基元包括:多边形、曲线、字符串 实心图形(或称图形填充)一级图形元素二级图形元素第一节、扫描转换算法一、坐标系1.用户坐标系�在实际世界中用来描述物体的位置、形状等。
坐标单位任意,坐标值是实数、范围不限。
2.笛卡尔坐标系(直角坐标系)�在计算机图形学中使用用来描述物体。
3.设备坐标系�在某一特定设备上用来描述物体,如显示器的屏幕坐标系,绘图仪的绘图坐标系。
坐标单位为像素、步长,即设备的分辨率。
坐标值是整数,有固定的取值范围。
4.规范坐标系�在通用图形软件包中使用的用来描述物体数据所采用的坐标系。
�目的是为了使通用图形软件包摆脱对具体物理设备的依赖性,也为了便于在不同应用和不同系统之间交换图形信息。
�坐标单位任意取,坐标取值范围是[0,1]区间。
笛卡儿坐标系与屏幕坐标系的转换�屏幕(x,y)=(x笛卡儿+x最大分辨率/2,y最大分辨率/2- y笛卡儿)二、笛卡尔坐标系和设备坐标系中相关概念的区别(1)像素点�·在几何学中,点没有准数,没有大小,只表示了在坐标系统中的一个位置。
·在图形系统中,点要由数值坐标表示。
计算机图形学习题解答

初始值 d2用下半部分计算的最后像素点的坐标值来计算。
已知椭圆的长半轴a=12,b=8.用中点Bresenham画椭圆算法 确定第二象限椭圆弧上的像素点的位置,初始点为(-12,0).
解: 根据题意,先绘制椭圆弧的下半部分. y是最大位移方向,每次走一步,在y方向上加1,x方向上加1或加0. 构造判别式:
(4)d的初始值
d0
F
R 0.5, 2
R 2
1
1.25
2R 2
5.9解: 根据题意,算法要从点(a,0)到(0,b)逆时针确定第一象限椭圆弧。
先绘制椭圆弧的下半部分.
y是最大位移方向,每次走一步,在y方向上加1,x方向上减1或0.
构造判别式:
d1 F (xi 0.5, yi 1) b2 (xi 0.5)2 a2 ( yi 1)2 a2b2
4 2 2
45 2 2
1 1
5-2 2 4-2 2 1
(2)
1 0 0 0 1 0 1 0 0 0 1 0
T2
0
1 0 • 1 0 0 • 0 1 0 1 0 0
5 4 1 0 0 1 5 4 1 9 -1 1
4 1 1
8 3 1
7 3 1 • T2= 6 6 1
7 7 1
2 6 1
当d1 0时 d1 F (xi 0.5, yi 2) b2 (xi 0.5)2 a2 ( yi 2)2 a2b2 d1 a2 (2 yi 3) d1 288yi 432
d1的初始值:d1 F 11.5,1 608
下面绘制椭圆弧的上半部分. x是最大位移方向,每次走一步,在x方向上加1,y方向上加1或加0. 构造判别式:
计算机图形学基础课后部分习题答案

xi+1 xi+2
第四象限
-6-
d0=F(x0+1,y0-0.5)=-(k+0.5) 令 Di=2dxdi,得 D0=-(dx+2dy),D 与 d 同号 当 Di≥0,下一点(xi,yi-1),Di+1=Di-2dy 当 Di≤0,下一点(xi+1,yi-1),Di+1=Di-2(dx+dy)
计算机图形学基础试题

名词解释:1图形的扫描转换:确定最佳逼近图形的象素集合,并用指定的颜色和灰度设置象素的过程称为图形的扫描转换或光栅化。
2区域填充:区域填充指先将区域的一点赋予指定的颜色,然后将该颜色扩展到整个区域的过程。
3图形:通常由点、线、面、体等几何元素和灰度、色彩、线型、线宽等非几何属性组成, 强调场景的几何表示,由场景的几何模型和景物的物理属性共同组成。
4直线的扫描转换:当我们对直线进行光栅化时,需要在显示器有限个象素中,确定最佳逼近该直线的一组象素,并且按扫描线顺序,对这些象素进行写操作,这个过程称为用显示器绘制直线或直线的扫描转换。
5剪裁:确定图形中哪些部分落在显示区之内,哪些落在显示区之外,以便只显示落在显示区内的那部分图形的选择过程称为裁剪。
6计算机图形学:计算机图形学是研究怎样用数字计算机生成、处理和显示图形的一门学科。
7种子填充算法:根据已知多边形区域内部的一个象素点来找到区域内其它象素点,从而对多边形区域内部进行填充。
8走样:在光栅显示设备上,由于象素点和象素点之间是离散的,因此用象素点阵组合出的图形,与真实景物之间必然存在一定的误差。
比如,直线或曲线往往呈现锯齿状,细小物体在图上显示不出来等。
这种现象就是图形的走样9CRT:一种真空器件,它利用电磁场产生高速的、经过聚焦的电子束,偏转到屏幕的不同位置轰击屏幕表面的荧光材料而产生可见图形。
10区域:是指已经表示成点阵形式的填充图形,它是像素集合。
11.图形和图象主要不同之处:在计算机图形学中,前者是指矢量表示的图,后者是指用点阵表示的图。
12.随机扫描和光栅扫描主要不同之处:前者是电子束扫描路径随图形不同而不同,后者是电子束扫描路径固定不变。
填空:1.刷新式CRT图形显示器按扫描方式分为随机扫描和光栅扫描两种。
2.屏幕上最小的发光单元叫做象素点,它的多少叫做分辨率,颜色深度指的是位平面的个数。
3.汉字字库一般可分为电阵字库和矢量字库两种。
4.在线段AB的区域编码裁剪算法中,如A、B两点的码均为零,则该线段位于窗口内;如A、B两点的码按位与不为零,则该线段在窗口外。
【中南大学】计算机图形学习题及答案

计算机图形学作业答案第一章序论第二章图形系统1.什么是图像的分辨率?解答:在水平和垂直方向上每单位长度(如英寸)所包含的像素点的数目。
2.计算在240像素/英寸下640×480图像的大小。
解答:(640/240)×(480/240)或者(8/3)×2英寸。
3.计算有512×512像素的2×2英寸图像的分辨率。
解答:512/2或256像素/英寸。
第三章二维图形生成技术1.一条直线的两个端点是(0,0)和(6,18),计算x从0变到6时y所对应的值,并画出结果。
解答:由于直线的方程没有给出,所以必须找到直线的方程。
下面是寻找直线方程(y =mx+b)的过程。
首先寻找斜率:m =⊿y/⊿x =(y2-y1)/(x2-x1)=(18-0)/(6-0) = 3 接着b在y轴的截距可以代入方程y=3x+b求出 0=3(0)+b。
因此b=0,所以直线方程为y=3x。
2.使用斜截式方程画斜率介于0°和45°之间的直线的步骤是什么?解答:(1)计算dx:dx=x2-x1。
(2)计算dy:dy=y2-y1。
(3)计算m:m=dy/dx。
(4)计算b: b=y1-m×x1(5)设置左下方的端点坐标为(x,y),同时将x end设为x的最大值。
如果dx < 0,则x=x2、y=y2和x end=x1。
如果dx > 0,那么x=x1、y=y1和x end=x2。
(6)测试整条线是否已经画完,如果x > x end就停止。
(7)在当前的(x,y)坐标画一个点。
(8)增加x:x=x+1。
(9)根据方程y=mx+b计算下一个y值。
(10)转到步骤(6)。
3.请用伪代码程序描述使用斜截式方程画一条斜率介于45°和-45°(即|m|>1)之间的直线所需的步骤。
假设线段的两个端点为(x1,y1)和(x2,y2),且y1<y2int x = x1, y = y1;float x f, m = (y2-y1)/(x2-x1), b = y1-mx1;setPixel( x, y );/*画一个像素点*/while( y < y2 ) {y++;x f = ( y-b)/m;x = Floor( x f +0.5 );setPixel( x, y );}4.请用伪代码程序描述使用DDA算法扫描转换一条斜率介于-45°和45°(即|m| ≤1)之间的直线所需的步骤。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中点画圆法程序代码
MidpointCircle(int r, int color) {
int x,y; float d; x=0; y=r; d=1.25-r; drawpixel(x,y,color); while(x<=y){
if(d<0){ d=d+2*x+3; x++ } else{d= d+2*(x-y) + 5; x++;y--; } } }
if(d<0){ d+ = 2*x+3; x++ } else{d+ = 2*(x-y) + 5; x++;y--; } } }
上述算法能否再改进呢?
算法步骤: 1.输入圆的半径R。 2.计算初始值d=1.25-R、x=0、y=R。 3.绘制点(x,y)及其在八分圆中的另外七个对称点。 4.判断d的符号。若d<0,则先将d更新为d+2x+3,再
将 (x,y) 更 新 为 (x+1,y) ; 否 则 先 将 d 更 新 为 d+2(xy)+5,再将(x,y)更新为(x+1,y-1)。 5.当x<=y时,重复步骤3和4。否则结束。
若d<0, 则P1 为下一个象素,那么再下一个象素 的判别式为:
d1 = F(xp + 2, yp - 0.5)
P1
= (xp + 2)2 + (yp - 0.5) 2 - r2
= d + 2xp +3
M
M
P2
即d 的增量为 2xp +3.
若d>=0, 则P2 为下一个象素,那么再下一个象 素的判别式为:
2 中点画圆法
利用圆的对称性,只须讨论1/8圆。第二个8分圆。
P(xp ,yp ) P1 M P2
P为当前点亮象素,那么,下一个点亮的象素可能 是P1(xp+1,yp)或P2(xp +1,yp +1)。
(|dy|=|x/y|*|dx|)
构造函数:F(X,Y)=X2 + Y2 - r2 ;则 F(X,Y)= 0 (X,Y)在圆上; F(X,Y)< 0 (X,Y)在圆内; F(X,Y)> 0 (X,Y)在圆外。
设M为P1、P2间的中点,M=(Xp+1,Yp-0.5)
P1
M P2
有如下结论: F(M)< 0 ->M在圆内-> 取P1 F(M)>= 0 ->M在圆外-> 取P2
为此,可采用如下判别式:
P1
M P2
d = F(M) = F(xp + 1, yp - 0.5) =(xp + 1)2 + (yp - 0.5) 2 - r2
算法优化
• 为了进一步提高算法的效率,可以将上面 的算法中的浮点数改写成整数,将乘法运 算改成加法运算,即仅用整数实现中点画 圆法。
• 使用e=d-0.25代替d
• e0=1-r • 当d为整数时(d<0)(d<-0.25)
算法步骤: 1.输入圆的半径R。 2.计算初始值d=1-R、x=0、y=R。 3.绘制点(x,y)及其在八分圆中的另外七个对称点。 4.判断d的符号。若d<0,则先将d更新为d+2x+3,
但仍要采用浮点运算、乘法运算、取整运算。
2)八分法画圆
利用圆的对称性:
y
y=-x (-y,x)
(y,x) y=x
(-(x,-y)
(-y,-x) (y,-x)
结论:只需对一个八分圆进行扫描转换。
y y=x
R
x
图5-10 1/8圆弧
3)画任意圆的方法
当圆心坐标(xc ,yc ) ,半径为整数r时: (x-xc)2+(y-yc)2=r2
d1 = F(xp + 2, yp - 1.5) = (xp + 2)2 + (yp - 1.5) 2 - r2 = d + (2xp + 3)+(-2 yp + 2)
P1
即d 的增量为 2 (xp - yp) +5.
M
P2 M
最后一个问题:判别式d的初始值
d0 F (1, r 0.5) 1 (r 0.5)2 r 2 1.25 r
xi1 xi 1 x 0, R 2
yi1 round(
R2
x2 i 1
)
当x取整数时,y须取整。
缺点:浮点运算,开方,
x
取整,不均匀。
也可应用圆的参数方程画出分布比较均匀的点. x = rcos y = rsin
i1 i (为一固定角度步长) xi1 round(R cosi1) yi1 round(R sini1)
第三讲 圆的扫描转换
1 基础知识 2 中点画圆法 3 Bresenham画圆法
1 基础知识
1)直接利用圆的方程生成圆
下面先以圆心在原点、半径r为整数的圆 为例,讨论圆的生成算法。
假设圆的方程为:
2
2
2
x +y =r
2
2
2
x +y =r
y = sqrt(t2 - x2)
在一定范围内,每给定一
y
x值,可得一y值。
再 将 (x,y) 更 新 为 (x+1,y) ; 否 则 先 将 d 更 新 为 d+2(x-y)+5,再将(x,y)更新为(x+1,y-1)。 5.当x<=y时,重复步骤3和4。否则结束。
中点画圆法程序代码
MidpointCircle(int r, int color) {
int x,y; float d; x=0; y=r; d=1-r; drawpixel(x,y,color); while(x<=y){
可以先对圆心坐标(0 ,0 ) ,半径为r的八分 圆进行扫描转换,根据圆的对称性,得到八 个对称点,再将这八个点进行平移,即可得 到原始圆上的对应点。
对于圆心在(x0,y0)、半径为r的圆,先对圆心在原 点,半径为r的8分圆进行扫描转换,每确定一个象素,可 输出原始圆的8个点。
void Circle8Points(int x0,int y0, int x,int y,COLORREF c) { pDC->SetPixel(x0+x,y0+y,c); pDC->SetPixel(x0-x,y0+y,c); pDC->SetPixel(x0+x,y0-y,c); pDC->SetPixel(x0-x,y0-y,c); pDC->SetPixel(x0+y,y0+x,c); pDC->SetPixel(x0-y,y0+x,c); pDC->SetPixel(x0+y,y0-x,c); pDC->SetPixel(x0-y,y0-x,c); }