@clb - Ah yes, I think it would work then. It's essentially the same as splitting up the points into 4 diagonally-delineated regions, but the max(abs(...)) formulation is certainly cleaner

The only ingredient missing from the solution is that the square should be allowed to move around, ie. it doesn't need to be centered at any point. So if it can shift up and get even larger, it should do that. I think this can be done using the following iteration:

- Grow the square using the algo above for a single given center point, call it s0

- Note which side is "touching" a point in s0, and "fix" it.

- Repeat the algo above, except instead now pretend that you're growing a 1:2 aspect rectangle centered at the midpoint of the fixed edge. So, instead of min(abs(dx), abs(dy)), it'd be min( abs(dx), 2*abs(dy) ) if the bottom edge was fixed. And you would also ignore all points at-and-below the bottom edge.

That's probably a bit confusing to just read...but I'll try implementing it soon and see how it goes.