Пример #1
0
bool EdgeCollector::extractBoundaryEdgeloopList(EdgeList & el, EdgeloopList & edgeloopList)
{
    while (!el.empty())
    {
        osg::ref_ptr<Edgeloop> edgeloop(new Edgeloop);

        if (extractBoundaryEdgeloop(el, *edgeloop))
            edgeloopList.push_back(edgeloop);
        else
            return false;
    }
    return true;
}
Пример #2
0
bool EdgeCollector::extractBoundaryEdgeloop(EdgeList & el, Edgeloop & edgeloop)
{
    if (el.empty()) return false;


    osg::ref_ptr<Edge> current = el.back();
    el.pop_back();

    // ** init the Edgeloop
    edgeloop._edgeList.push_back(current.get());



    bool done = false;
    while (!done)
    {
        bool found = false;
        EdgeList::iterator it = el.begin(), end = el.end();
        while (it != end && !found)
        {
            if (current->endConnected(*(it->get())))
            {
                found = true;
            }
            else
            {
                ++it;
            }
        }

        if (!found)
        {
            OSG_WARN << "extractBoundaryEdgeloop : unable to close edge loop" << std::endl;
            return false;
        }
        else
        {
            edgeloop._edgeList.push_back(it->get());
            current = it->get();
            el.erase(it);

            if (edgeloop.isClosed()) done = true;
        }
    }
    return true;
}