資源簡(jiǎn)介
KD-Tree是一種由二叉搜索樹推廣而來(lái)的用于多維檢索的樹的結(jié)構(gòu)形式(K即為空間的維數(shù))。它與二叉搜索樹不同的是它的每個(gè)結(jié)點(diǎn)表示k維空間的一個(gè)點(diǎn),并且每一層都根據(jù)該層的分辨器(discriminator)對(duì)相應(yīng)對(duì)象做出分枝決策。頂層結(jié)點(diǎn)按由分辨器決定的一個(gè)維度進(jìn)行劃分,第二層則按照該層的分辨器決定的一個(gè)維進(jìn)行劃分···,以此類推在余下各維之間不斷地劃分。直至一個(gè)結(jié)點(diǎn)中的點(diǎn)數(shù)少于給定的最大點(diǎn)數(shù)時(shí),結(jié)束劃分。
KD-Tree的分辨器根據(jù)不同的用途會(huì)有不同的分辨器,最普通的分辨器為:n mod k(樹的根節(jié)點(diǎn)所在層為第0層,根結(jié)點(diǎn)孩子所在層為第1層,以此類推) 即:若它的左子樹非空,則其左子樹上所有結(jié)點(diǎn)的第i維值均小于其根結(jié)點(diǎn)的第i維值;
若它的右子樹非空,則其右子樹上所有結(jié)點(diǎn)的第i維值均大于其根結(jié)點(diǎn)的第i維值;并且它的左右子樹也分別為KD-Tree。

代碼片段和文件信息
/**************************
?*?Includes
?*
?**************************/
#include?“kdtree.h“
#include?
#include?
#include?
float?theta?=?0.0;
/**************************
?*?Function?Declarations
?*
?**************************/
LRESULT?CALLBACK?WndProc?(HWND?hWnd?UINT?message
WPARAM?wParam?LPARAM?lParam);
void?EnableOpenGL?(HWND?hWnd?HDC?*hDC?HGLRC?*hRC);
void?DisableOpenGL?(HWND?hWnd?HDC?hDC?HGLRC?hRC);
double?rand01(void)
{
?double?num?=?double(rand())/double(RAND_MAX);
?return?num;
}
/**************************
?*?WinMain
?*
?**************************/
int?WINAPI?WinMain?(HINSTANCE?hInstance
????????????????????HINSTANCE?hPrevInstance
????????????????????LPSTR?lpCmdLine
????????????????????int?iCmdShow)
{
????WNDCLASS?wc;
????HWND?hWnd;
????HDC?hDC;
????HGLRC?hRC;????????
????MSG?msg;
????BOOL?bQuit?=?FALSE;
????float?theta?=?0.0f;
????/*?register?window?class?*/
????wc.style?=?CS_OWNDC;
????wc.lpfnWndProc?=?WndProc;
????wc.cbClsExtra?=?0;
????wc.cbWndExtra?=?0;
????wc.hInstance?=?hInstance;
????wc.hIcon?=?LoadIcon?(NULL?IDI_APPLICATION);
????wc.hCursor?=?LoadCursor?(NULL?IDC_ARROW);
????wc.hbrBackground?=?(HBRUSH)?GetStockobject?(BLACK_BRUSH);
????wc.lpszMenuName?=?NULL;
????wc.lpszClassName?=?“GLSample“;
????RegisterClass?(&wc);
????/*?create?main?window?*/
????hWnd?=?CreateWindow?(
??????“GLSample“?“Kd-tree?demo“?
??????WS_CAPTION?|?WS_POPUPWINDOW?|?WS_VISIBLE
??????0?0?556?556
??????NULL?NULL?hInstance?NULL);
????/*?enable?OpenGL?for?the?window?*/
????EnableOpenGL?(hWnd?&hDC?&hRC);
vector?P;
for?(int?ctr?=?0;?ctr?10000;?ctr++)
P.push_back(Point(rand01()*2-1?rand01()*2-1));
Kdtree?kdtree(P);
????/*?program?main?loop?*/
????while?(!bQuit)
????{
????????/*?check?for?messages?*/
????????if?(PeekMessage?(&msg?NULL?0?0?PM_REMOVE))
????????{
????????????/*?handle?or?dispatch?messages?*/
????????????if?(msg.message?==?WM_QUIT)
????????????{
????????????????bQuit?=?TRUE;
????????????}
????????????else
????????????{
????????????????TranslateMessage?(&msg);
????????????????DispatchMessage?(&msg);
????????????}
????????}
????????else
????????{
????????????/*?OpenGL?animation?code?goes?here?*/
????????????glClearColor?(0.0f?0.0f?0.0f?0.0f);
????????????glClear?(GL_COLOR_BUFFER_BIT);
????????????
????????????theta+=.05;
????????????float?circlex?=?cos(theta)/2.0?circley?=?sin(theta)/2.0;
????????????vector?selected?=?
????????????????kdtree.searchtree(circlex-0.5?circley-0.5?circlex+0.5?circley+0.5);
????????????vector::iterator?i?=?selected.begin();
????????????glBegin?(GL_POINTS);
????????????while?(i?!=?selected.end())
????????????{
????????????????Point?&p?=?*i++;??????
????????????????glVertex3f(p.x?p.y?0);
????????????}
????????????glEnd?();
????????????SwapBuffers?(hDC);
????????????Sleep?(1);
????????}
????}
????/*?shutd
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件????????589??2005-08-30?03:20??@PSC_ReadMe_9767_3.txt
?????文件???????7911??2005-08-30?01:21??kdtree.h
?????文件???????4825??2005-08-29?12:40??oglkd.cpp
-----------?---------??----------?-----??----
????????????????13325????????????????????3
評(píng)論
共有 條評(píng)論