资源简介

扫描线z——buffer消影算法的实现,用visual studio 2005编译,代码是正确的,编译环境的不匹配可能导致编译错误

资源截图

代码片段和文件信息

// 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

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      32256  2008-12-31 19:48  扫描线Z_buffer算法\20821055_邹松_扫描线Z_Buffer算法作业说明.doc

     文件      16535  2007-12-30 10:48  扫描线Z_buffer算法\bin\cone.obj

     文件        839  2008-01-04 01:34  扫描线Z_buffer算法\bin\cube.obj

     文件        188  2008-12-31 19:46  扫描线Z_buffer算法\bin\run.bat

     文件     122880  2008-12-31 19:15  扫描线Z_buffer算法\bin\SL_Z_buffer.exe

     文件      57515  2007-12-30 10:48  扫描线Z_buffer算法\bin\sphere.obj

     文件      61417  2007-12-30 10:48  扫描线Z_buffer算法\bin\teapot.obj

     文件        286  2008-01-01 20:42  扫描线Z_buffer算法\bin\test.obj

     文件      33973  2007-12-30 10:48  扫描线Z_buffer算法\bin\torus.obj

     文件     179844  2007-12-30 10:48  扫描线Z_buffer算法\bin\torusknot.obj

     文件    3080597  2008-01-03 23:58  扫描线Z_buffer算法\bin\venusm.obj

     文件     122880  2008-12-31 19:15  扫描线Z_buffer算法\SL_Z_buffer\debug\SL_Z_buffer.exe

     文件       6108  2008-12-31 19:15  扫描线Z_buffer算法\SL_Z_buffer\SL_Z_buffer\Debug\BuildLog.htm

     文件         65  2008-12-31 19:15  扫描线Z_buffer算法\SL_Z_buffer\SL_Z_buffer\Debug\mt.dep

     文件        145  2008-12-31 19:15  扫描线Z_buffer算法\SL_Z_buffer\SL_Z_buffer\Debug\SL_Z_buffer.exe.intermediate.manifest

     文件     117760  2008-12-31 19:15  扫描线Z_buffer算法\SL_Z_buffer\SL_Z_buffer\Debug\vc80.idb

     文件     179301  2008-12-31 19:15  扫描线Z_buffer算法\SL_Z_buffer\SL_Z_buffer\Debug\z_buffer.obj

     文件       3237  2008-12-31 19:10  扫描线Z_buffer算法\SL_Z_buffer\SL_Z_buffer\SL_Z_buffer.vcproj

     文件       1413  2008-12-31 19:16  扫描线Z_buffer算法\SL_Z_buffer\SL_Z_buffer\SL_Z_buffer.vcproj.admin-PC.admin.user

     文件       1409  2008-01-04 01:37  扫描线Z_buffer算法\SL_Z_buffer\SL_Z_buffer\SL_Z_buffer.vcproj.KILLER.Admin.user

     文件    3080597  2008-01-03 23:58  扫描线Z_buffer算法\SL_Z_buffer\SL_Z_buffer\test.obj

     文件      16270  2008-12-31 19:15  扫描线Z_buffer算法\SL_Z_buffer\SL_Z_buffer\z_buffer.cpp

     文件    1272832  2008-12-31 19:16  扫描线Z_buffer算法\SL_Z_buffer\SL_Z_buffer.ncb

     文件        894  2008-01-01 14:42  扫描线Z_buffer算法\SL_Z_buffer\SL_Z_buffer.sln

    ..A..H.      8704  2008-12-31 19:16  扫描线Z_buffer算法\SL_Z_buffer\SL_Z_buffer.suo

     目录          0  2008-12-31 19:50  扫描线Z_buffer算法\SL_Z_buffer\SL_Z_buffer\Debug

     目录          0  2008-12-31 19:50  扫描线Z_buffer算法\SL_Z_buffer\debug

     目录          0  2008-12-31 19:50  扫描线Z_buffer算法\SL_Z_buffer\SL_Z_buffer

     目录          0  2008-12-31 19:50  扫描线Z_buffer算法\bin

     目录          0  2008-12-31 19:50  扫描线Z_buffer算法\SL_Z_buffer

............此处省略4个文件信息

评论

共有 条评论