0

リージョンが交差するノードに含まれるクワッドツリー内のすべての要素を検査できるようにしたいと思います。Queryただし、問題は、高さが2しかないほど小さいセクションを呼び出すと、スタックオーバーフローが発生することです。

次のことを行うためのより効率的な(そして間違いの少ない)方法は何ですか?

//Call
query_area = new a2de::Rectangle(_mouse->GetX(), _mouse->GetY(), 100.0, 100.0, a2de::YELLOW, false);
_selected_elements = _qt->Query(*query_area);

//...
//Definitions
template<typename T>
std::vector<T> QuadTree<T>::Query(a2de::Rectangle& area) {
    return QueryNode(this, area);
}

template<typename T>
std::vector<T> QuadTree<T>::QueryNode(QuadTree<T>* node, a2de::Rectangle& area) {
    std::vector<T> contained_elements;
    if(node->_bounds.Intersects(area)) {
        if(IsLeaf(node) == false) {
            std::vector<T> child_results;
            for(std::size_t i = 0; i < 4; ++i) {
                child_results = QueryNode(_children[i], area);
                for(std::vector<T>::iterator _iter = child_results.begin(); _iter != child_results.end(); ++_iter) {
                    contained_elements.push_back(*_iter);
                }
                child_results.clear();
            }
        } else {
            for(std::vector<T>::iterator _iter = _elements.begin(); _iter != _elements.end(); ++_iter) {
                contained_elements.push_back(*_iter);
            }
        }
    }
    return contained_elements;
}
4

1 に答える 1

0

修理済み。渡された値thisの代わりにポインタを使用してQueryNodeとLeafを呼び出す必要がありました。node

//Call
query_area = new a2de::Rectangle(_mouse->GetX(), _mouse->GetY(), 100.0, 100.0, a2de::YELLOW, false);
_selected_elements = _qt->Query(*query_area);

//...
//Definitions
template<typename T>
std::vector<T> QuadTree<T>::Query(const a2de::Shape& area) {
    std::vector<T> selected_elements;
    QueryNode(this, area, selected_elements);
    return selected_elements;
}

template<typename T>
void QuadTree<T>::QueryNode(QuadTree<T>* node, const a2de::Shape& area, std::vector<T>& selected_elements) {

    if(node == nullptr) return;

    if(node->_bounds.Intersects(area) == false) return;

    if(IsLeaf(node)) {
        for(std::vector<T>::iterator _iter = node->_elements.begin(); _iter != node->_elements.end(); ++_iter) {
            selected_elements.push_back(*_iter);
        }
        return;
    }
    for(std::size_t i = 0; i < MAX_CHILDREN; ++i) {
        QueryNode(node->_children[i], area, selected_elements);
    }
}
于 2013-01-21T19:18:09.813 に答える