资源简介
用visual studio环境可以运行,实现Z_buffer扫描线消隐算法。源码中有主要的步骤注释说明。用到了OpenGL的函数、库文件、头文件和glut库
代码片段和文件信息
// Auth: zousong@cad.zju.edu.cn
// Date: 2008-12-25
// 定义是否每个面片使用随机颜色值
#define RANDOM_COLOR 1
#include
#include
#include
#include
#include
#include
#ifdef RANDOM_COLOR
#include
#include
#endif
using namespace std;
#define MAX_WIDTH (1024*2)
#define MAX_HEIGHT (768*2)
//定义图像
#define INIT_WIDTH 1024
#define INIT_HEIGHT 768
GLubyte image[INIT_HEIGHT][INIT_WIDTH][3];
// 定义颜色结构体
typedef struct
{
unsigned char r b g a;
} color_t;
// 定义点结构
typedef struct
{
double x y z;
} point_t;
// 定义分类边表
typedef struct _line_t
{
int x; // 边的上端点的x坐标
double dx; // 相邻两条扫描线交点的x坐标差dx(-1/k)
int dy; // 边跨越的扫描线数目
int id; // 边所属多边形的编号
//_line_t * next; // 下个分类边表指针 由于本算法中分类边表存于STL Vector中 故不需要
} line_t;
// 定义活化边表
typedef struct _active_line_t
{
double xl; // 左交点的x坐标
double dxl; // (左交点边上)两相邻扫描线交点的x坐标之差
int dyl; // 以和左交点所在边相交的扫描线数为初值 以后向下每处理一条扫描线减1
double zl; // 左交点处多边形所在平面的深度值
double dzx; // 沿扫描线向右走过一个像素时 多边形所在平面的深度增量. 多于平面方程 dzx = -a/c (c!= 0)
double dzy; // 沿y方向向下移过一根扫描线时 多边形所在平面的深度增量. 对于平面方程 dzy = b/c (c!= 0)
#if 0 // 由于边对分拆在两个活化边表结构中,故右节点的元素可以省略
// double xr; // 右交点的x坐标
// double dxr; // (右交点边上)两相邻扫描线交点的x坐标之差
// int dyr; // 以右交点所在边相交的扫描线数为初值 以后向下每处理一条扫描线减1
#endif
// int id; // 交点所在多边形的编号 由于将活化边表存于各自所属的活化多边形中 故所属ID不需要保存
//_active_line_t * next; // 下个活化边表指针 由于本算法中活化边表存于STL Vector中 故不需要
} active_line_t;
// 定义分类多边形表 || 活化多边形表
typedef struct _poly_t
{
int id; // 多边形编号
double abcd; // 多边形所在的平面的方程系数 ax + by + cz + d = 0
int dy; // 多边形跨越的扫描线数目 || 多边形跨越的剩余扫描线数目
color_t color; // 多边形颜色
vector ale; // 活化边表 放在活化多边形中 对于分类多边形表无意义
//_poly_t * next; // 下个分类多边形指针 || 下个活化多边形指针 由于本算法中多边形表存于STL Vector中 故不需要
} poly_t;
inline bool is_zero(double f)
{
if (abs(f) < 1e-8)
return true;
return false;
}
inline int double_to_int(double f)
{
return (int)(f+0.5);
}
// 对活化多边形表排序的比较函数
bool cmp(const active_line_t &lhs const active_line_t &rhs)
{
if (double_to_int(lhs.xl) < double_to_int(rhs.xl) ) {
return true;
} else if ( double_to_int(lhs.xl) == double_to_int(rhs.xl) ){
if (double_to_int(lhs.dxl) < double_to_int(rhs.dxl))
return true;
}
return false;
}
// 从obj文件中读取的点
vector point;
// 分类多形型表
vector poly[MAX_HEIGHT];
// 分类边表
vector line[MAX_HEIGHT];
// 活化多边形表 内部包含各个活化多边形表中的活化边表对
vector ape;
// z值数组
double z[MAX_WIDTH];
// 颜色数组
color_t color[MAX_WIDTH];
// 处理字符串用的buffer
char buf[1024];
int cal(const char * file_name int max_width int max_height double scale)
{
// 判断参数是否合法
if (file_name == NULL || max_width <= 0 || max_width > MAX_WIDTH || max_height <= 0 || max_height > MAX_HEIGHT || scale < 1.0) {
printf(“cal err!\n“);
return -1;
}
#ifdef
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 16535 2007-12-30 10:48 bin\cone.obj
文件 839 2008-01-04 01:34 bin\cube.obj
文件 27670 2008-09-16 14:54 bin\glut.h
文件 237568 2008-09-16 14:54 bin\glut32.dll
文件 28728 2008-09-16 14:54 bin\glut32.lib
文件 188 2008-12-31 19:46 bin\run.bat
文件 122880 2008-12-31 19:15 bin\SL_Z_buffer.exe
文件 57515 2007-12-30 10:48 bin\sphere.obj
文件 61417 2007-12-30 10:48 bin\teapot.obj
文件 286 2008-01-01 20:42 bin\test.obj
文件 33973 2007-12-30 10:48 bin\torus.obj
文件 179844 2007-12-30 10:48 bin\torusknot.obj
文件 3080597 2008-01-03 23:58 bin\venusm.obj
文件 122880 2008-12-31 19:15 SL_Z_buffer\debug\SL_Z_buffer.exe
文件 16535 2007-12-30 10:48 SL_Z_buffer\SL_Z_buffer\cone.obj
文件 839 2008-01-04 01:34 SL_Z_buffer\SL_Z_buffer\cube.obj
文件 9346 2010-11-06 10:56 SL_Z_buffer\SL_Z_buffer\Debug\BuildLog.htm
文件 2 2011-01-14 11:18 SL_Z_buffer\SL_Z_buffer\Debug\cl.command.1.tlog
文件 2 2011-01-14 11:18 SL_Z_buffer\SL_Z_buffer\Debug\CL.read.1.tlog
文件 2 2011-01-14 11:18 SL_Z_buffer\SL_Z_buffer\Debug\CL.write.1.tlog
文件 65 2008-12-31 19:15 SL_Z_buffer\SL_Z_buffer\Debug\mt.dep
文件 145 2008-12-31 19:15 SL_Z_buffer\SL_Z_buffer\Debug\SL_Z_buffer.exe.intermediate.manifest
文件 114 2011-01-14 11:18 SL_Z_buffer\SL_Z_buffer\Debug\SL_Z_buffer.lastbuildstate
文件 994 2011-01-14 11:18 SL_Z_buffer\SL_Z_buffer\Debug\SL_Z_buffer.log
文件 0 2011-01-14 11:18 SL_Z_buffer\SL_Z_buffer\Debug\SL_Z_buffer.unsuccessfulbuild
文件 86016 2011-01-14 11:18 SL_Z_buffer\SL_Z_buffer\Debug\vc100.pdb
文件 117760 2010-11-06 10:56 SL_Z_buffer\SL_Z_buffer\Debug\vc80.idb
文件 179301 2008-12-31 19:15 SL_Z_buffer\SL_Z_buffer\Debug\z_buffer.obj
文件 27670 2008-09-16 14:54 SL_Z_buffer\SL_Z_buffer\glut.h
文件 237568 2008-09-16 14:54 SL_Z_buffer\SL_Z_buffer\glut32.dll
............此处省略35个文件信息
评论
共有 条评论