Мне сказали, что четырехугольное дерево является идеальной структурой данных для моей игры, но у меня возникают проблемы с пониманием того, как именно формы работают в четырехугольных деревьях.
Я делаю это в JavaScript, но я думаю, что эти вопросы могут применяться к деревьям квадратов на любом языке.
Я думаю, что в основном понимаю, как базовые (x, y) точки и вставка точек работают в четырехугольных деревьях, и что я могу сделать это на бумаге.
Вот JSfiddle из моих экспериментов с точками.
Помимо одного случая, мои тесты с баллами работают как положено.
Но мое замешательство начинается, когда фигуры, подобные прямоугольникам, задействованы. Когда вы извлекаете данные из четырехугольного дерева с фигурами, проверяет ли оно каждую точку фигуры и в какие узлы они попадают? И как же работает вставка фигур, когда она принимает (x, y, width, height) параметры для каждой фигуры? Использует ли он ширину / высоту от начальной точки для вычисления других угловых точек, которые затем распределяются по соответствующим узлам? Если вставленная фигура охватывает четыре узла, сохраняются ли данные этой фигуры во всех четырех узлах?
И когда метод поиска принимает форму в качестве параметра (x, y, width, height), что на самом деле происходит? Сначала он видит, на какие узлы распространяется форма, если ее вставить, а затем извлекает все объекты этих узлов?
У меня есть JSfiddle, работающий с фигурами , но я совершенно запутался в результатах своего тестирования. Я получаю дубликаты объектов, которые возвращаются!
Например, красный квадрат - это нарисованный эквивалент параметров, которые я ввожу в свой метод поиска. Я думаю, что, поскольку этот красный квадрат охватывает все четыре узла, он должен возвращать каждый объект в четырехугольном дереве! Но это не так, и у меня возникают проблемы с рационализацией того, что он возвращает. У меня есть ряд других тестов, которые в настоящее время закомментированы, но вы можете отменить комментирование и запустить их, чтобы увидеть более запутанные результаты!
Как сказать, если я хочу вернуть все точки в четырехугольном дереве, как бы я это сделал? Метод извлечения, использующий фигуру по всему размеру границ? Например, получить (0, 0, canvas.width, canvas.height)?
Библиотека JavaScript QuadTree, которую я использую, упоминалась в различных других источниках, поэтому я предполагаю, что фактическая реализация является правильной и заслуживающей доверия.
Я думаю, что большая часть моей путаницы может быть вызвана неправильным пониманием терминологии четырехъядерных деревьев. Например, почему они говорят о границах, а не о размерах, когда у «точки» также есть параметры ширины / высоты? Это условность / сокращение или это совершенно разные понятия?
Спасибо за ваше время!
_stuckChildren
поля в коде. Вы также можете увидеть это в примере «извлечение элементов с границами» - он всегда выделяет красным узлы, которые пересекают границы узлов, по которым вы щелкнули, вплоть до корневого узла.