Barnes-Hut tree in Rust
============
Based on [The Barnes-Hut Algorithm](http://arborjs.org/docs/barnes-hut) by Tom Ventimiglia & Kevin Wayne.
"A quad-tree is similar to a binary tree, except that each node has 4 children"
Made to learn Rust
---------
My friend [Tristan Brismontier](https://github.com/TristanBrismontier) was building a (more advance) [Barnes-Hut in C# using Unity](https://github.com/TristanBrismontier/Barnes-Hut-Algorithm).
It looks like a nice project for learning Rust.
Also, an interesting candidate for building an [Anomaly Detection Service](https://anomaly.io)
How to use
---------
Add barnes dependency in Cargo.toml:
```Rust
[dependencies]
barnes = "0.1.0"
```
```Rust
extern crate barnes;
use data::{Point, Square, Region};
use tree::Tree;
fn create_points() -> Vec {
vec![
Point::new(13, 62, "A"),
Point::new(45, 65, "C"),
Point::new(54, 72, "B"),
Point::new(62, 57, "D"),
Point::new(38, 38, "E"),
Point::new(11, 5, "F"),
Point::new(32, 11, "G"),
Point::new(52, 8, "H"),
]
}
fn main() {
let mut square = Square::new(0, 0, 80);
square = Tree.compute_root(square, create_points());
println!("{:?}", square);
}
```
This code use 8 points:
![barnes-hut quadrant](https://raw.github.com/martin-magakian/Barnes-Hut/master/README_src/quadrant.png)
It produce this quadtree:
![barnes-hut tree](https://raw.github.com/martin-magakian/Barnes-Hut/master/README_src/tree.png)
The display:
```JS
Square {
x: 0,
y: 0,
lenght: 80,
weight: 8,
point: None,
region: Some(
Region {
nw: Square {
x: 0,
y: 40,
lenght: 40,
weight: 1,
point: Some(
Point {
x: 13,
y: 62,
name: "A"
}
),
region: None
},
ne: Square {
x: 40,
y: 40,
lenght: 40,
weight: 3,
point: None,
region: Some(
Region {
nw: Square {
x: 40,
y: 60,
lenght: 20,
weight: 2,
point: None,
region: Some(
Region {
nw: Square {
x: 40,
y: 70,
lenght: 10,
weight: 0,
point: None,
region: None
},
ne: Square {
x: 50,
y: 70,
lenght: 10,
weight: 1,
point: Some(
Point {
x: 54,
y: 72,
name: "B"
}
),
region: None
},
sw: Square {
x: 40,
y: 60,
lenght: 10,
weight: 1,
point: Some(
Point {
x: 45,
y: 65,
name: "C"
}
),
region: None
},
se: Square {
x: 50,
y: 60,
lenght: 10,
weight: 0,
point: None,
region: None
}
}
)
},
ne: Square {
x: 60,
y: 60,
lenght: 20,
weight: 0,
point: None,
region: None
},
sw: Square {
x: 40,
y: 40,
lenght: 20,
weight: 0,
point: None,
region: None
},
se: Square {
x: 60,
y: 40,
lenght: 20,
weight: 1,
point: Some(
Point {
x: 62,
y: 57,
name: "D"
}
),
region: None
}
}
)
},
sw: Square {
x: 0,
y: 0,
lenght: 40,
weight: 3,
point: None,
region: Some(
Region {
nw: Square {
x: 0,
y: 20,
lenght: 20,
weight: 0,
point: None,
region: None
},
ne: Square {
x: 20,
y: 20,
lenght: 20,
weight: 1,
point: Some(
Point {
x: 38,
y: 38,
name: "E"
}
),
region: None
},
sw: Square {
x: 0,
y: 0,
lenght: 20,
weight: 1,
point: Some(
Point {
x: 11,
y: 5,
name: "F"
}
),
region: None
},
se: Square {
x: 20,
y: 0,
lenght: 20,
weight: 1,
point: Some(
Point {
x: 32,
y: 11,
name: "G"
}
),
region: None
}
}
)
},
se: Square {
x: 40,
y: 0,
lenght: 40,
weight: 1,
point: Some(
Point {
x: 52,
y: 8,
name: "H"
}
),
region: None
}
}
)
}
```
Performance
-------
in x: number of point to place in the tree
in y: time used in second
![perf1](https://raw.github.com/martin-magakian/Barnes-Hut/master/README_src/perf1.png)
28 second to insert 40.000.000 point in the Barnes-Hut tree.
(on MacBook Pro 8 core)
Contact
=========
Developed by Martin Magakian dev.martin.magakian@gmail.com
by [Anomaly Detection](https://anomaly.io)
License
=========
MIT License (MIT)