This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import random as random | |
import matplotlib.pyplot as plt | |
import matplotlib.patches as patches | |
import time | |
class point: | |
def __init__(self, x, y): | |
self.x = x | |
self.y = y | |
class node: | |
def __init__(self, bodies, width, height, posX, posY): | |
self.hasleaf = False | |
self.width = width | |
self.height = height | |
self.bodies = bodies | |
self.posX = posX | |
self.posY = posY | |
self.leaf = [] | |
def generate_leaf(self, depth): | |
q1 = [] | |
q2 = [] | |
q3 = [] | |
q4 = [] | |
for point in self.bodies: | |
if point.x < (self.posX + (self.width / 2.0)): | |
if point.y < (self.posY + (self.height / 2.0)): | |
q1.append(point) | |
else: | |
q3.append(point) | |
else: | |
if point.y < (self.posY + (self.height / 2.0)): | |
q2.append(point) | |
else: | |
q4.append(point) | |
if len(q1) >= 1 and depth >= 1: | |
self.hasleaf = True | |
k1 = node(q1, self.width / 2.0, self.height / 2.0, self.posX, self.posY) | |
k1.generate_leaf(depth - 1) | |
self.leaf.append(k1) | |
if len(q2) >= 1 and depth >= 1: | |
self.hasleaf = True | |
k2 = node(q2, self.width / 2.0, self.height / 2.0, self.posX + (self.width / 2.0), self.posY) | |
k2.generate_leaf(depth - 1) | |
self.leaf.append(k2) | |
if len(q3) >= 1 and depth >= 1: | |
self.hasleaf = True | |
k3 = node(q3, self.width / 2.0, self.height / 2.0, self.posX, self.posY + (self.height / 2.0)) | |
k3.generate_leaf(depth - 1) | |
self.leaf.append(k3) | |
if len(q4) >= 1 and depth >= 1: | |
self.hasleaf = True | |
k4 = node(q4, self.width / 2.0, self.height / 2.0, self.posX + (self.width / 2.0), self.posY + (self.height / 2.0)) | |
k4.generate_leaf(depth - 1) | |
self.leaf.append(k4) | |
def postorder(node): | |
if not node.leaf: | |
ret = [] | |
ret.append(node) | |
return ret | |
else: | |
leaves = [] | |
for leaf in node.leaf: | |
leaves += postorder(leaf) | |
leaves.append(node) | |
return leaves | |
if __name__ == "__main__": | |
p = [] | |
for x in range(200): | |
p.append(point(random.uniform(0.0, 10.0), random.uniform(0.0, 10.0))) | |
tree = node(p, 10.0, 10.0, 0.0 ,0.0) | |
tree.generate_leaf(10) | |
print(len(tree.leaf[0].bodies)) | |
print(len(tree.leaf[1].bodies)) | |
print(len(tree.leaf[2].bodies)) | |
print(len(tree.leaf[3].bodies)) | |
q = postorder(tree) | |
for x in q: | |
print(x.width) | |
fig = plt.figure(figsize = (12,8)) | |
ax = fig.add_subplot(111) | |
for n in q: | |
ax.add_patch(patches.Rectangle((n.posX, n.posY), n.width, n.height, fill=False)) | |
x = [point.x for point in p] | |
y = [point.y for point in p] | |
plt.plot(x, y, 'ro') | |
plt.show() |
Barnes-Hut 천체 시뮬레이션 만들고 있는데 필요해서 만들어봄.
이진 트리하고 비슷하게 만들면 되는데 이진 트리보다 구분해야 하는 차원의 개수가 하나 늘어서 만들 때 꼬일 수 있음.

'Computer > Algorithm' 카테고리의 다른 글
최척화된 Barnes-Hut 시뮬레이션 (0) | 2023.12.28 |
---|---|
배열 쿼드트리 (0) | 2023.09.16 |
고속 푸리에 변환 (1) | 2021.01.28 |
이산 푸리에 변환 (0) | 2021.01.28 |
C++ vector, list, queue 속도 실험 (0) | 2021.01.17 |
댓글