Я бы сказал, вам определенно нужно какое-то дерево.
Вы упоминаете, что беспокоитесь о том, что дерево BSP может быть слишком сложным для этой проблемы - это зависит от того, насколько надежным вам должно быть решение. Вы также можете подумать, можно ли разбить объекты на более чем две части - если нет, то вы можете использовать двоичное дерево.
По сути, каждый узел в дереве будет иметь размер и форму, а также дочерние (разделительные) узлы. Кроме того, узел будет отвечать за обеспечение того, чтобы размеры и формы его дочерних элементов имели смысл - то есть они не перекрывались, они заполняли весь родительский элемент, они не выходили за пределы родительского элемента.
Доступ к разделам может быть выполнен путем присвоения каждому узлу относительного идентификатора относительно его родителя. Первый дочерний элемент получает relativeID = 0
, второй дочерний элемент 1 и т. Д. Повторите это для дочерних элементов каждого узла на каждом уровне. Затем вы можете написать метод, который принимает список относительных идентификаторов и использует его для обхода дерева и поиска правильного раздела (каждый уровень удаляет один относительный идентификатор для перехода на следующий уровень).