虽然我不知道如何编写C ++,但我尝试使用CGAL尝试使用点集形状检测从LiDAR点云派生建筑形状。使用示例我可以从文件中读取点和法线,然后CGAL检测形状。程序设置为仅检测平面形状。
我想将平面形状保存到文件中,以便我可以在其他软件中使用它们。但我无法找到如何实现这一目标的例子。我使用的测试程序基于efficient_RANSAC_parameters.cpp代码。它遍历所有检测到的形状时都有一部分。是否有可能在那里添加一些将平面形状写入文件的东西?我看到OFF格式是一种流行且简单的方法(在CGAL中)将多边形保存到文件中,因此这可能是一个很好的候选文件格式。
答案 0 :(得分:1)
一位知道如何编写C ++的同事帮助我解决了这个问题。他想出了以下内容:
render() {
return (
<div>
<ul>
<li><Link to="/">Home</Link></li>
<li><Link to="/one">One</Link></li>
<li><Link to="/two">Two</Link></li>
<li><Link to="/three">Three</Link></li>
</ul>
{this.props.children}
</div>
);
}
此块可以替换efficient_RANSAC_parameters.cpp示例中的循环。输出如下:
while (it != shapes.end()) {
if (Plane* plane = dynamic_cast<Plane*>(it->get()))
{
std::cout << "PLANE_" << count++ << "[" << std::endl;
const std::vector<size_t> indices = it->get()->indices_of_assigned_points();
std::vector<size_t>::const_iterator iti = indices.begin();
while (iti != indices.end()) {
// Retrieves point
Point_with_normal pw = *(points.begin() + (*iti));
Kernel::Point_3 p = pw.first;
std::cout << "POINT[" << p.x() << "," << p.y() << "," << p.z() << "]" << std::endl;
// Proceeds with next point.
iti++;
}
std::cout << "]" << std::endl;
}
// Proceeds with next detected shape.
it++;
}
这给了我一些合作的东西。在我的例子中,我使用sed将此输出转换为SQL插入查询,允许我将数据传输到关系数据库以进行进一步处理。
答案 1 :(得分:0)
在用户手册的example中,您可以看到一旦有了平面形状对象
if(Plane* plane = dynamic_cast<Plane*>(it->get())){..}
您可以从平面形状对象中获取CGAL::Plane_3
,从中可以获得点和法线,或平面系数。