std::set<osg::Vec3> _OriVertices; 自定义排序
时间: 2024-12-08 21:16:03 浏览: 22
`std::set<osg::Vec3> _OriVertices;` 这行代码定义了一个名为 `_OriVertices` 的集合容器,它存储的是 `osg::Vec3` 类型的对象,`osg::Vec3` 通常用于三维向量。`std::set` 是 C++ 标准库中的关联容器,它自动对元素进行排序,内部使用红黑树实现。
如果你想自定义排序规则,可以利用 `std::set` 的比较函数模板 `<`,通过覆盖 `std::less<osg::Vec3>` 来提供特定的排序逻辑。例如,如果你想要按照向量的 x 分量、然后 y 分量、最后 z 分量进行升序排序:
```cpp
struct MySortPredicate {
bool operator()(const osg::Vec3& a, const osg::Vec3& b) const {
if (a.x() != b.x()) return a.x() < b.x();
if (a.y() != b.y()) return a.y() < b.y();
return a.z() < b.z();
}
};
std::set<osg::Vec3, MySortPredicate> _OriVertices;
```
现在,当你插入或查找元素时,`_OriVertices` 就会按照 `MySortPredicate` 定义的顺序排列。
相关问题
std::set<osg::Vec3> _OriVertices 插入顶点后,获取顶点的位置
std::set<osg::Vec3> 类似于 C++ 中的一个集合容器,用于存储 osg::Vec3 类型(三维向量)的元素,并按照其成员值排序。当你在 `_OriVertices` 集合中插入一个新的顶点后,它会自动添加到已排序的顺序中。
如果你想要获取某个特定顶点的位置,你需要提供该顶点的标识或者是通过迭代器找到这个位置。这里是一个简单的步骤:
1. 使用 `insert` 函数将顶点添加到集合中,例如:
```cpp
// 假设你有一个新的 Vec3 新顶点 vert
_OriVertices.insert(vert);
```
2. 要获取特定位置的顶点,可以遍历集合,找到对应的索引。由于集合是无序的(但内部有序),通常不适合直接查找,所以你可以选择保存每个顶点的唯一标识(如整数ID)来作为键,并维护这个关联。如果没有这样做,那么需要从零开始搜索,这可能效率较低。
```cpp
// 假设你知道顶点ID
auto it = _OriVertices.find(vertexId);
if (it != _OriVertices.end()) {
const osg::Vec3& position = *it; // 获取位置
// ...
} else {
// 顶点未找到
}
```
如果只是按插入顺序查找最近添加的顶点,可以在添加后立即获取,因为集合默认按照插入顺序排列。
在osg中,加载stl模型后,用vector保存每个面片的顶点,用set记录不重复的顶点,如何利用这2个容器,来判断是否存在孤立的面片
在OpenSceneGraph (osg) 中,处理STL模型并检测孤立面片的过程通常涉及以下几个步骤:
1. **加载STL模型**:
使用osgDB库中的`readShapeFile()`函数读取STL文件,将其转换成 osg::Geometry对象。
2. **解析面片数据**:
osg::Geometry中的每个三角形面片会被表示为一组三个顶点。你可以遍历这个geometry对象的vertices()和indices()属性,将每个面片的顶点添加到vector中。
```cpp
std::vector<osg::Vec3> faceVertices;
for (unsigned int i = 0; i < geometry->getVertexArray()->size(); i += 3) {
osg::Vec3 v0 = (*geometry->getVertexArray())[i];
osg::Vec3 v1 = (*geometry->getVertexArray())[i + 1];
osg::Vec3 v2 = (*geometry->getVertexArray())[i + 2];
faceVertices.push_back(v0);
faceVertices.push_back(v1);
faceVertices.push_back(v2);
}
```
3. **创建不重复顶点集合**:
使用set(如std::unordered_set)存储遇到的所有独特顶点,当遇到新顶点时,检查是否已存在,如果不存在则添加。
```cpp
std::unordered_set<osg::Vec3> uniqueVertices;
for (const auto& vertex : faceVertices) {
if (uniqueVertices.find(vertex) == uniqueVertices.end()) {
uniqueVertices.insert(vertex);
}
}
```
4. **检测孤立面片**:
遍历faceVertices vector,对于每个面片,检查所有三个顶点是否都在uniqueVertices set中。如果全部在,则说明该面片不是孤立的;如果有不在的,意味着有至少一个顶点未与其他面片共享,这可能是孤立的面片。
```cpp
bool isIsolated = true;
for (auto& vertex : faceVertices) {
if (uniqueVertices.count(vertex) != 3) {
isIsolated = false;
break;
}
}
// 如果isIsolated仍为true,那么所有面片都共享所有顶点,即无孤立面片
```
阅读全文