# RustGrapher
A library to simulate and visualize a 2D [force directed graph](https://en.wikipedia.org/wiki/Force-directed_graph_drawing) in rust.

## Features
- Render PetGraphs in 2D
- Physics based positioning via a Force Directed Graph
- Drag Nodes to a new position
- Place new nodes
- WIP: Build graphs using the UI
## Algorithms
### Barnes–Hut
Barnes-Hut is a approximation algorithm for n-body simulation.
The force directed graph calculates for each node the repulsive force to other nodes which will lead to a complexity of $O(n^2)$.
Using a k-d Tree(Quadtree) the Barnes-Hut algorithm groups far away nodes and only calculates the repulsive force once.This results in a complexity of $O(nlogn)$.
## Performance
> [!TIP]
> Run the project with `--release` for the best performance(~10x).
On a Ryzen 7 3700X the library can calculate 2000 simulation steps per second at 1000 Nodes. (Using 16 Physics threads)
## Controls
- `return` - Centers the camera on the average poisson of all nodes.
- `space` - Start/Pause simulation
- `scroll wheel` - Zoom in or out
- `W`, `A`, `S` and `D` - to move the camera
- `Click` and `drag` - move nodes
- `P` - switch from drag to node place(only works while simulation is paused)
## Usage
```rust
// Build a PetGraph
let mut rng = rand::thread_rng();
let graph: petgraph::Graph<(), (), Directed> =
petgraph_gen::barabasi_albert_graph(&mut rng, 1000, 1, None);
// Configure the simulator
let simulator = SimulatorBuilder::new()
.delta_time(0.01)
.freeze_threshold(-1.0)
.build(graph.into());
// Start the renderer
let renderer = Renderer::new(simulator);
renderer.create_window();
```
## Examples
- [Basic Barabasi Albert Graph](examples/basic.rs)
- [Section of Wikipedia Graph](examples/wikipedia.rs)
- [Headless Graph](examples/headless.rs)