Skip to main content

SpatialHash

Struct SpatialHash 

Source
pub struct SpatialHash { /* private fields */ }
Expand description

Flat counting-sort grid over agent positions, rebuilt every tick.

Implementations§

Source§

impl SpatialHash

Source

pub fn new(cell_size: f32, world_w: f32, world_h: f32) -> Self

Creates an empty hash over a world_w by world_h world, with cells about cell_size wide.

Source

pub fn cell_index(&self, x: f32, y: f32) -> u32

Returns the flat index of the cell holding (x, y).

The position wraps, so a position outside the world still falls in a cell.

Source

pub fn build(&mut self, pos_x: &[f32], pos_y: &[f32])

Sorts the agents at pos_x and pos_y into their cells.

Source

pub fn build_where( &mut self, pos_x: &[f32], pos_y: &[f32], include: impl Fn(usize) -> bool, )

Like Self::build, but skips agents that include rejects.

Skipped agents are not returned by any query.

Source

pub fn query_radius( &self, x: f32, y: f32, r: f32, pos_x: &[f32], pos_y: &[f32], result: &mut Vec<u32>, )

Fills result with every agent within r of (x, y), clearing it first.

Distances wrap at the world’s edges, as for Self::for_each_within.

Source

pub fn for_each_within<F: FnMut(u32, f32, f32, f32)>( &self, x: f32, y: f32, r: f32, pos_x: &[f32], pos_y: &[f32], f: F, )

Visits every agent within r of (x, y), passing the callback its index, the toroidal deltas to it and their squared length.

The deltas come out of the range test either way. A kernel that needs them uses this method and computes each delta once, whereas a list of indices makes it recompute them all.

Source

pub fn cell_size_is(&self, cell_size: f32) -> bool

Returns whether this hash was built with cell_size.

Source

pub fn world_is(&self, world_w: f32, world_h: f32) -> bool

Returns whether this hash was built for a world_w by world_h world.

Source

pub fn grid_dims(&self) -> (u32, u32)

Cells along each axis, fitted to the world from the requested cell size.

Source

pub fn cell_extents(&self) -> (f32, f32)

World distance one cell spans on each axis.

Source

pub fn buckets(&self) -> (&[u32], &[u32])

Returns (cell_start, sorted_agents), where cell c owns sorted_agents[cell_start[c]..cell_start[c + 1]].

Source

pub fn rebuild_with_cell_size( &mut self, new_cell_size: f32, pos_x: &[f32], pos_y: &[f32], )

Rebuilds the hash for new_cell_size and sorts the agents again, if the cell size changed.

Source

pub fn heap_bytes(&self) -> usize

Heap memory held by the hash, in bytes.

Trait Implementations§

Source§

impl Debug for SpatialHash

Prints the cell geometry and the agent count, not the sorted agents.

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl NeighborIndex for SpatialHash

Source§

const KIND: &'static str = "Spatial hash"

Name of this index in the Model panel.
Source§

fn new(extent: Extent, cell_size: f32) -> Self

Creates an empty index over extent, with cells cell_size wide.
Source§

fn rebuild(&mut self, pos_x: &[f32], pos_y: &[f32], cell_size: f32)

Rebuilds the index from agent positions, with cells cell_size wide.
Source§

fn heap_bytes(&self) -> usize

Heap memory held by the index, in bytes.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSync for T
where T: Sync,