std::vector<osg::Vec2> points_r = Math::createBezier2(std::vector<osg::Vec2>{pointC_r_out_2, pointC_r_out,pointU_2});提示非常量引用的初始值必须是左值
时间: 2024-01-20 10:04:48 浏览: 137
这个错误提示可能是因为 `std::vector<osg::Vec2>{pointC_r_out_2, pointC_r_out,pointU_2}` 这部分代码产生了一个右值,而 `Math::createBezier2()` 的参数是一个非常量的引用,需要绑定到一个左值上。
解决方法可以是将右值转换为左值,就像这样:
```cpp
const auto temp = std::vector<osg::Vec2>{pointC_r_out_2, pointC_r_out,pointU_2};
std::vector<osg::Vec2> points_r = Math::createBezier2(temp);
```
这里将右值 `{pointC_r_out_2, pointC_r_out,pointU_2}` 赋值给一个 `const` 左值 `temp`,然后将 `temp` 传递给 `Math::createBezier2()`,这样就可以避免这个错误了。
相关问题
std::set<osg::Vec3> _OriVertices; 自定义排序
`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` 定义的顺序排列。
typedef std::vector<osg::Vec4> Polyline; Polyline _polyline1;Polyline _polyline2;如何判断_polyline1是否包含_polyline2
`typedef std::vector<osg::Vec4> Polyline;` 是 C++ 中的一个别名声明,它将 `std::vector` 类型用于存储 `osg::Vec4` 类型的对象,即一系列的四维向量。在这里,`_polyline1` 和 `_polyline2` 都是 `Polyline` 类型的变量。
要判断 `_polyline1` 是否包含 `_polyline2`,你需要确定 `_polyline2` 中的所有 `Vec4` 向量是否都在 `_polyline1` 的范围内。由于它们都是向量集合,这通常通过逐个比较 `_polyline2` 的元素与 `_polyline1` 的所有元素来完成,可以遍历每个 `_polyline2` 的元素,看是否存在相同的四维向量。
如果 `_polyline2` 实际上是一个连续的线段,你还可以考虑使用点集的相交测试算法(如 Bentley-Ottmann 算法或 Welzl's algorithm),但这需要额外的数学处理。
下面是一个简单的示例,假设两个向量集合的比较基于向量的值完全匹配:
```cpp
bool isContained(const Polyline &container, const Polyline &search) {
for (const auto &vec : search) {
if (std::find(container.begin(), container.end(), vec) == container.end()) {
return false;
}
}
return true;
}
// 使用方法
if (isContained(_polyline1, _polyline2)) {
std::cout << "polyline1 包含 polyline2" << std::endl;
} else {
std::cout << "polyline1 不包含 polyline2" << std::endl;
}
```
阅读全文