-
大小: 799KB文件類型: .rar金幣: 2下載: 0 次發(fā)布日期: 2021-06-19
- 語言: 其他
- 標(biāo)簽: Ray-Casting??光線跟蹤??DRR??raycast??
資源簡介
這是我的一個(gè)課程作業(yè),實(shí)現(xiàn)了體數(shù)據(jù)可視化顯示中的Ray casting(光線跟蹤)經(jīng)典算法。本程序簡單易懂,對于理解算法有很好的幫助。里面實(shí)現(xiàn)了如下三種方法,同時(shí)內(nèi)附測試體數(shù)據(jù)。下載后點(diǎn)擊release文件夾中exe文件即可看到效果。
一、基于表面光照的三維顯示方法(SSD)。基本原理:三維物體表面的檢測隱含在光線跟蹤處理中,在給定的表面條件滿足時(shí),光線停止,同時(shí)在光線與物體相交處計(jì)算表面法線方向矢量,然后利用光照模型計(jì)算亮度值,賦給相應(yīng)的繪制值,形成光照效果的三維表面顯示;
二、最大值投影方法(MIP)。基本原理:將所有體素沿視線方向投影到相應(yīng)像素中的體素的最大值作為最終像素的值,主要應(yīng)用于MRA 和Ultrasound 中;三、數(shù)字重建透視成像(DRR)。基本原理:與MIP 相類似,在遍歷光線的過程中將光線路徑上的圖像值進(jìn)行累加,又稱為數(shù)字重建透視成像。

代碼片段和文件信息
//?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); //?釋放設(shè)備描述表
}
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
//?設(shè)置當(dāng)前的繪圖像素格式
MySetPixelFormat(::GetDC(m_hWnd));
CPaintDC?dc(this); //?device?context?for?painting
//?創(chuàng)建繪圖描述表
hdc?=?::GetDC(m_hWnd);
//?創(chuàng)建渲染描述表
hglrc?=?wglCreateContext(hdc);
//?使繪圖描述表為當(dāng)前調(diào)用線程的當(dāng)前繪圖描述表
wglMakeCurrent(hdchglrc);
??SetTimer(1600NULL);//啟動定時(shí)器1定時(shí)時(shí)間是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
//?調(diào)用OpenGL?繪圖函數(shù)進(jìn)行圖形繪制
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);
}
//?設(shè)置像素格式函數(shù)?
int?COpenGL::MySetPixelFormat(HDC?hdc)
{
PIXELFORMATDEscriptOR?pfd={
sizeof(PIXELFORMATDEscriptOR) //?pfd結(jié)構(gòu)的大小
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;
//?為設(shè)備描述表得到最匹配的像素格式
if((iPixelFormat?=?ChoosePixelFormat(hdc&pfd))?==?0)
{
MessageBox(_T(“ChoosePixelFormat?Failed“)NULLMB_OK);
return?0;
}
//?設(shè)置最匹配的像素格式為當(dāng)前的像素格式
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);
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????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個(gè)文件信息
評論
共有 條評論