- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第2章 图形基元显示
第二章 图形基元的显示 ; 图形基元(输出图形元素)
图形系统能产生的最基本图形 。
图形基元包括线段、圆、多边形、字
符串等。
每次图形改变都要进行扫描转换,因此高效快速的扫描转换算法是非常重要的。;第一节 直线扫描转换算法
第二节 圆的扫描转换算法
第三节 区域填充 ;第一节 直线扫描转换算法;Mpaint演示; 最直接的算法:
设待画线段两端点的坐标值(x1,y1)和(x2,y2),假定 x1x2,则直线方程为:; 于是得到线段扫描转换最直接的算法是:给出 和 ,利用(2)式求出m和b。
当 时,对x每增1取允许的各整数值,用(1)进行乘法和加法运算求y后再取整。
当 时,应先对y取各整数值再计算x。
缺点:计算量大,画线慢。 ;袍影惺噪趟坯之缴怯搏米冕股展疼淀茄靡间花敷容庄尾见撵蒲窥闯张幂畅第2章 图形基元显示第2章 图形基元显示;象限; DDA算法
直线的数值微分方程是;void DDALine(int x1,int y1,int x2,int y2)
{
double dx,dy,e,x,y;
dx=x2-x1;
dy=y2-y1;
e=(fabs(dx)fabs(dy))?fabs(dx):fabs(dy);
dx/=e;
dy/=e;; x=x1;
y=y1;
for(int i=1;i=e;i++)
{
SetPixel((int)(x+0.5), (int)(y+0.5));
x+=dx;
y+=dy;
}
}; 中点画线法
假定直线斜率在0、1之间。
x= xi时,已确定(xi,yi)象素
x= xi+1与直线最近的象素为
P1 ( xi+1,yi )、 P2 ( xi+1,yi+1)
M表示P1与P2的中点
M = ( xi+1,yi +0.5)。
Q是直线与垂直线x=xi +1的交点;根据M和Q的关系,确定下一点;中点画线法的实现
设起点和终点分别为(x0 ,y0 )和(x1 ,y1 )
则直线方程为
F(x,y) = ax + by + c = 0
其中,a=y0-y1, b=x1-x0, c=x0y1-x1y0 。
直线上的点,F (x,y)=0;
直线上方的点,F(x,y)0;
直线下方的点,F(x,y)0。;定义判别式d
d=F(M)
=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+c
当d0时,M在直线下方(即在Q的下方),
应取右上方的P2
当d0时,则取正右方的P1
当d=0时,二者皆可,约定取P1;对每一个象素计算判别式d,根据它的符号确定下一个象素。
当d≥0时,取正右方象素P1,判断再下一个象素应取哪个,应计算
d1=F(xi+2,yi+0.5)
=a(xi+2)+b(yi+0.5)+c
=d+a
故d 的增量为a;而若d 0,则取右上方象素P2。要判断再下一个象素,则要计算
d2 =F(xi+2,yi+1.5)
=a(xi+2)+b(yi+1.5)+c
=d +a+b
故在第二种情况,d 的增量为a+b
;再看d 的初始值。显然,第一个象素应
取左端点(x0,y0),相应的判别式值为
d0 = F (x0 +1,y0 +0.5 )
=( x0 +1 )+ b ( y0 +0.5 ) + c
= a x0 + b y0 + c + a + 0.5b
=F ( x0,y0 ) + a + 0.5b
但由于(x0,y0)在直线上,故F(x0,y0)=0。
因此,d 的初始值为d0 = a+0.5b
考虑用2d来代替d的计算;void MidpointLine(int x0, int y0, int x1,int y1)
{ int a,b,delta1,delta2,d,x,y ;
a = y0 - y1; b = x1 - x0; d = 2 * a + b ;
delta1 = 2 * a ; delta2 = 2 *( a + b);
x = x0 ; y = y0 ;
SetPixel(x,y);
while( xx1 )
{ if( d0 )
{ x ++; y ++; d+= delta2; }
else
{ x ++; d+= delta1; }
文档评论(0)