直线和直线图形_第1页
直线和直线图形_第2页
直线和直线图形_第3页
直线和直线图形_第4页
直线和直线图形_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

直线和直线图形第一页,共五十一页,2022年,8月28日(1)水平线(2)垂直线(3)一般线因此,在设计算法时就必须考虑点的选取。应该选择最靠近直线的可寻点来逼近直线,选择得好,绘出来的直线就直,否则就会产生弯曲。2.1直线以及直线的绘制第二页,共五十一页,2022年,8月28日2.直线的终止点要准

在绘制直线过程中,由于精度的影响,直线的终点与原终点有一个累积误差。例如:

因此在提高设备的精度外,也要从算法上保证绘图的误差最小。图2.2终点不准造成图形不封闭2.1直线以及直线的绘制第三页,共五十一页,2022年,8月28日3.直线的粗细要均匀

对于由象素点组成的显示器来说,如果输出的直线选点不均匀,则造成直线粗细不均匀,从直线上反映直线亮度不均匀;对于其他设备来说,给人感觉直线有粗有细。图2.3不均匀的直线4.速度要快

虽然图形系统中硬件设备影响绘图的速度,但算法的好坏也影响速度,能够以较快的速度完称图形,这是每一个图形系统希望的。所以在选择和设计生成直线的算法时,速度指标也要加以重视。此外,对于生成直线时的特殊要求,如直线具有不同亮度、不同线宽、不同线型等。2.1直线以及直线的绘制第四页,共五十一页,2022年,8月28日2.2生成直线的几种常用算法计算机中常用的输出显示器是光栅图形显示器,它可以看作是由象素构成的矩阵。因此,当显示一条直线时,实际上是将最逼近于该直线的象素点选中。也就是说表示一条直线,就是要用靠近直线的一些网格点来代表这一直线。下面是几种生成直线常用的算法:2.2.1逐点比较法逐点比较法算法的基本思想是:在绘制直线的过程中,每绘制一个点与原直线进行比较,根据比较的结果决定下一步的走向,这样一步一步逼近直线。第五页,共五十一页,2022年,8月28日逐点比较法的执行过程:开始偏差判别选中象素终点判别是结束偏差计算否该算法执行中使得每一个绘制点尽可能靠近直线而不发生远离直线的趋向。图2.4逐点比较法执行过程由一个点到下一个点的走向方法有在X,Y方向上同时走一步,或只在X方向走一步,或向Y方向走一步。逐点比较法规定每一次只在X方向或Y方向走一步。2.2.1逐点比较法第六页,共五十一页,2022年,8月28日例如:假设要画直线为O(0,0)到A(XA,YA),即OA线段靠近OA线段的待选点为K0,K’0,K1,K’1,

K2,

K3,

K4等,那么究竟怎样选取呢?问题:OAK0K’0K1K2K’1K3K4K5mn2.2.1逐点比较法注:网格点表示象素第七页,共五十一页,2022年,8月28日画线的步骤:(1)从O开始,沿X方向先走一步到K0点K’0K1下一点的选择更加远离OA直线是下一步选择的画直线点(2)再下一步可走K’1或K2点K’1K2下一点的选择更加远离OA直线是下一步选择的画直线点按照这个规则选取画直线的点,选取的点为:K0,K1,K2,K3,K4,K5为绘制直线OA要用到的点OAK0K’0K1K2K’1K3K4K5mn2.2.1逐点比较法第八页,共五十一页,2022年,8月28日在绘制直线过程中,需要考虑以下几个问题:(1)如何计算偏差和判别偏差;(2)如何判别绘制到终点以结束算法;用上例来说明关于偏差问题(第一象限,斜率小于90度)有以下结论:即:=–

(1)=0时,点在直线上,(2)>0时,点在直线上方,(3)<0时,点在直线下方,设需要绘制直线OA的斜率为,根据算法绘制的当前直线的斜率为,变量表示-的值OAK0K’0K1K2K’1K3K4K52.2.1逐点比较法走X方向一步走X方向一步走Y方向一步第九页,共五十一页,2022年,8月28日计算偏差的公式如下:设O(0,0)表示直线起始点,(Xc,Yc)表示绘制直线的当前点,A(Xe,Ye)表示直线的终点,并且A点在第一象限内而且直线斜率小于90度=(Yc/Xc)–(Ye/Xe)=(Yc*Xe-Xc*Ye)/(Xc*Xe)(公式1)在绘制直线过程中,我们可以根据的正负来决定下一步的方向,一步一步逼近直线。=

