




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验六实验六9 7 一 实验题目一 实验题目 z buffer 算法的代表性案例是绘制三个相互交叉的红绿蓝条 如图 9 85 所示 请使用 MFC 编程实现 二 实验思想二 实验思想 Z Buffer 算法建立两个缓冲器 深度缓冲器 用以存储图像空间中每一像素相应的深度值 初始化为最大深度值 zs 坐标 帧缓冲器 用以存储图像空间中的每个像素的颜色 初始化为屏幕的背景色 帧缓冲器初始值置为背景色 确定深度缓冲器的宽度 高度和初始深度 一般将初始深度置为最大深度值 对于多边形表面中的每一像素 xs ys 计算其深度值 zs xs ys 将 zs xs ys 与存储在 z 缓冲器中该位置的深度值 zBuffer xs ys 进行比较 如果 zs xs ys zBuffer xs ys 则将此像素的颜色写入帧缓冲器 且用 z xs ys 重置 zbuffer xs ys 三 实验代码三 实验代码 CZBuffer CZBuffer delete P void CZBuffer SetPoint CPi3 p int m P new CPi3 m for int i 0 i m i P i p i PNum m void CZBuffer CreateBucket 创建桶表 int yMin yMax yMin yMax P 0 y for int i 0 i PNum i 查找多边形所覆盖的最小和最大扫描线 if P i yyMax yMax P i y 扫描线的最大值 for int y yMin yScanLine yMin CurrentB pET NULL 没有连接边链表 CurrentB next NULL else 建立桶的其它结点 CurrentB next new CBucket CurrentB CurrentB next CurrentB ScanLine y CurrentB pET NULL CurrentB next NULL void CZBuffer CreateEdge 创建边表 for int i 0 i PNum i CurrentB HeadB int j i 1 PNum 边的第二个顶点 P i 和 P j 构成边 if P i yx P i x 计算 ET 表的值 Edge yMax P j y Edge k P j x P i x P j y P i y 代表 1 k Edge pb P i 绑定顶点和颜色 Edge pe P j Edge next NULL while CurrentB ScanLine P i y 在桶内寻找该边的 yMin CurrentB CurrentB next 移到 yMin 所在的桶结点 if P j yx P j x Edge yMax P i y Edge k P i x P j x P i y P j y Edge pb P i Edge pe P j Edge next NULL while CurrentB ScanLine P j y CurrentB CurrentB next if int P j y P i y CurrentE CurrentB pET if CurrentE NULL CurrentE Edge CurrentB pET CurrentE else while CurrentE next NULL CurrentE CurrentE next CurrentE next Edge void CZBuffer Gouraud CDC pDC 填充多边形 doubleCurDeep 0 0 当前扫描线的深度 doubleDeepStep 0 0 当前扫描线随着 x 增长的深度步长 doubleA B C D 平面方程 Ax By Cz D 0 的系数 CVector V21 P 1 P 2 V10 P 0 P 1 CVector VN V21 V10 A VN X B VN Y C VN Z D A P 1 x B P 1 y C P 1 z DeepStep A C 计算直线 deep 增量步长 CAET T1 T2 HeadE NULL for CurrentB HeadB CurrentB NULL CurrentB CurrentB next for CurrentE CurrentB pET CurrentE NULL CurrentE CurrentE next Edge new CAET Edge x CurrentE x Edge yMax CurrentE yMax Edge k CurrentE k Edge pb CurrentE pb Edge pe CurrentE pe Edge next NULL AddEt Edge EtOrder T1 HeadE if T1 NULL return while CurrentB ScanLine T1 yMax 下闭上开 T1 T1 next HeadE T1 if HeadE NULL return if T1 next NULL T2 T1 T1 T2 next while T1 NULL if CurrentB ScanLine T1 yMax 下闭上开 T2 next T1 next T1 T2 next else T2 T1 T1 T2 next CRGB Ca Cb Cf Ca Cb 代边上任意点的颜色 Cf 代表面上任意点的颜色 Ca Interpolation CurrentB ScanLine HeadE pb y HeadE pe y HeadE pb c HeadE pe c Cb Interpolation CurrentB ScanLine HeadE next pb y HeadE next pe y HeadE next pb c HeadE next pe c BOOL Flag FALSE double xb xe 扫描线的起点和终点坐标 for T1 HeadE T1 NULL T1 T1 next if Flag FALSE xb T1 x CurDeep xb A CurrentB ScanLine B D C z Ax By D C Flag TRUE else xe T1 x for double x xb x ZB ROUND x Width 2 CurrentB ScanLine Height 2 如果新采样点的深度大于原采样点的深度 ZB ROUND x Width 2 CurrentB ScanLine Height 2 CurDeep xy 坐标与数组下标保持一致 pDC SetPixel ROUND x CurrentB ScanLine RGB Cf red 255 Cf green 255 Cf blue 255 CurDeep DeepStep Flag FALSE for T1 HeadE T1 NULL T1 T1 next 边的连续性 T1 x T1 x T1 k delete HeadB delete HeadE delete CurrentE delete CurrentB delete Edge void CZBuffer AddEt CAET NewEdge 合并 ET 表 CAET CE CE HeadE if CE NULL HeadE NewEdge CE HeadE else while CE next NULL CE CE next CE next NewEdge void CZBuffer EtOrder 边表的冒泡排序算法 CAET T1 T2 int Count 1 T1 HeadE if T1 NULL return if T1 next NULL 如果该 ET 表没有再连 ET 表 return 桶结点只有一条边 不需要排序 while T1 next NULL 统计结点的个数 Count T1 T1 next for int i 1 ix T1 next x 按 x 由小到大排序 T2 T1 next T1 next T1 next next T2 next T1 HeadE T2 else if T1 x T1 next x if T1 k T1 next k 按斜率由小到大排序 T2 T1 next T1 next T1 next next T2 next T1 HeadE T2 T1 HeadE while T1 next next NULL T2 T1 T1 T1 next if T1 x T1 next x 按 x 由小到大排序 T2 next T1 next T1 next T1 next next T2 next next T1 T1 T2 next else if T1 x T1 next x if T1 k T1 next k 按斜率由小到大排序 T2 next T1 next T1 next T1 next next T2 next next T1 T1 T2 next CRGB CZBuffer Interpolation double t double t1 double t2 CRGB c1 CRGB c2 线性插值 CRGB c c t t2 t1 t2 c1 t t1 t2 t1 c2 return c void CZBuffer InitDeepBuffer int width
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 麻风病防治知识内容课件
- 二零二五年度商业保理存单质押担保合同范本
- 2025版高端医疗设备工厂股权转让与医疗健康协议
- 二零二五年度房产交易合同范本
- 2025白酒节庆活动赞助与产品购销合同
- 二零二五年空压机设备租赁与能源消耗监控合同
- 二零二五年度股权质押担保合同样本
- 二零二五版电子信息产品电磁兼容检测合同
- 2025年度模特经纪与文化活动合作推广合同
- 2025版建筑工程项目设计变更管理合同补充协议
- 《企业培训与发展课件-人才储备与管理体系》
- 桥梁安全知识讲座
- 《焊接品质管理培训》课件
- 2025年浙江衢州市大花园集团招聘31人高频重点提升(共500题)附带答案详解
- 光伏电站培训
- 软件项目服务保障方案
- 保险钱教育金课件
- Profinet(S523-FANUC)发那科通讯设置
- 肌力分级护理课件
- 古田会议课件教学课件
- 管道承诺质量保证书范本
评论
0/150
提交评论