www.pudn.com > VISC_LFS.rar > VISC_LFS.cpp


// VISC_LFS.cpp : Defines the entry point for the console application. 
// 
 
#include "stdafx.h" 
#include "visc.h" 
#include  
#include  
 
const double EPS = 0.0000001;   //一个很小的值,用于判断一个数是否接近0 
const float  RADIUS = 100.0;	//球的半径   
const int    width = (int)RADIUS*2,height = (int)RADIUS*2; //观察平面的宽和高 
const double cubeStep = 1.0;	//包围盒的划分步长 
const double rayStep = 1.0;		//光线上的采样步长 
const double eyeZ = RADIUS+1000.0;//视点在Z轴上的位置 
const double projectPosition = eyeZ - 900.0;//观察平面的位置(即投影平面,它垂直于Z轴) 
 
Color **image;		//观察平面的像素数组 
double ***volData;	//体数据数组 
 
//----------------------------------------------------------------------
//void generateVolData()
//该函数是用来生成体数据的.
//---------------------------------------------------------------------- 
void generateVolData() 
{ 
	int i,j,k; 
	int GridDensity = (int)2*RADIUS/cubeStep;//包围盒以步长cubeStep划分. 
 
	//分配保存体数据的空间 
	volData = new double**[GridDensity+1]; 
	for(i=0;iRADIUS*RADIUS)//如果球心到光线的距离大于半径,则无交点 
	{ 
		return ; 
	} 
	thc = sqrt(RADIUS*RADIUS - d); 
	t = tca - thc; 
	Point p = ray.getNormal()*t + ray.getStart();  
	ray.setPoint(p); 
	if(thc255?255:color.r); 
	image[i][j].g = (GLubyte)(color.g>255?255:color.g); 
	image[i][j].b = (GLubyte)(color.b>255?255:color.b); 
} 
 
//----------------------------------------------------------------------
//void RayCasting()
//该算法的主函数。
//具体过程:发射射线,求交,采样,混合.
//---------------------------------------------------------------------- 
 
void RayCasting() 
{ 
	//@分配保存像素点的空间,并初始化 
	image = new Color*[height]; 
	for(int i=0;i