网站大量收购独家精品文档,联系QQ:2885784924

一个可见面算法的实现8.docVIP

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一个可见面算法的实现8

一个可见面算法的实现 算法描述 1.深度缓冲算法(Depth-Buffer Method)基本思想 将投影面片上的每个像素所对应的面片的深度进行比较,然后取最近面片(即深度值最小)的属性作为该像素点的显示属性值。算法执行时,深度缓冲器中所有的单元均初始化为0(最小深度),而刷新缓冲器中所有单元均初始化为背景属性,然后逐个处理多边形面表中的各个面片。每扫描一行,计算该行各像素点所对应的深度值,并将结果与缓冲器中的记录进行比较,始终保持较小的深度值以及它所对应的属性。 2.算法流程 帧缓冲器初始值置成背景颜色; Z缓冲器个元素的初始值置成最小z值; for 每个多边形或景物的投影 for 每条扫描线位于多边形投影包围内的区段 for 多边形投影包围盒内的每个像素 计算多边形在像素Z(x,y)处的深度值; if z(x,y) ZBuffer(x,y) then 计算像素z(x,y)处的光强; 将像素写到帧缓冲器; 将z(x,y)写到Z缓冲器; endif next 像素 next 扫描线 next 多边形或物体 显示帧缓冲器。 3.采用增量法计算深度值 某多边形上的点(x,y)所对应的深度值可由平面方程计算: z = (-A * x – B * y – D) / c 由于所有扫描线上相邻点间的水平间距为1个像素单位,扫描线行与行之间的垂直间距也是1,因此可利用这种连贯性简化计算过程。若已计算出(x,y)点的深度值为z,则相邻连贯点(x + 1,y)的深度值可由下式计算: zi+1 = (- A * (x + 1) – B * y - D) / C = zi – A / C 沿着Y方向的计算应先计算出Y坐标的范围,然后从上至下逐个处理各个面片。有最上方的顶点出发,沿多边形左边界递归计算边界上各点的坐标 xi+1 = xi – 1 / m,m为该边斜率。 沿该边的深度值也可以递归计算出来,即zi+1 = zi + (A / m + B) / C。 若该边是一条垂直边界,则公式简化为:zi+1 = zi + B / C。 程序实现 下面应用深度缓冲算法对圆环线框模型进行消隐处理。 源程序如下: #include iostream.h #include ctype.h #include conio.h #include stdlib.h #include dos.h #include graphics.h #include string.h #include math.h const double PI = 3.1415926; const double WL = -20.0; /*世界坐标系中的窗口坐标*/ const double WR = 20.0; const double WT = 20.0; const double WB = -20.0; const int POINTS_NUM = 1800; /*三角片顶点数总和*/ const int FACES_NUM = 600; /*三角片数*/ typedef struct { int ID; float X,Y,Z; } TPoint; typedef struct { int ID; float A,B,C,D; int Vertex[3]; } TFace; typedef struct { int ID; char Name[10]; int Color; int FaceNum; int PointNum; TPoint *pPoint; TFace *pFace; } TBody; struct { unsigned char r,g,b; } palette[256]; inline double torad(double degree) { return degree * PI / 180; } void init3dgraphics (void); void init_256 (void); void close_256 (void); void putpixel_256 (unsigned int x, unsigned int y, unsigned char c); void inputRingInfo(void); void createRingFace(void); void draw(void); void drawLine(TPoint *v1, TPoint *v2); void rotate(void); void hide(void); void drawAxis(void); voi

文档评论(0)

haowendangqw + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档