- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试创建类型为 map<int,CGAL::AABB_tree<Traits>>
的 STL 映射(AABB tree's 的 map )当我尝试为 map 分配一个值时,例如(此代码仅用于演示目的):
//CGAL includes begin
#include <CGAL/Simple_cartesian.h>
#include <CGAL/Polyhedron_incremental_builder_3.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/AABB_face_graph_triangle_primitive.h>
//CGAL includes end
/*
* CGAL typedef's for initialization
*/
typedef CGAL::Simple_cartesian<double> K;
typedef K::FT FT;
typedef K::Point_3 Point_3;
typedef K::Segment_3 Segment;
typedef CGAL::Polyhedron_3<K> Polyhedron;
typedef Polyhedron::HalfedgeDS HalfedgeDS;
typedef Polyhedron::Vertex_const_iterator Vertex_const_iterator;
typedef Polyhedron::Facet_const_iterator Facet_const_iterator;
typedef Polyhedron::Halfedge_around_facet_const_circulator Halfedge_around_facet_const_circulator;
typedef CGAL::AABB_face_graph_triangle_primitive<Polyhedron> Primitive;
typedef CGAL::AABB_traits<K, Primitive> Traits;
typedef CGAL::AABB_tree<Traits> Tree;
typedef Tree::Point_and_primitive_id Point_and_primitive_id;
//end of typedef's
BuildMesh<HalfedgeDS> mesh(V, F);
polyhedron.delegate( mesh);
myMap[someInt] = Tree(polyhedron.facets_begin(),polyhedron.facets_end(),polyhedron);
我收到以下错误:
error C2248: 'CGAL::AABB_tree< AABBTraits >::operator =' : cannot access private member declared in class 'CGAL::AABB_tree< AABBTraits>'
我尝试查看 CGAL 的源代码并在 CGAL\AABB_tree.h 中找到以下几行:
private:
// Disabled copy constructor & assignment operator
typedef AABB_tree<AABBTraits> Self;
AABB_tree(const Self& src);
Self& operator=(const Self& src);
这意味着复制和赋值构造函数是私有(private)的,因此不可能创建树类型的 STL 容器。
我尝试使用指针代替我将 map 更改为 map<int,CGAL::AABB_tree < Traits > * >
并尝试:
BuildMesh<HalfedgeDS> mesh(V, F);
polyhedron.delegate( mesh);
myMap[someInt] = new Tree(polyhedron.facets_begin(),polyhedron.facets_end(),polyhedron);
但随后它使我的代码崩溃。
有什么办法可以创建这种类型的 STL 容器吗?
2014 年 3 月 14 日更新
我尝试按照建议使用 Drop 的解决方案,但出现以下错误:
error C2248: 'CGAL::AABB_tree::AABB_tree' : cannot access private member declared in class 'CGAL::AABB_tree'
2014 年 3 月 17 日更新
这是一个无法编译的示例代码:
#include <iostream>
#include <map>
#include <CGAL/Simple_cartesian.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/AABB_face_graph_triangle_primitive.h>
using std::map;
typedef CGAL::Simple_cartesian<double> K;
typedef K::FT FT;
typedef K::Point_3 Point;
typedef K::Segment_3 Segment;
typedef CGAL::Polyhedron_3<K> Polyhedron;
typedef CGAL::AABB_face_graph_triangle_primitive<Polyhedron> Primitive;
typedef CGAL::AABB_traits<K, Primitive> Traits;
typedef CGAL::AABB_tree<Traits> Tree;
typedef Tree::Point_and_primitive_id Point_and_primitive_id;
int main()
{
map<int,Tree> myMap;
Point p(1.0, 0.0, 0.0);
Point q(0.0, 1.0, 0.0);
Point r(0.0, 0.0, 1.0);
Point s(0.0, 0.0, 0.0);
Polyhedron polyhedron;
polyhedron.make_tetrahedron(p, q, r, s);
// here i get the error
myMap.emplace(
std::piecewise_construct,
std::forward_as_tuple(1),
std::forward_as_tuple(polyhedron.facets_begin(), polyhedron.facets_end(),polyhedron));
myMap[1].accelerate_distance_queries();
// query point
Point query(0.0, 0.0, 3.0);
// computes squared distance from query
FT sqd = myMap[1].squared_distance(query);
std::cout << "squared distance: " << sqd << std::endl;
// computes closest point
Point closest = myMap[1].closest_point(query);
std::cout << "closest point: " << closest << std::endl;
// computes closest point and primitive id
Point_and_primitive_id pp = myMap[1].closest_point_and_primitive(query);
Point closest_point = pp.first;
Polyhedron::Face_handle f = pp.second; // closest primitive id
std::cout << "closest point: " << closest_point << std::endl;
std::cout << "closest triangle: ( "
<< f->halfedge()->vertex()->point() << " , "
<< f->halfedge()->next()->vertex()->point() << " , "
<< f->halfedge()->next()->next()->vertex()->point()
<< " )" << std::endl;
return EXIT_SUCCESS;
}
有什么想法吗?
最佳答案
使用 std::map::emplace()
method, std::pair's piecewise constructor和 perfect forwarding , 就地构建不可复制和不可分配的数据:
myMap.emplace(
std::piecewise_construct, // disambiguation hint
std::forward_as_tuple(someInt), // perfectly forward arguments to key_type constructor
std::forward_as_tuple(polyhedron.facets_begin(), polyhedron.facets_end(),
polyhedron)); // perfectly forward arguments to value_type constructor
解决方案非常冗长,但完全符合 C++11 标准。
工作示例:Coliru Viewer
编辑:使用 std::make_tuple
而不是 std::forward_as_tuple
如果您的编译器不支持它 ( #include <tuple>
)。
编辑2:
查看添加的代码片段后,我发现错误不是由 map::emplace
触发的方法(可以通过注释掉它来轻松验证),但稍后使用 map::operator[]
.在内部,map::operator[]
使用 map::insert
(检查它的源代码)。只需使用 map::at()
而不是解决问题。示例:
FT sqd = myMap.at(1).squared_distance(query);
请注意,map::at()
如果找不到 key ,则抛出异常。您可能有兴趣(取决于性能需求)通过查看 map::find()
来确保 key 安全。在获取值(value)之前。
另请注意,由于 CGAL 内部使用了“不安全”字符串函数,您收到了详细警告。它们不是错误,可以通过添加 -D_SCL_SECURE_NO_WARNINGS
来禁用。编译器标志。
希望对您有所帮助。编码愉快!
关于c++ - 无法在 CGAL 中创建 AABB 树类型的 STL 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22385624/
我想知道是否有办法让我选择CGAL中使用的浮点位宽。 例如下面的代码只是直接从CGAL手册中拷贝过来的一个凸包例子: #include #include #include typedef CGA
我正在创建一个网格实用程序库,我想包含的功能之一是能够拆分网格的不相交分区。为此,我正在尝试编写一个接受 CGAL::Surface_mesh 的方法。并返回 std::vector ,其中每个元素都
在 CGAL 中有一个任意的多面体(可以是凸面、凹面,甚至是有孔的)如何对它的面进行三角剖分,以便我可以创建 OpenGL 缓冲区进行渲染? 我已经看到convex_hull_3()返回一个具有三角面
我想检查一个点是否位于带孔的多边形内部或外部。具体来说,我感兴趣的是给定点是否位于带孔多边形的“填充区域”内;如果该点位于孔内,我会认为它位于带孔的多边形之外。 我知道有一个 CGAL 函数 chec
假设我有一个非简单的多边形, CGAL 如何帮助我将其划分为一组简单的多边形? 例如,给定一个由一系列 2D 点表示的多边形: (1, 1) (1, -1) (-1, 1) (-1, -1) 我想获得
我正在尝试使用 CGAL 执行一些简单的 2D CSG 操作。这是两个多边形相交的示例。 实际问题是在生成的多边形中追踪每个线段的原点(用颜色标记)。 我想知道这是否可能,也许对 CGAL 本身进行一
我从 CGAL 开始。我想做的是创建坐标为数字 ~ 2^51 的点。 typedef CGAL::Exact_predicates_exact_constructions_kernel K; type
我从 CGAL 开始。我想做的是创建坐标为数字 ~ 2^51 的点。 typedef CGAL::Exact_predicates_exact_constructions_kernel K; type
我是 CGAL 库的新手。但是,我认为这是一个非常适合我想做的事情的包。 我有一组表示 3D 表面的点(如图 1 所示)。 我想在这个表面上安装一个 3d 三角剖分。曲面不是封闭的,因此不占据体积。
我开始学习如何处理复杂与简单的多边形,确定点是否在多边形内部/外部等(例如http://geomalgorithms.com/a09-_intersect-3.html和相关页面)。我希望找到一个 R
这是论坛上的常见问题,但我找不到解决方案。 Windows 10 64 位、CGAL 4.11、Cmake 3.9.2、Boost 1.65.1、Qt5 for MSVS 2017、libQGLVie
我发现 CGAL 示例无法在 Mac OS X 10.9 (Mavericks) 下编译。您可以成功编译主要的 CGAL 4.3 库并链接它,但是当使用某些类型的库时,我会收到如下所示的错误。 具体来
我是 CGAL 的新手,我在 Ubuntu 16.04 上使用 CGAL 4.7-4。我正在尝试编译并运行一个非常简单的 .cpp。这是代码: #include #include int main
在 CGAL 手册中,它说 here : Scattered data interpolation solves the following problem: given measures of a
我刚刚开始在飞机上使用Nef多面体-下面的简单程序创建了一个半平面,由y=0行定义,然后由CGAL Explorer探索该半平面。 #include #include #include #inc
我正在使用 CGAL 进行几何处理。进行 delaunay 三角剖分后,我需要检查一个点是在 2D 网格内部还是外部: 最佳答案 如果你使用过CGAL的二维网格生成器,你可以: 首先,在三角剖分中定位
我一直在使用 LSCM 参数化器来展开网格。我想获得一个具有精确测量值的二维平面模型,这样如果您 Papercut ,就可以将其物理地包裹回原始模型。 似乎 SMP::parameterize() 正
大家好堆垛机, 我想编写一个函数,循环遍历 CGAL 常规 3D 三角剖分的所有有限边,并计算共享该边的所有面(面)对之间的角度。在引用指南中,我找到了一个名为 incident_facets 的方法
如果我在多边形的 2 个顶点之间有一个线段,是否可以使用 CGAL 扩展该线段直到它到达多边形边界? (如果至少一个顶点是反射顶点,就会发生这种情况)。 最佳答案 您可以通过mySegment.sup
我目前正在学习使用 CGAL 执行 3D 三角剖分,到目前为止,我已经通过插入和三角剖分 4 个顶点设法创建了一个正四面体。但是当我尝试遍历四面体的边缘并获得与该边缘对应的顶点时,我将原点作为顶点或先
我是一名优秀的程序员,十分优秀!