- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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
您可能关注的文档
最近下载
- 中班语言绘本《章鱼先生卖雨伞》PPT课件(原版有声动态).pptx
- 大学毕业设计 汽车悬挂系统设计.doc
- 统编版六年级语文下册快乐读书吧《鲁滨逊漂流记》整本书阅读推进课.pptx VIP
- 2023年故宫博物院招聘笔试参考题库附带答案详解.pdf
- 蒸汽爆破法制浆的研究进展 .pdf VIP
- 幼儿园园本培训课件.pptx VIP
- 国际汉语教师证书汉办预测卷二.docx
- JB_T 14047-2021CN超超临界汽轮机用ZG13Cr9Mo2Co1NiVNbNB耐热钢铸件 技术条件.pdf
- 深入贯彻学习2025年中央八项规定精神教育测试试题【含答案】.docx VIP
- 原发性肝癌的ct诊断.ppt VIP
文档评论(0)