broccoli-project icon indicating copy to clipboard operation
broccoli-project copied to clipboard

Why does `intersect_with_mut` takes `Fn`?

Open WaDelma opened this issue 4 years ago • 5 comments

I wanted to call it with FnMut and was surprised that it didn't work. Is there reason why it's using Fn?

WaDelma avatar Oct 22 '21 20:10 WaDelma

Also would it make sense to have method that takes in another Tree and goes through all intersections between the two trees?

WaDelma avatar Oct 22 '21 20:10 WaDelma

Basically here I am trying to optimize by splitting moving and static entities to two groups. If I could just construct two Trees and check intersections in the movable entities tree and intersections between moving and static entity trees I would be golden.

WaDelma avatar Oct 22 '21 21:10 WaDelma

@WaDelma that is a great idea to accept another tree, but I'm not sure exactly how to do it. My notes in the source:

   pub fn intersect_with_mut<X: Aabb<Num = T::Num>>(
        &mut self,
        other: &mut [X],
        func: impl Fn(PMut<T>, PMut<X>),
    ) {
        //TODO instead of create just a list of BBox, construct a tree using the dividers of the current tree.
        //This way we can parallelize this function.
        //Find all intersecting pairs between the elements in this tree, and the specified elements.
        //No intersecting pairs within each group are looked for, only those between the two groups.
        //For best performance the group that this tree is built around should be the bigger of the two groups.
        //Since the dividers of the tree are used to divide and conquer the problem.
        //If the other group is bigger, consider building the DinoTree around that group instead, and
        //leave this group has a list of bots.
        //
        //Currently this is implemented naively using for_all_intersect_rect_mut().
        //But using the api, it is possible to build up a tree using the current trees dividers
        //to exploit the divide and conquer properties of this problem.
        //The two trees could be recursed at the same time to break up the problem.

        for mut i in PMut::new(other).iter_mut() {
            let rect = i.rect();
            self.for_all_intersect_rect_mut(rect, |a| {
                func(a, i.borrow_mut());
            });
        }
    }

As for the reason it doesnt take FnMut? Mistake. I will fix that!

tiby312 avatar Jan 10 '22 02:01 tiby312

That said the naive implementation that's in there right now is not ideal, but its not that slow in that its just linear time, unlike a naive for_ever_colliding_pair which is n^2.

tiby312 avatar Jan 10 '22 03:01 tiby312

You could start with more naive implementation that is convenient and then later on create more optimized one if possible.

WaDelma avatar Jan 16 '22 21:01 WaDelma