第四讲基本图形生成
1-03基本图形生成算法

3基本图形生成算法由于绘图机传动机构的限制,绘图时绘图笔只能作四个基本方向及组合的运动(共8个方向)。
每送一个信号就会驱使绘图笔沿8个方向之一移动一个步距,经过多次移动(形成阶梯状折线),即可给出人们需要的由折线逼近的复杂图形。
在显示器中绘制图形时,由于图形显示器像元的点阵分布,只能在显示器所给定的有限个像素组成的矩阵中,确定最佳逼近于该图形的一组像素。
绘图机的移动步距及显示器的像素决定着绘图的精度。
3.1直线的生成3.1.1数值微分法直线的斜率:x y k ∆∆=/。
其中,),(),(,,11000101y x y x y y y x x x 和-=∆-=∆分别是直线的端点坐标。
然后,从直线的起点开始,确定最佳逼近于直线的y 坐标。
假定端点坐标均为整数,让x 从起点到终点变化,每步递增1,计算对应的y 坐标,y=kx+B ,并取像素(x ,round(y))。
用这种方法既直观,又可行,然而效率较低。
这因为每步运算都需要一个浮点乘法与一个舍入运算。
注意到 xk y xk B kx Bx x k Bkx y i i i i i ∆+=∆++=+∆+=+=++)(11因此,当1=∆x 时,又k y y i i +=+1,既当x 每递增1时,y 递增k (即直线斜率)。
一开始,直线起点(x 0,y 0注意上述分析和算法仅适用于|k|<=1的情形。
在这种情况下,x 每增加1,y 最多增加1,故在迭代过程的每一步,只要确定一个像素。
而当直线斜率k 的绝对值超过1时,必须把x,y 的地位交换,y 每增加1,x 相应增加1/k 。
数值微分法的本质,是用数值方法解微分方程,通过同时对x,y 各增加一个小增量,计算下一步的x,y 值。
在一个迭代算法中,如果每一步的x,y 值是用前一步的值加上个增量来获得的,那么,这种算法就成为增量算法。
在这个算法中,y 和k 必须用浮点数表示,而且每一步运算都必须对y 进行舍入取整。
计算机地图制图原理与方法基本图形生成算法PPT课件

a=y0-y1; b=x1-x0;d=2*a+b; d1=2*a;d2=2* (a+b); x=x0;y=y0; while (x<=x1) { SetPixel (x, y, color); if (d<0) {x++;y++; d+=d2; } else {x++; d+=d1;} } /* while */ } /* midPointLine */
第13页/共34页
程序改进
void Bresenhamline (int x0,int y0,int x1, int y1,int color)
{ dx = x1-x0,;dy = y1- y0,;e=-dx;
x=x0; y=y0; for (i=0; i<=dx; i++)
从速度考虑,还 有那些可以改进?
第9页/共34页
3.2.3 生成直线的Bresenham算法
Yi+1 Yi
D
B A
C
xi
Xi+1
第10页/共34页
原理:
d
d
dd
假定直线斜率,0<k<1, 起点坐标为(x,y);
下一个点亮象素可能是:(x+1,y) 或 (x+1,y+1)。这可通过d值的大小来确定:
d = d+k, 当d>1 时 d=d-1 ;
d = F(xp + 2, yp - 0.5)
《基本图形的生成》课件

这份PPT课件旨在向您展示基本图形的生成方法,帮助您深入理解这一概念。 通过介绍不同的图形生成技术,我们将带您走进图形生成的魅力世界。
课件目标
清晰明了
通过简明的讲解和实例演示, 让您更好地理解基本图形的生 成。
生动有趣
用趣味的方式呈现内容,使您 在学习的过程中保持积极的关 注和参与。
2 B样条曲线
由多个片段构成,每个片段由一组控制点控制,灵活且逼近真实曲线。
3 样条曲线拟合通过一系列来自点来逼近实际曲线,生成光滑且高度接近的曲线。
矩形和正方形的生成
中心点和长度
顶点坐标和边长
通过确定矩形的中心点坐标和长度,可以轻松生成矩形。 通过指定正方形的顶点坐标和边长,可以迅速绘制出完 美的正方形。
3 持续学习和探索
图形的生成是一个广阔的领域,只有不断学习和探索,才能不断提高自己的图形设计能 力。
实用可应用
将学到的知识应用到实际案例 中,提供一些实用的技巧和建 议。
基本图形的定义
1 直观易懂
基本图形是由简单的几何元素组成,如点、线、矩形和圆形等。它们是构建更复杂图形 的基础。
2 重要性
理解基本图形的生成是学习图形设计和计算机图形学的关键,为后续学习打下坚实基础。
3 灵活性
基本图形可以通过不同的算法和技术进行生成,使其具备无限的创造力和变化性。
多边形
通过多个顶点的坐标来定义多 边形的边界,可以创造出封闭 和开放的多边形。
自定义图形
利用基本图形生成的技术和算 法,可以实现各种自定义的图 形效果。
总结和要点
1 学以致用
学习图形的生成技术,让您能够应用到实际的图形设计和计算机图形学项目中。
电脑图形教程基本图形生成算法

P2
e’
e P P1
y方向不走步
P2
e
e’
P
P1
Bresenham画线算法(6/7)
下一步误差的计算
当e≥0时,y方向走一步
e’=2y/ x - 1 =e + y/ x - 1 e’=e + 2y - 2x
当e<0时,y方向不走步
e’=2y/ x=e + y/ x e’=e + 2y
P2
光栅图形中点的表示
Address(x,y) = (xmax-xmin) * (y-ymin) + (x-xmin) + 基地址 = k1 + k2y + x
对像素连续寻址时,如何减少计算量?
Address(x±1,y) = k1 + k2y + (x±1) = Address(x,y) ± 1 Address(x,y±1) = k1 + k2(y ±1) + x = Address(x,y) ± k2 Address(x±1,y±1) = k1 + k2(y ±1) + (x±1)
实区域填充 字符 图形反走样
光栅图形中点的表示
…
地址线性表 1D表示
(x,y)坐标
显示屏幕 2D表示
像素由其左下角坐标表示
光栅图形中点的表示
y ymax
ymin xmin
x xmax
地址 = (xmax-xmin) * (y-ymin) + (x-xmin) + 基地址
每行像素点数
行数
行中位置
P2
M (Xp+1,Yp+0.5)
P
计算机基本图形生成算法

x2 y2 R2
构造函数F(x,y)=x2+y2-R2。 对于圆上的点,有F(x,y)=0; 对于圆外的点,F(x,y)>0; 而对于圆内的点,F(x,y)<0。
31
y
Pu
PM
Pd
x
图5.13 中点Bresenham画圆的原理
中点Bresenham画圆
y
yi
k
19
改进的Bresenham算法
kd
k d
kd
k kd
图5.10 改进的Brensemham算法绘制直线的原理
改进的Bresenham算法——原理
xi1 yi1
xi
yi yi
1
1
(d 0.5) (d 0.5)
误差项的计算
d初=0, 每走一步:d=d+k
一旦y方向上走了一步,d=d-1
中点Bresenham画圆
判别式的初始值
d0 F ( x0 1, y0 0.5) F (1, R 0.5) 1 (R 0.5)2 R2 1.25 R
36
改进:用d-0.25代替d 此时有:
d d 2xi 3
d 0.25
d d 2(xi yi ) 5 d 0.25
yi-2
(xi 2)2 ( yi 0.5)2 R2
xi xi+1 xi+2
d2 ( xi 1 1)2 ( yi 0.5)2 R2 图5.14 d≤0的情况
( xi 1)2 2xi 3 ( yi 0.5)2 R2
d1 2xi 3
误差项的递推(d>0)
yi
P
yi-1
构造判别式:
CG-4-1 图形生成

有xi+1 =xi +1, yi+1 =yi +k
(x1-x0≥0)
当|k|>1时,沿y方向前进
令| yi+1-yi |=1,那么|xi+1-xi|≤1
有yi+1 =yi +1, xi+1 =xi +1/k
(y1-y0≥0)
18
4.2.2 增量DDA算法
其中:直线的斜率k=(y1-y0)/(x1-x0)
在y轴上的截距b=( y1x0-y0x1)/(x1-x0)
10
4.2.1 一般算法
算法思路:
根据直线的两个端点坐标,求得k和b;
然后在(x1,x0)范围内对x均匀取整数;
利用直线方程y=kx+b进行运算,求得y值后再取整;
根据x、 y即可得到直线上所需的像素点坐标; 发光显示
Pi+1-Pi并化简得:
Pi+1 = Pi+2dy2(yi+1yi)dx
(2.5)
求初值P1,可将x1、y1和b代入式(2.4)中的xi、yi,
得到: P1 = 2dydx
28
4.2.3 Bresenham直线算法
•算法步骤(第一象限内): ⒈ 画点(x1, y1) 计算:dx=x2x1,dy=y2y1,P1=2dydx,i=1; ⒉ 求直线的下一点位置:
12
4.2.1 一般算法
存在问题:
通过x坐标值求y坐标,所以它难以保证直线在y轴方向 上的像素点均匀分布
假设直线在x轴方向上递增为1,那么它在y轴方向
上的递增为m
当直线斜率m较大时,用该法求得的相邻y坐标值递
《计算机图形学》02 基本图形生成
直线裁剪的情况:
D
C A B
端点编码的9种结果:
1010
1000
0110
0100
0101
直线编码裁剪算法处理步骤:
若两个端点的编码均为0,则两个端点均位于窗口内,线段全显 示,结束;
将两个端点的编码的编码按位与,若结果不为0,则线段必然位 于某条边线之外,线段全不显示,结束;
(这时,某个端点必然存在为1的位,且另一个端点相应的位为0, 线段将部分显示或全不显示)则,对任一个存在1位的端点,用1 位所对应的边,将直线段分割为两段,舍弃位于边线外的段,对 边线内的段再按本规则进行处理。
作业: 用窗口(5,10,25,30),对直线(0,40)-(30,15)进行裁剪,写出处理过 程及结果。
例2 (1,1)-(9,6)直线的点阵
10
9
8
7
6
5
4
3
2
1
0
0
1
2
3
4
5
6
7
8
9 10
例3 (1,1)-(6,9)直线的点阵
10
9
8
7
6
5
4
3
2
1
0
0
1
2
3
4
5
6
7
8
9 10
例4 (2,3)-(8,7)直线的点阵
数值微分法计算步骤:
对给定的两个直线端点(x1, y1),(x2, y2), 有:x2≥x1,|x2-x1|>|y2-y1|。 (1)求得两点连线的斜率:k=(y2-y1)/ (x2-x1) (2) px1=x1,py1=y1,得直线上的点(px1, py1);令i=1; (3)若pxi=x2,则计算结束;否则,继续; (4)pxi+1=pxi+1, pyi+1=pyi+k, 得直线上的点( pxi+1, int(pyi+1+0.5) ); (5)令i=i+1,转到(3)。
04 基本图形(元)生成技术
if (d<0) { x++; y++; d+=delta2; //取P2,并且计算下一点的d值 } else { x++; d+=delta1; //取P1,并且计算下一点的d值 } putpixel(x,y,color); } }
当|k|≤1时,让x每步增加1,y最多增加1,
然后用四舍五入的方法来确定直线上的
像 素 位 置 为 (x,round(y)) 。 设 当 前 点 为 (xi,yi),则下一个像素xi+1 = xi +1,则 yi+1 =k xi+1 +B =k(xi+1)+B=(k xi +B)+k = yi +k 即当x每递增1时,y递增斜率k。
即可。
算法举例:
设直线的起点为(0,0),终点为(5, 3),按Bresenham 算法计算并确定个 像素点位置。
计算dx=5,dy=3,k=3/5=0.6,误差e=-0.5; x=0,y=0
(1) i=0: 输出像素(0,0)
x=1,e=e+k=-0.5+0.6=0.1>0, 则 有
y=y+1=1,e=e-1=0.1-1=-09
其中,a=y0-y1,b=x1-x0,c=x0y1-x1y0。
对于直线中的点,则有F(x,y)=0;对于直 线上方的点,则有F(x,y)>0;对于直线下 方的点,则有F(x,y)<0。
• 判断中点M在Q的上方,还是 在下方,只要将中点坐标 M(xi+1,yi+0.5) 代 入 F(x,y) 方 程 中,并判断它的符号。构造判 别式
基本图形的生成优秀课件
yi+1 (画非水平线时,y的值变化,需要计算)
其中:yi+1的计算为:
yi+1=kxi+1 +B
=k(xi+△x)+B =kxi+k△x +B =kxi+B+k△x =yi +k△x
//yi=kxi+B
=yi +k
//当△x的步进为1时
故Pi
点的坐标为:
+1
xi+1=xi+1
yi+1=round ( yi+k) //进行取整运算
xi+1=xi+1 yi+1=round ( yi+k)
分析:下一点的y坐标为当前点y 坐标加上斜率k,省略了浮点乘法。
数
值
微
(xi+1,(int) (yi+k))
分
法
示
意 图
(xi, yi)
(xi+1, yi+k)
(xi, (int) (yi))
理想直线上的坐标点 扫描转换后的像素点
2 算法:
基本图形的生成
概论
一 光栅扫描:
1 光栅扫描的基本原理: 电子束在荧光屏上按照固定的扫描线和扫描顺序扫出 一个由行和列组成的光的栅网。
2 像素: 栅网中的每一个孤立的光点,它是光栅显示的最小单位。 像素可以有不同的亮度,像素的坐标值都是整数。
3 提出问题
(1)目前使用的图形输出设备显示器:光栅图形显示器
二 数值微分法的改进算法(关键:找到Pi(Xi,Yi), Pi+1(Xi+1,Yi+1)的关系)
1 推导:
基本图形的生成与计算-直线、圆、椭圆的生成
02
圆生成与计算
圆方程及性质
圆的标准方程
$(x-a)^2+(y-b)^2=r^2$,其中 $(a,b)$为圆心坐标,$r$为半径。
圆的性质
圆上任意一点到圆心的距离等于 半径;圆的任意两条直径互相平 分;垂直于弦的直径平分该弦。
圆绘制算法
确定圆心和半径
根据实际需求或已知条件确定圆 心和半径。
使用图形库
使用参数方程来表示图形的形状和位置 。参数方程可以是显式的或隐式的,可 以是二维的或三维的。参数方程表示法 可以方便地描述复杂的曲线和曲面。
VS
矩阵表示法
使用矩阵来表示图形的变换和操作。矩阵 表示法可以统一处理平移、旋转、缩放等 变换,使得计算更加简洁和高效。同时, 矩阵表示法也便于进行图形的复合变换和 复杂操作。
图形组合与拆分
图形组合
将多个图形组合成一个复杂的图形。组合方式可以是叠加、相交、相减等。组合后的图形可以具有更 加丰富的形状和特性。
图形拆分
将一个复杂的图形拆分成多个简单的图形。拆分方式可以是沿着边界、中心点、特定点等进行拆分。 拆分后的图形可以更容易地进行处理和分析。
图形参数化表示
参数方程表示法
将图形的大小按比例缩放。缩放因子可以是 任意正数,大于1表示放大,小于1表示缩小 。缩放可以沿着不同的轴进行,得到不同的 效果。
对称和对齐操作
对称操作
将图形关于某一直线或点进行对称。对称轴可以是任意直线,对称点可以是任意点。对称操作可以得到原图形 的镜像。
对齐操作
将图形与另一图形或坐标系进行对齐。对齐可以是水平对齐、垂直对齐或中心对齐等。对齐操作可以使得图形 在视觉上更加整齐和美观。
03
椭圆生成与计算
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
因(X0,Y0)在直线上, 所以F(X0,Y0)=0
优点:
◦ 只有整数运算,不含乘除法 ◦ 可用硬件实现
void Midpoint Line (int x0,int y0,int x1, int y1,int color) { int a, 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; putpixel(x, y, color); while (x<x1) { if (d<0) {x++; y++; d+=d2; } else {x++; d+=d1;} putpixel (x, y, color); } /* while */ } /* mid PointLine */
2013年8月13日11时54分
(x,y)坐标
…
地址线性表 1D表示 显示屏幕 2D表示
像素由其左下角坐标表示
y ymax ymin x
xmin
xmax
地址 = (xmax-xmin) * (y-ymin) + (x-xmin) + 基地址
每行像素点数
行数
行中位置
Address(x,y) = (xmax-xmin) * (y-ymin) + (x-xmin) + 基地址 = k1 + k2y + x 对像素连续寻址时,如何减少计算量? Address(x±1,y) = k1 + k2y + (x±1) = Address(x,y) ± 1 Address(x,y±1) = k1 + k2(y ±1) + x = Address(x,y) ± k2 Address(x±1,y±1) = k1 + k2(y ±1) + (x±1)
另外,算法实现中还应注意直线的生成方向,以决定Δx及Δy是取正值还 是负值。
直线DDA算法实现
Void DDALine(int x0,int y0,int x1, int y1,int color) { int x; float k,y=y0; k=(y1-y0)/(x1-x0); for(x=x0;x<=x1;x++) { putPixel(x, (int)(y+0.5),color); y=y+k; } }
`
两种定义方法: 1)像素理想化为点
2)像素有一定面积
`
2013年8月13日11时54分
倘若已知直线段两端点的坐标(x0,y0)(x1,y1), 如何求得屏幕上显示的各点的坐标?
2013年8月13日11时54分
根据直线方程表达式: y=m×x+b 其中:m是直线的斜率, b是y方向的截距。
第三章 基本图形生成
直线的生成算法 圆的生成算法 区域填充算法 裁剪算法
第三章 基本图形生成
直线的生成算ห้องสมุดไป่ตู้ 圆的生成算法 区域填充算法 裁剪算法
在数学上,理想的直线是一条由无穷多个无限小的 连续的点组成。
但在光栅显示平面上,我们只能用二维光栅网格上尽可能靠 近这条直线的像素点的集合来表示它。每个像素具有一定的 尺寸,是显示平面上可被显示的最小单位,它的坐标x和y只 能是整数,也就是说相邻象素的坐标值是阶跃的而不是连续 的。
y (x0,y0) dy b
0
dx x
根据题目可知: m=(y1-y0)/(x1-x0) b=yi-m×xi 如果x方向间隔为dx,则如 何计算出y方向的间隔呢?
(x1,y1)
dy=m×dx
Void lineSimple(int x0,int y0,int x1,int y1,int color) { Int dx=x1-x0; Int dy=y1-y0; putPixel(x0,y0,color); If (dx!=0) {float m=(float)dy/(float)dx; float b=y0-m*x0; dx=(x1>x0)?1:-1; <——什么意思呢? While (x0!=x1) { x0+=dx; y0=round(m*x0+b); putPixel(x0,y0,color);} }}}
若d<0,中点M在直线下方,取右上方象素P2 (Xp+1,Yp+1) ◦ 再下一个象素的判别式为: d2=F((Xp+1)+1,(Yp+1)+0.5)= a(Xp+2)+b(Yp+1.5)+c
P2 M P1
=d+a+b
d的增量为a+b
d的初始值
◦ d0=F(X0+1,Y0+0.5) =F(X0,Y0)+a+0.5 =a+0.5b ◦ 用2d代替d后,d0=2a+b ◦ d的增量都是整数
例:用中点画线法P0(0,0) P1(5,2)
yi 0 0 1 1 d 1 -3 3 -1
a=y0-y1=-2 b=x1-x0=5 d0=2a+b=1 d1=2a=-4 d2=2(a+b)=6
i xi 1 0 2 1 3 2 4 3
3 2 1 0 1 2 3 4 5
5 4 2
5
第三种算法——Bresenham算法
已知线段端点: P0(x0,y0), P1(x1,y1) 直线方程: y=kx+b {(xi, yi)}, i=0,….n. 浮点数取整 : yi=round(yi)=(int)(yi+0.5) ◦ 用到浮点数的乘法 、加法和 取整运算
直线DDA算法描述
设(x0,y0)和(x1,y1)分别为所求直线的起点和终点坐标,由直线的微分方程得
= Address(x,y)± k2 ± 1
增量法的优点?
直线的生成(扫描转换)
直线的扫描转换,就是要找出显示平面上最佳逼近理 想直线的那些像素的坐标值;直线的扫描转换算法就是计 算这些坐标值的方法;
常见算法: •DDA算法 (Digital Differential Analyzer,数值微分 法) •中点画线法 • Bresenham算法
使用DDA算法,每 生成一条直线做两次除 法,画线中每一点都要 经过取整运算。x、y、 dx、dy都必须用浮点数 表示,这些都使得 DDA算法的效率难以 提高。
问题:判断距离理想直线最近的下一个象素点 已知:线段两端点(x1,y1),(x2,y2) 直线方程:F(x,y)=ax+by+c=0 ◦ a=y1-y2 如何判断M点在Q点上方还是在Q点下方? ◦ b=x2-x1 ◦ c=x1y2-x2y1
直线DDA算法实现
按照从(x0, y0)到(x1, y1)方向不同,分8个象限。对于方向 在第1a象限内的直线而言,取增量值dx=1,dy=m。对于方 向在第1b象限内的直线而言,取增量值dy=1,dx=1/m。
象限
(x1,y1)
△x>△y? true false true false true false true false
P2 M (Xp+1,Yp+0.5) P P1
分两种情形考虑再一下个象素的判定:
若d≥0,中点M在直线上方,取正右方象素P1 (Xp+1,Yp) ◦ 再下一个象素的判别式为: d1=F((Xp+1)+1,Yp+0.5)=a(Xp+2)+b(Yp+0.5)+c = d+a d的增量为a
P2 M
P1
dx 1 1/m -1 -1/m -1 -1/m 1 1/m
dy m 1 m 1 -m -1 -m -1
1a 1b
(x0,y0)
2a 2b 3a 3b 4a 4b
直线方向的8个象限
8个象限中的坐标增量值
直线DDA算法完善
void ddaline(int x0,int y0,int x1,int y1) { int i,length; float dx,dy,x=x0,y=y0; if (abs(x1-x0)>=abs(y1-y0)) length=abs(x1-x0); else length=abs(y1-y0); dx=(x1-x0)/length; dy=(y1-y0)/length; for(i=1;i<=length;i++) { putPixel((int)(x),(int)(y)); x=x+dx; y=y+dy; } }
点在直线上面 点在直线上方 点在直线下方
F x, y 0 F x, y 0 F x, y 0
P2
M
Q
P=(xp,yp) P1
直线上方点: F(x,y)>0 直线下方点: F(x,y)<0 构造判别式: d=F(M)=F(Xp+1,Yp+0.5) 由d>0,d<0可判定下一个象素
直线Bresenham算法实现
条件:0≤m≤1且x1<x2
1、输入线段的两个端点坐标和画线颜色:x0,y0, x1,y1,color; 2、设置象素坐标初值:x=x0,y=y0; 3、设置初始误差判别值:p=2·dy-dx; 4、分别计算:dx=x1-x0、dy=y1-y0; 5、循环实现直线的生成:
直线Bresenham算法描述
由图中可以知道:在x=xi+1处,直线上点的y值是y=m(xi+1)+b,该 点离象素点(xi+1,yi)和象素点(xi+1,yi+1)的距离分别是d1和d2: d1=y-yi=m(xi+1)+b-yi d2=(yi+1)-y=(yi+1)-m(xi+1)-b 两个距离差是 d1-d2=2m(xi+1)-2yi+2b-1