Nbody問題 Barnes Hut 實現

2022-09-02 21:12:16 字數 1618 閱讀 4847

barnes-hut  演算法

參考 該演算法對區域進行4分割。直到區域中只包含1個或者0個元素。

如下圖

通過分割構造出如下樹。

遞迴構造樹的演算法

1

bool tree::buildtree(nbodynode *tree, complex start, complex end, vector&plants)

9if (plants.size() == 1

) 15 vectorwrapers[4

];16

int centerx = (start.real() + end.real()) / 2;17

int centery = (start.imag() + end.imag()) / 2

;18 complex center = complex(centerx, centery);

19 complex sub = complex();

20for (vector::iterator i = plants.begin(); i != plants.end(); i++) else

if (sub.real() < 0 && sub.imag() > 0

) else

if (sub.real() > 0 && sub.imag() < 0

) else

if (sub.real() >= 0 && sub.imag() >= 0

) 31}32

int width = tree->width() / 4

;33 tree->body() =plant();

34bool ret = true;35

if (wrapers[0].size() > 0

) 40

if (wrapers[1].size() > 0

) 46

if (wrapers[2].size() > 0

) 52

if (wrapers[3].size() > 0

) 57

return

ret;

58 }

樹中每乙個非null節點儲存該區域中星體的等效值。

若是星體,儲存本身。若不是,儲存該區域中的等效星體。

即星體1 質量m1 位置(x1,y1)星體2 質量m2 位置(x2,y2)

等效星體 質量m = m1+m2 位置(x = (x1*m1+x*m2)/m, y = (y1*m1+y2*m2)/m);

如下圖

s 為該區域的寬度

d 為a星體到藍色區域等效星體的距離

若 d/s

則該區域可以被等效,否則計算該區域的子區域。

若區域本身是乙個星體,則直接計算該星體對a的萬有引力。不用計算 d/s

github 實現

P問題,NP問題,NPC問題,NP hard問題

1.p問題 乙個問題能找到乙個在多項式時間裡解決他的演算法 2.np問題 在多項式時間找不到問題的解,但可在多項式時間驗證問題的解 所有p問題都是np問題 3.npc問題 存在乙個np問題,所有其他np問題都可以約化為它 是乙個np問題 所有np問題都可約化為它 一元二次方程可以約化一元一次方程 一...

問題 I n皇后問題

在n n 格的棋盤上放置彼此不受攻擊的n 個皇后。按照西洋棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。n後問題等價於在n n格的棋盤上放置n個皇后,任何2 個皇后不放在同一行或同一列或同一斜線上。設計乙個解n 後問題的佇列式分支限界法,計算在n n個方格上放置彼此不受攻擊的n個皇...

問題的問題

有些問題是人出的,或者人造成的 而有些問題是 上帝 出的。我們可以說成是人題和天題。人題一般都是可以解決的,而天題,人根本就找不到答案。人題的解決不會給我們帶來快樂,而天題帶給我們的只是苦惱和困惑。人從出生到死亡,一直都處於迷失和困惑中,因為大部分的東西他都不知道是怎麼回事。是的,他可以不知道,同樣...