forceatlas2 0.8.0

fast force-directed generic n-dimension graph layout
Documentation
use crate::{layout::*, node::*, util::*};

use rayon::prelude::*;

pub(crate) fn apply_gravity<
	T: Coord + Send + Sync,
	const N: usize,
	E,
	O: Nodes<T, N, Id>,
	Id: Sync,
>(
	layout: &mut Layout<T, N, E, O, Id>,
) {
	layout.nodes.par_iter_nodes_mut().for_each(|node| {
		let mut d = T::zero();
		for x in node.pos {
			d += x * x;
		}
		if d.is_zero() {
			return;
		}
		node.speed -= node.pos * (node.mass + T::one()) * layout.settings.kg / d.sqrt();
	})
}

pub(crate) fn apply_gravity_sg<
	T: Coord + Send + Sync,
	const N: usize,
	E,
	O: Nodes<T, N, Id>,
	Id: Sync,
>(
	layout: &mut Layout<T, N, E, O, Id>,
) {
	layout.nodes.par_iter_nodes_mut().for_each(|node| {
		node.speed -= node.pos * (node.mass + T::one()) * layout.settings.kg;
	})
}