IGL_INLINE void igl::copyleft::cgal::outer_facet( const Eigen::PlainObjectBase<DerivedV> & V, const Eigen::PlainObjectBase<DerivedF> & F, const Eigen::PlainObjectBase<DerivedI> & I, IndexType & f, bool & flipped) { // Algorithm: // // 1. Find an outer edge (s, d). // // 2. Order adjacent facets around this edge. Because the edge is an // outer edge, there exists a plane passing through it such that all its // adjacent facets lie on the same side. The implementation of // order_facets_around_edge() will find a natural start facet such that // The first and last facets according to this order are on the outside. // // 3. Because the vertex s is an outer vertex by construction (see // implemnetation of outer_edge()). The first adjacent facet is facing // outside (i.e. flipped=false) if it has positive X normal component. // If it has zero normal component, it is facing outside if it contains // directed edge (s, d). //typedef typename DerivedV::Scalar Scalar; typedef typename DerivedV::Index Index; Index s,d; Eigen::Matrix<Index,Eigen::Dynamic,1> incident_faces; outer_edge(V, F, I, s, d, incident_faces); assert(incident_faces.size() > 0); auto convert_to_signed_index = [&](size_t fid) -> int{ if ((F(fid, 0) == s && F(fid, 1) == d) || (F(fid, 1) == s && F(fid, 2) == d) || (F(fid, 2) == s && F(fid, 0) == d) ) { return int(fid+1) * -1; } else { return int(fid+1); } }; auto signed_index_to_index = [&](int signed_id) -> size_t { return size_t(abs(signed_id) - 1); }; std::vector<int> adj_faces(incident_faces.size()); std::transform(incident_faces.data(), incident_faces.data() + incident_faces.size(), adj_faces.begin(), convert_to_signed_index); DerivedV pivot_point = V.row(s); pivot_point(0, 0) += 1.0; Eigen::VectorXi order; order_facets_around_edge(V, F, s, d, adj_faces, pivot_point, order); f = signed_index_to_index(adj_faces[order[0]]); flipped = adj_faces[order[0]] > 0; }
bool PointCloud::save(const std::string& filename) { if (QString(filename.c_str()).right(3) == "ply") { PCLPointCloud point_cloud; osg::Vec3 pivot_point(-13.382786, 50.223461, 917.477600); osg::Vec3 axis_normal(-0.054323, -0.814921, -0.577020); osg::Matrix transformation = osg::Matrix::translate(-pivot_point)*osg::Matrix::rotate(axis_normal, osg::Vec3(0, 0, 1)); for (size_t i = 0; i < points_num_; ++ i) { osg::Vec3 point(at(i).x, at(i).y, at(i).z); point = transformation.preMult(point); point_cloud.push_back(PCLPoint(point.x(), point.y(), point.z())); } pcl::PLYWriter ply_writer; if (ply_writer.write<PCLPoint>(filename, point_cloud) != 0) return false; } else { pcl::PCDWriter pcd_writer; if (pcd_writer.writeBinaryCompressed<PCLRichPoint>(filename, *this) != 0) return false; } return true; }