如何用CGAL编写和读取二进制PLY文件?



我可以用CGAL写一个二进制PLY文件,但我无法读取它:要么read_PLY返回false(如我的真实代码),要么它崩溃会话(如下面的代码,"内存未映射";错误).

write_PLY是成功的,这是可能的,我没有正确地使用它,因为我不能读取PLY文件与其他软件以及

你看到我下面的代码有什么问题吗?

#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/Polygon_mesh_processing/orient_polygon_soup.h>
#include <CGAL/Polygon_mesh_processing/orientation.h>
#include <CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/IO/io.h>
#include <CGAL/Surface_mesh/IO/PLY.h>
#include <fstream>
#include <iostream>
#include <vector>
typedef CGAL::Exact_predicates_exact_constructions_kernel EK;
typedef CGAL::Surface_mesh<EK::Point_3>                   EMesh3;
typedef EK::Point_3                                       EPoint3;
namespace PMP = CGAL::Polygon_mesh_processing;
int main() {

// octahedron soup ----------
double phi = (1.0 + sqrt(5.0)) / 2.0;
std::vector<EPoint3> vertices = {EPoint3(0.0, 0.0, phi),  EPoint3(0.0, phi, 0.0),
EPoint3(phi, 0.0, 0.0),  EPoint3(0.0, 0.0, -phi),
EPoint3(0.0, -phi, 0.0), EPoint3(-phi, 0.0, 0.0)};
std::vector<std::vector<int>> faces = {{1, 0, 2}, {0, 5, 4}, {5, 1, 0},
{0, 2, 4}, {3, 2, 1}, {3, 5, 1},
{2, 3, 4}, {5, 3, 4}};
bool success = PMP::orient_polygon_soup(vertices, faces);
if(!success) {
std::cout << "Polygon orientation failed.";
return 1;
}
// make mesh ----------
EMesh3 mesh;
PMP::polygon_soup_to_polygon_mesh(vertices, faces, mesh);
// write to binary PLY file ----------
std::ofstream outfile;
outfile.open("octahedron.ply", std::ios::binary);
CGAL::IO::set_binary_mode(outfile);
bool ok = CGAL::IO::write_PLY(outfile, mesh);
outfile.close();
if(!ok) {
std::cout << "Writing file failed.";
return 1;
} else {
std::cout << "Writing file successful.n";
}
// read the PLY file ----------
EMesh3 mesh2;
std::ifstream infile("octahedron.ply", std::ios::in|std::ios::binary);
std::cout << "infile is open: " << infile.is_open();
bool ok2 = CGAL::IO::read_PLY(infile, mesh2);
infile.close();
if(!ok2) {
std::cout << "Reading file failed.";
return 1;
}

// print mesh ----------
std::cout << mesh2;
return 0;
}

Surface_mesh/IO/PLY.hwrite_PLY函数中,写入头数据后,将写入所有顶点数据。如果您检查octahedron.ply文件,您将在header后面看到ascii数字,而不是二进制值。

为了解决这个问题,你能把内核改成下面吗?

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel EK;

我不知道为什么CGAL Surface_mesh不能与Exact_predicates_exact_constructions_kernel内核正确工作。也许这是一个bug,或者是一种欲望行为。

我对当前的问题解释如下:

  • 当使用CGAL::Exact_predicates_exact_constructions_kernel内核时,EPoint3中的每个值都不是double数据类型,而是const CGAL::Lazy_exact_nt<boost::multiprecision...数据类型。

  • 在这种情况下,数据类型是Lazy_exact_nt,那么,当写入顶点数据时,它调用operator << Lazy_exact_nt(文件Lazy_exact_nt.h),所以数据写错了。
    如果数据类型是原始的(检查文件io_tags.h,与io_Read_write的数据类型)将被正确写入。

相关内容

  • 没有找到相关文章

最新更新