Recap on bsp: The appeal of bsp is that you aren't restricted to planes that are axis aligned so you could separate the circles in a way that none are cut. In practice though, it's quite difficult to get the planes that achieve this, so it's not used often.
A fun anecdote about BSP trees in practice: https://twobithistory.org/2019/11/06/doom-bsp.html
If you can find a plane that separates objects, then those objects only appear on one side. If the plane goes through an object, they appear on both sides. This is one advantage of using a bsp-tree.
It seems that bsp is useful for more precisely dividing up space so that each object is within its unique grid tile with few planes necessary, but that the problem with bsp is the amount of planes needed to consider in order to come up with an optimal tree. That is, an optimal bsp is better than an optimal oct-tree or kd-tree, but more time-consuming to construct. Are there any heuristics that can generate an approximately-optimal bsp tree in a reasonable amount of time? Could such a tree lead to more efficient results compared to an oct-tree or kd-tree?
A paper about space partitioning tree to use for search: https://proceedings.neurips.cc/paper/2013/file/a01a0380ca3c61428c26a231f0e49a09-Paper.pdf
a helpful article related to BSP tree generation, though I was confused about how to use the BSP trees to compute shadows with one or more fixed light source ~ https://web.cs.wpi.edu/~matt/courses/cs563/talks/bsp/document.html