资源简介

这是我的一个课程作业,实现了体数据可视化显示中的Ray casting(光线跟踪)经典算法。本程序简单易懂,对于理解算法有很好的帮助。里面实现了如下三种方法,同时内附测试体数据。下载后点击release文件夹中exe文件即可看到效果。 一、基于表面光照的三维显示方法(SSD)。基本原理:三维物体表面的检测隐含在光线跟踪处理中,在给定的表面条件满足时,光线停止,同时在光线与物体相交处计算表面法线方向矢量,然后利用光照模型计算亮度值,赋给相应的绘制值,形成光照效果的三维表面显示; 二、最大值投影方法(MIP)。基本原理:将所有体素沿视线方向投影到相应像素中的体素的最大值作为最终像素的值,主要应用于MRA 和Ultrasound 中;三、数字重建透视成像(DRR)。基本原理:与MIP 相类似,在遍历光线的过程中将光线路径上的图像值进行累加,又称为数字重建透视成像。

资源截图

代码片段和文件信息

// OpenGL.cpp : implementation file
//

#include “stdafx.h“
#include “RayCasting_work2.h“
#include “OpenGL.h“
#include 
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// COpenGL

COpenGL::COpenGL()
{
// 给成员变量赋值
step = 0.0;
s = 0.1;

rc = new CRayCastUtility();
rc->Open();
}

COpenGL::~COpenGL()
{
if(rc!=NULL) delete rc;
wglMakeCurrent(NULLNULL);
wglDeleteContext(hglrc); // 删除渲染描述表
::ReleaseDC(m_hWndhdc); // 释放设备描述表
}


BEGIN_MESSAGE_MAP(COpenGL CWnd)
//{{AFX_MSG_MAP(COpenGL)
ON_WM_CREATE()
ON_WM_PAINT()
//}}AFX_MSG_MAP
ON_WM_TIMER()
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// COpenGL message handlers

int COpenGL::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: Add your specialized creation code here
// 设置当前的绘图像素格式
MySetPixelFormat(::GetDC(m_hWnd));
CPaintDC dc(this); // device context for painting
// 创建绘图描述表
hdc = ::GetDC(m_hWnd);
// 创建渲染描述表
hglrc = wglCreateContext(hdc);
// 使绘图描述表为当前调用线程的当前绘图描述表
wglMakeCurrent(hdchglrc);

  SetTimer(1600NULL);//启动定时器1定时时间是1秒
return 0;
}

void COpenGL::OnPaint() 
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

// Do not call CWnd::OnPaint() for painting messages
// 调用OpenGL 绘图函数进行图形绘制
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除颜色缓存和深度缓存
//s+=0.0005;
if(s>1.0)
s=0.1;
step = step+1.0;
if(step>360.0)
step=step-360.0;
glPushMatrix();
/*glScalef(sss);
glRotatef(step0.01.00.0);
glRotatef(step0.00.01.0);
glRotatef(step1.00.00.0);*/
//DrawColorBox();
glPopMatrix();
glFlush();
SwapBuffers(hdc);


}

// 设置像素格式函数 
int COpenGL::MySetPixelFormat(HDC hdc)
{
PIXELFORMATDEscriptOR pfd={
sizeof(PIXELFORMATDEscriptOR) // pfd结构的大小
1 // 版本号
PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图
PFD_SUPPORT_OPENGL | // 支持opengl
PFD_DOUBLEBUFFER // 双缓存模式
PFD_TYPE_RGBA // RGBA 颜色模式
24 // 24 位颜色深度
0 0 0 0 0 0 // 忽略颜色位
0 // 没有非透明度缓存
0 // 忽略移位位
0 // 无累加缓存
0 0 0 0 // 忽略累加位
32 // 32位深度缓存
0 // 无模板缓存
0 // 无辅助缓存
PFD_MAIN_PLANE // 主层
0 // 保留
0 0 0 // 忽略层,可见性和损毁掩模
};
int iPixelFormat;
// 为设备描述表得到最匹配的像素格式
if((iPixelFormat = ChoosePixelFormat(hdc&pfd)) == 0)
{
MessageBox(_T(“ChoosePixelFormat Failed“)NULLMB_OK);
return 0;
}
// 设置最匹配的像素格式为当前的像素格式
if(SetPixelFormat(hdciPixelFormat&pfd) == FALSE)
{
MessageBox(_T(“SetPixelFormat Failed“)NULLMB_OK);
return 0;
}
return 1;
}

