Vector::traverse遍历

38 篇文章 1 订阅
22 篇文章 0 订阅

对Vector元素进行遍历,将遍历结果交由传递的函数使用:

template <typename T> void Vector<T>::traverse(void (*visit)(T &)) //利用函数指针机制的遍历
{ for (int i = 0; i < _size; i++) visit(_elem[i]); }

template <typename T> template <typename VST> //元素类型、操作器
void Vector<T>::traverse(VST & visit) //利用函数对象机制的遍历
{ for (int i = 0; i < _size; i++) visit(_elem[i]); } 

调用的方法:

   template <typename T> static void p(T&); //向量、列表等支持traverse()遍历操作的线性结构
   template <typename T> static void p(T* s) //所有指针
   s.traverse(print); //通过print()遍历输出所有元素
   T crc = 0; V.traverse(Crc<T>(crc)); //以crc为基本操作进行遍历
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要获取一个 `osg::Node` 所有顶点、面片和纹理坐标的集合,可以使用 `osg::NodeVisitor` 进行遍历和收集。 首先,定义一个继承自 `osg::NodeVisitor` 的自定义访问器,并重载 `apply` 方法来处理节点: ```cpp class CollectGeometryVisitor : public osg::NodeVisitor { public: CollectGeometryVisitor() : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) {} void apply(osg::Node& node) override { // 如果节点包含几何信息,则添加到集合 osg::Geode* geode = node.asGeode(); if (geode) { for (unsigned int i = 0; i < geode->getNumDrawables(); ++i) { osg::Geometry* geometry = geode->getDrawable(i)->asGeometry(); if (geometry) { addGeometry(geometry); } } } // 继续遍历子节点 traverse(node); } void addGeometry(osg::Geometry* geometry) { // 将顶点、面片和纹理坐标添加到集合 osg::Vec3Array* vertices = dynamic_cast<osg::Vec3Array*>(geometry->getVertexArray()); if (vertices) m_vertices.insert(m_vertices.end(), vertices->begin(), vertices->end()); osg::DrawElements* faceIndices = geometry->getPrimitiveSet(0); if (faceIndices) m_faces.insert(m_faces.end(), faceIndices->begin(), faceIndices->end()); osg::Vec2Array* texCoords = dynamic_cast<osg::Vec2Array*>(geometry->getTexCoordArray(0)); if (texCoords) m_texCoords.insert(m_texCoords.end(), texCoords->begin(), texCoords->end()); } std::vector<osg::Vec3> m_vertices; std::vector<unsigned int> m_faces; std::vector<osg::Vec2> m_texCoords; }; ``` 在 `apply` 方法,我们首先检查节点是否是一个 `osg::Geode`,如果是,则遍历其包含的 `osg::Geometry` 对象,并将其传递到 `addGeometry` 方法进行处理。在 `addGeometry` 方法,我们检查顶点数组、面片数组和纹理坐标数组是否存在,并将其添加到对应的集合。 最后,我们可以在使用 `osg::Node` 的代码创建此访问器并使用它来遍历 `osg::Node`: ```cpp CollectGeometryVisitor visitor; node->accept(visitor); // 获取顶点、面片和纹理坐标 std::vector<osg::Vec3> vertices = visitor.m_vertices; std::vector<unsigned int> faces = visitor.m_faces; std::vector<osg::Vec2> texCoords = visitor.m_texCoords; ``` 这样,我们就可以获取到 `osg::Node` 所有顶点、面片和纹理坐标的集合了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值