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;i RADIUS*RADIUS)//如果球心到光线的距离大于半径,则无交点 { return ; } thc = sqrt(RADIUS*RADIUS - d); t = tca - thc; Point p = ray.getNormal()*t + ray.getStart(); ray.setPoint(p); if(thc 255?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