• 大小: 4.42MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-09-28
  • 语言: 其他
  • 标签: Z_buffer  

资源简介

用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个文件信息

评论

共有 条评论