–根据计算出偏差,以此来进行偏差判断。2.2.1逐点比较法第十页,共五十一页,2022年,8月28日偏差计算公式:这就是逐点比较生成直线过程中的偏差计算公式。(公式1)(公式2)=(Yc*Xe-Xc*Ye)/(Xc*Xe)=(Yc*Xe-Xc*Ye)对于,由于分母(Xc*Xe)中的Xc和Xe都是第一象限内,所以t的正负只与(Yc*Xe-Xc*Ye)有关,于是上面的公式可以简化为:2.2.1逐点比较法第十一页,共五十一页,2022年,8月28日

(1)在左图中,K1(X1,Y1)点处,有:

F1=Xe*Y1–X1*Ye>0故K1下一点选择在X方向走一步K2(2)K2的坐标如下:OAK0K’0K1K2K’1K3K4K5在计算过程中,每次都要计算二个乘积之差,计算量太大,下面构造一个递推关系.=(Yc*Xe-Xc*Ye)X2=X1+1

Y2=Y1

F2=Xe*Y2

–X2*Ye=Xe*Y1-(X1+1)*Ye=

F1-Ye<0,K3在Y方向增加一步2.2.1逐点比较法第十二页,共五十一页,2022年,8月28日

F2<0,K3的坐标如下:X3=X2Y2=Y1+1F3=F2+Xe>0因此K3下一点选择在X方向走一步K4F4<0,K5的坐标以及偏差如下:X5=X4Y5=Y4+1F5=F4+Xe>0OAK0K’0K1K2K’1K3K4K5F3>0,K4的坐标如下:X4=X3+1Y4=Y3F4=F3-Ye<0因此K5下一点选择在Y方向走一步K32.2.1逐点比较法第十三页,共五十一页,2022年,8月28日根据上面的计算过程,总结以上推导:(1)Fi>=0,走X方向一步,即Xi+1=Xi+1

Yi+1=YiFi+1=Fi-Ye(2)Fi<0,走Y方向一步,即Xi+1=XiYi+1=Yi+1Fi+1=Fi+Xe由以上的推导过程可知,在计算偏差Fi的过程中利用了上一步的偏差和终点坐标(Xe,Ye),而与中间点无关,从而简化了计算过程.因此解决了绘制直线的第一个问题:偏差的计算和判断2.2.1逐点比较法第十四页,共五十一页,2022年,8月28日绘制直线的第二个问题:(2)如何判别绘制到终点以结束算法;对于终点判别可采用计数方法:

设在X,Y方向的增量分别为X和Y,对于步长为一个参数来说,就是生成直线过程中X方向走X,Y方向走Y,因而计算器值为max(X,Y)在计长方向每走一步计数器减1,直到计数器值为零,则结束直线算法.2.2.1逐点比较法第十五页,共五十一页,2022年,8月28日(1)Fi>=0,走X方向一步,即Xi+1=Xi+1Yi+1=YiFi+1=Fi-Ye(2)Fi<0,走Y方向一步,即Xi+1=XiYi+1=Yi+1Fi+1=Fi+Xe例如:使用逐点比较法绘制从O(0,0)到A(4,2))直线段OA2.2.1逐点比较法第十六页,共五十一页,2022年,8月28日例如:使用逐点比较法绘制从O(0,0)到A(4,2))直线段计数器max(4,2)的值为4,计长方向为X,直线的斜率为0.5(1)设直线先在X方向走一步,计数器为3,K1有关数据为:Y1=Y0=0X1=X0+1=1F1=F0-Ye

=-2F1<0,点在直线下方,下一点走Y方向一步OAK12.2.1逐点比较法第十七页,共五十一页,2022年,8月28日OAK1(2)K2在Y方向走一步,

有关数据为:Y2=Y1+1=1

X2=X1=1

F2=-2

+4=2

F2>0,点在直线上方,走X方向一步K22.2.1逐点比较法第十八页,共五十一页,2022年,8月28日OAK1K2(3)K3在X方向走一步,计数器为2,

有关数据为:Y3=Y2=1X3=X2+1=2

F3=2

-2=0

F3=0,点在直线上,走X方向一步K32.2.1逐点比较法第十九页,共五十一页,2022年,8月28日OAK1K2K3(4)K4在X方向走一步,计数器为1,K4有关数据为:Y4=Y3=1

X4=X3+1=3F4=0

-2=-2

F4<0,点在直线下方,走Y方向一步K42.2.1逐点比较法第二十页,共五十一页,2022年,8月28日K3OAK1K2K4(5)下一点在Y方向走一步,K5有关数据为:Y5=Y4+1=2