void COpenGL::DrawColorBox()
{

 GLfloat x;
  GLfloat factor = s;

     //glClear(GL_COLOR_BUFFER_BIT);

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

     文件       4305  2011-12-09 11:07  RayCasting_work2\RayCasting_work2\OpenGL.cpp

     文件       1534  2011-12-09 11:07  RayCasting_work2\RayCasting_work2\OpenGL.h

     文件       1198  2011-12-05 14:43  RayCasting_work2\RayCasting_work2\raycast\color.cpp

     文件       1359  2002-10-25 14:42  RayCasting_work2\RayCasting_work2\raycast\color.h

     文件       1870  2011-12-05 14:43  RayCasting_work2\RayCasting_work2\raycast\CreateVolDat.cpp

     文件        695  2011-12-05 14:43  RayCasting_work2\RayCasting_work2\raycast\CreateVolDat.h

     文件        913  2011-12-05 14:54  RayCasting_work2\RayCasting_work2\raycast\openglsupport.h

     文件      11822  2011-12-06 21:04  RayCasting_work2\RayCasting_work2\raycast\ray.cpp

     文件       2390  2002-10-25 14:42  RayCasting_work2\RayCasting_work2\raycast\ray.h

     文件       3510  2011-12-05 14:56  RayCasting_work2\RayCasting_work2\raycast\raycaster.cpp

     文件        675  2002-10-25 14:42  RayCasting_work2\RayCasting_work2\raycast\raycaster.h

     文件       3035  2011-12-09 11:07  RayCasting_work2\RayCasting_work2\raycast\RayCastUtility.cpp

     文件        883  2011-12-09 11:07  RayCasting_work2\RayCasting_work2\raycast\RayCastUtility.h

     文件       2831  2002-10-25 14:42  RayCasting_work2\RayCasting_work2\raycast\resource.h

     文件       8843  2011-11-23 21:33  RayCasting_work2\RayCasting_work2\raycast\shearwarp.cpp

     文件        988  2002-10-26 16:55  RayCasting_work2\RayCasting_work2\raycast\shearwarp.h

     文件       4546  2002-10-25 14:42  RayCasting_work2\RayCasting_work2\raycast\slicer.cpp

     文件       1114  2002-10-25 14:42  RayCasting_work2\RayCasting_work2\raycast\slicer.h

     文件       3393  2011-12-05 14:59  RayCasting_work2\RayCasting_work2\raycast\tfvolume.cpp

     文件        706  2011-12-06 18:12  RayCasting_work2\RayCasting_work2\raycast\tfvolume.h

     文件       1976  2011-12-06 21:05  RayCasting_work2\RayCasting_work2\raycast\transfunc.cpp

     文件        837  2011-12-06 18:12  RayCasting_work2\RayCasting_work2\raycast\transfunc.h

     文件       7362  2002-10-25 14:42  RayCasting_work2\RayCasting_work2\raycast\transfuncwin.cpp

     文件       1453  2011-12-05 14:48  RayCasting_work2\RayCasting_work2\raycast\transfuncwin.h

     文件       6113  2002-10-25 14:42  RayCasting_work2\RayCasting_work2\raycast\vecmath.cpp

     文件       1760  2002-10-25 14:42  RayCasting_work2\RayCasting_work2\raycast\vecmath.h

     文件      25410  2011-12-05 15:00  RayCasting_work2\RayCasting_work2\raycast\volume.cpp

     文件       3407  2002-10-25 14:42  RayCasting_work2\RayCasting_work2\raycast\volume.h

     文件      58128  2011-12-09 11:09  RayCasting_work2\RayCasting_work2\RayCasting_work2.aps

     文件       1777  2011-12-03 10:14  RayCasting_work2\RayCasting_work2\RayCasting_work2.cpp

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

评论

共有 条评论