Как избавиться от двойного цикла и оптимизировать алгоритм пересечения 3D объектов?

246
29 марта 2018, 10:38

Подскажите как оптимизировать данный алгоритм. Загружаю объект(у меня около 20 объектов. каждый раз вызываю функцию loadObj, приведенную ниже), каждый объект кладу в пустой массив objectsARRAY. Потом делаю двойной цикл и ищу пересечения объекта со всеми остальными. Очень мне не нравится такой подход. При этом еще нужно учитывать, что может не быть пересечений и не сравнивать объект с самим собой.

В целом мне нужно найти есть ли пересечения. Если есть пересечение, то вызывать еще один метод, где будет другая логика.

export const loadObj = path => {
this.THREE = THREE;
const container = new THREE.Object3D();
container.loaded = false;
const loader = new FBXLoader();
loader.load(
    path,
    object => {
        container.loaded = true;
        container.add(object);
        objectsARRAY.push(object);
    }
);
setTimeout(() => {
    let next = true;
    while (next) {
        for (let i = 0; i < objectsARRAY.length || !next; i++) {
            const currentObj = objectsARRAY[i];
            const currentBB = new THREE.Box3().setFromObject(currentObj);
            if (i === objectsARRAY.length - 1) {
                break;
            }
            for (let j = i + 1; j < objectsARRAY.length; j++) {
                const compareObj = objectsARRAY[j];
                const compareBB = new THREE.Box3().setFromObject(compareObj);
                if (currentBB.isIntersectionBox(compareBB)) {
                    next = false;
                    break;
                }
            }
        }
    }
}, 0);
return container;

};

Помогите переписать

Answer 1

Судя по использованию неких Box, достаточно проверять пересечение ограничивающих параллелепипедов. В таком случае стоит использовать пространственные структуры данных, например, R-tree

произвольно выбранный пример js реализации

READ ALSO
Autocomplete в vscode не работает как нужно

Autocomplete в vscode не работает как нужно

Пожалуйста подскажите, возможно ли настроить autocomplete (точнее IntelliSense) в vscode так (или стороннее расширение ) чтобы получать автодополнение когда...

285
Как узнать, есть ли элемент в массиве

Как узнать, есть ли элемент в массиве

Как узнать, есть ли элемент в массиве, но без учета типа данных, те

351
Неочевидное поведение обработчиков focusout

Неочевидное поведение обработчиков focusout

Здравствуйте, у меня есть проблемный блок кода

233