X5=X4=3F5=-2

+4=2

F5>0,点在直线上方,走X方向一步K52.2.1逐点比较法第二十一页,共五十一页,2022年,8月28日K3OAK1K2K4K5(6)在X方向走一步,计数器为0,K6有关数据为:Y6=Y5=2

X6=X5+1=4F5=2

-2=0

因为计数器为0,所以结束直线绘制K62.2.1逐点比较法第二十二页,共五十一页,2022年,8月28日绘制直线点的具体选择过程:OAK2K3K4K1K5K62.2.1逐点比较法第二十三页,共五十一页,2022年,8月28日图各象限笔画走向(2)Fi<0,走Y方向一步,即(1)Fi>=0,走X方向一步Xi+1=Xi+1

Yi+1=YiFi+1=Fi–YeXi+1=XiYi+1=Yi+1Fi+1=Fi+Xe(1)Fi>=0,走Y方向一步Xi+1=Xi

Yi+1=Yi+1

Fi+1=Fi+Xe(2)Fi<0,走X方向一步,即Xi+1=Xi-1Yi+1=YiFi+1=Fi+Ye(1)Fi>=0,走X方向一步Xi+1=Xi-1

Yi+1=YiFi+1=Fi+Ye(2)Fi<0,走Y方向一步,即Xi+1=XiYi+1=Yi-1Fi+1=Fi-Xe(1)Fi>=0,走Y方向一步Xi+1=Xi

Yi+1=Yi-1

Fi+1=Fi-Xe(2)Fi<0,走X方向一步,即Xi+1=Xi+1Yi+1=YiFi+1=Fi-Ye第二十四页,共五十一页,2022年,8月28日表2-1判别式计算线段位置走步方向偏差值Fk>=0走步方向偏差值Fk<=0第一象限+XFk+1=Fk-|YA|+YFk+1=Fk+|XA|第二象限-X-Y第三象限+YFk+1=Fk-|XA|-XFk+1=Fk+|YA|第四象限-Y+X例如:在屏幕坐标系下,生成直线O(X1,Y1)A(X2,Y2)且OA与水平线的夹角的斜率小于90度.OA2.2.1逐点比较法第二十五页,共五十一页,2022年,8月28日2.2.2数值微分法数值微分法算法的基本思想是:在生成直线的某点上增加一个同X和Y的一阶导数成比例的小步长,在这种情况下的一阶导数是连续的,而且对于X和Y成正比。数值微分法(DigitalDifferentialAnalyzer,又称DDA法)推导如下:设直线的起点坐标(Xs,Ys),终点坐标位(Xe,Ye),令

X=Xe-Xs,Y=Ye-Ys要生成直线的微分方程是:第二十六页,共五十一页,2022年,8月28日令:取时间步长,数值解的递推公式为:公式3可以求得直线(Xs,Ys)(Xe,Ye)上的点,但由于显示时要用象素来表示,所以绘制直线的点是整数要用舍入法来找到最靠近直线的点.2.2.2数值微分法对于终点判别可采用计数方法:

计数器值等于x,y方向增量最大值;每绘制一个象素点,计数器减1.第二十七页,共五十一页,2022年,8月28日例如:绘制从(0,0)到(5,5)的直线运用DDA方法计算如下:初始值计算:x=0,y=0,count=5,dx=1,dy=1绘制过程如下:0(1)count=4x=1y=1画点(1,1)(2)count=3x=2y=2画点(2,2)(3)count=2x=3y=3画点(3,3)(4)count=1x=4y=4画点(4,4)(5)count=0x=5y=5画点(5,5)2.2.2数值微分法第二十八页,共五十一页,2022年,8月28日练习:绘制从(0,0)到(-8,-4)的直线运用DDA方法计算如下:初始值计算:x=0,y=0,c=8,dx=-1,dy=-0.5绘制过程如下:(1)c=7x=-1y=-0.5画点(-1,-1)(2)c=6x=-2y=-1画点(-2,-1)(3)c=5x=-3y=-1.5画点(-3,-2)(4)c=4x=-4y=-2画点(-4,-2)(5)c=3x=-5y=-2.5画点(-5,-3)(6)c=2x=-6y=-3画点(-6,-3)(7)c=1x=-7y=-3.5画点(-7,-4)(8)c=0

x=-8y=-4画点(-8,-4)2.2.2数值微分法第二十九页,共五十一页,2022年,8月28日2.2.3Bresenham算法Bresenham算法的基本思想是:

每次迭代在增量最大方向上均走一步,其方向由增量的正负决定,另一个方向是否也走,取决于计算出来的误差项,误差项所记录的方向同最大增量方向垂直.对于终点判别可采用计数方法:

计数器值等于x,y方向增量最大值;每绘制一个象素点,计数器减1.第三十页,共五十一页,2022年,8月28日下面讨论误差项(假设生成的直线角度在0-45度之间,斜率为m)误差项当点B在A点上方,当点B在A点下方,即(xi,yi)xiXi+1yi,ryi+1,r(xi+1,yi+1)ABDCE第三十一页,共五十一页,2022年,8月28日误差项之间的递推关系:例题:已知起点(0,0),终点(8,4),用Bresenham算法绘制这一线段012345678123456782.2.3Bresenham算法第三十二页,共五十一页,2022年,8月28日例题:已知起点(0,0),终点(8,4),用Bresenham算法绘制这一线段012345678123456782.2.3Bresenham算法1.

,第三十三页,共五十一页,2022年,8月28日例题:已知起点(0,0),终点(8,4),用Bresenham算法绘制这一线段012345678123456782.2.3Bresenham算法2.

,第三十四页,共五十一页,2022年,8月28日例题:已知起点(0,0),终点(8,4),用Bresenham算法绘制这一线段012345678123456782.2.3Bresenham算法3.

,第三十五页,共五十一页,2022年,8月28日例题:已知起点(0,0),终点(8,4),用Bresenham算法绘制这一线段012345678123456782.2.3Bresenham算法4.

,第三十六页,共五十一页,2022年,8月28日例题:已知起点(0,0),终点(8,4),用Bresenham算法绘制这一线段012345678123456782.2.3Bresenham算法5.

,第三十七页,共五十一页,2022年,8月28日例题:已知起点(0,0),终点(8,4),用Bresenham算法绘制这一线段012345678123456782.2.3Bresenham算法6.

,第三十八页,共五十一页,2022年,8月28日例题:已知起点(0,0),终点(8,4),用Bresenham算法绘制这一线段012345678123456782.2.3Bresenham算法7.

,第三十九页,共五十一页,2022年,8月28日例题:已知起点(0,0),终点(8,4),用Bresenham算法绘制这一线段012345678123456782.2.3Bresenham算法8.

,第四十页,共五十一页,2022年,8月28日例题:已知起点(0,0),终点(8,4),用Bresenham算法绘制这一线段012345678123456782.2.3Bresenham算法8.

,第四十一页,共五十一页,2022年,8月28日2.3线宽与线型如何生成一定宽度的直线:产生具有一定宽度的直线,可以沿着生成直线时获得的象素点,通过移动把具有一定的宽度“刷子”实现.第四十二页,共五十一页,2022年,8月28日假设直线斜率在[-1,1]之间,可把刷子定成垂直方向,并把刷子中心点对准直线上某一象素点,然后将刷子沿直线运动,就刷出了一条具有一条宽度的直线.例如:生成直线的宽度为5设生成的直线的斜率m的值范围是[-1,1]2.3线宽与线型中心象素点上二个象素下二个象素第四十三页,共五十一页,2022年,8月28日当直线的斜率不在[-1,1]之间时,只需把刷子运动方向改为水平方向即可.例如:生成直线的宽度为5设生成的直线的斜率m的值范围不是[-1,1]2.3线宽与线型第四十四页,共五十一页,2022年,8月28日用刷子生成直线的算法简单,效率高,但有以下几个缺点:(1)刷出的线的末端总是水平或垂直的,因此当线宽较大时,直线的两端不好看,而且在两条直线的连接处会产生缺口.(2)斜线与水平(垂直)线不一样宽,对于水平(垂直线),刷子与直线垂直,此时线最宽,与指定宽度相等;而对于45度斜线,刷子与直线成45度角,粗细仅为指定的线宽0.7倍.缺口2.3线宽与线型第四十五页,共五十一页,2022年,8月28日(3)由于刷子沿直线两侧运动,所以适合于宽度为奇数的情况;若为偶数,则绘出的直线宽度与指定宽度相差一个象素.例如:生成直线的宽度为62.3线宽与线型第四十六页,共五十一页,2022年,8月28日绘制具有特殊线型的直线,如虚线,点划线等,也需要编制相应的算法来实现.例如:已知起始点(sx,sy)与终止点(ex,ey),绘制一条虚线,设生成的直线在第一象限中设定义虚线上实线段部分宽度为l1,实线之间距离为l2,虚线上的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论