polyhedron cgal_to_polyhedron( const Nef_polyhedron &NP ){
    Polyhedron P;
    polyhedron ret;
    
    if( NP.is_simple() ){
        NP.convert_to_polyhedron(P);
        std::vector<double> coords;
        std::vector<int> tris;
        int next_id = 0;
        std::map< Polyhedron::Vertex*, int > vid;
        for( Polyhedron::Vertex_iterator iter=P.vertices_begin(); iter!=P.vertices_end(); iter++ ){
            coords.push_back( CGAL::to_double( (*iter).point().x() ) );
            coords.push_back( CGAL::to_double( (*iter).point().y() ) );
            coords.push_back( CGAL::to_double( (*iter).point().z() ) );
            vid[ &(*iter) ] = next_id++;
        }
        
        for( Polyhedron::Facet_iterator iter=P.facets_begin(); iter!=P.facets_end(); iter++ ){
            Polyhedron::Halfedge_around_facet_circulator j = iter->facet_begin();
            tris.push_back( CGAL::circulator_size(j) );
            do {
                tris.push_back( std::distance(P.vertices_begin(), j->vertex()) );
            } while ( ++j != iter->facet_begin());
        }
        
        ret.initialize_load_from_mesh( coords, tris );
    } else {
        std::cout << "resulting polyhedron is not simple!" << std::endl;
    }
    return ret;
}
// Checks if there are two disconnected linestrings which both have the 2 coplanar facets
bool joinCreatesNoHole (Polyhedron::Halfedge_handle& heH) {
	pointVector otherFacetPnts = get_facetPoints(heH);		// Get points of other facet

	Polyhedron::Halfedge_around_facet_circulator hafIt = heH->opposite()->facet_begin();
	bool nextNotBorder	= false;				// starts with heH so false
	bool difFound		= false;				// if previous was not border
	bool refound		= false;				// if two border sections found with not border in between
	bool canJoinFacets	= true;					// output
	do {
		if (difFound ^ nextNotBorder) {			// heH->facet() != hafIt->opposite()->facet()) {
			if (refound) {
				canJoinFacets=false;			//if refound twice -> discconnected borders
				break;
			}
			refound		=  difFound;			// Set refound true
			difFound	= !difFound;			// Flip difFound
		}
		nextNotBorder = heH->facet() != hafIt->next()->opposite()->facet();
		if (difFound && nextNotBorder &&		// if current and next are not border and point is on other facet
			std::find(otherFacetPnts.begin(), otherFacetPnts.end(),hafIt->vertex()->point())!=otherFacetPnts.end()) {
				canJoinFacets=false;			// Point is touching
				break;
		}
	} while (++hafIt != heH->opposite()->facet_begin());
	return canJoinFacets;
}
bool triDoesNotIntersectFacet (Polyhedron::Halfedge_handle& heH, bool isOpposite) {

	Segment_3 checkSeg (heH->vertex()->point(),heH->prev()->prev()->vertex()->point());	
	Polyhedron::Halfedge_around_facet_circulator hafIt = heH->facet_begin()++;			// skip itself and first

	while (++hafIt != heH->prev()->facet_begin()) {
		if (CGAL::do_intersect(checkSeg,Segment_3(hafIt->vertex()->point(),hafIt->prev()->vertex()->point())))
			return false;
	} 
	if (!isOpposite)
		return triDoesNotIntersectFacet (heH->opposite(), true);
	else
		return true;
}
void Scene_polyhedron_selection_item::compute_elements()
{
    positions_facets.clear();
    positions_lines.clear();
    positions_points.clear();
    normals.clear();
    //The facets
    {


        for(Selection_set_facet::iterator
            it = selected_facets.begin(),
            end = selected_facets.end();
            it != end; ++it)
        {
            const Kernel::Vector_3 n =
                    CGAL::Polygon_mesh_processing::compute_face_normal(*it, *this->poly_item->polyhedron());

            normals.push_back(n.x());
            normals.push_back(n.y());
            normals.push_back(n.z());

            normals.push_back(n.x());
            normals.push_back(n.y());
            normals.push_back(n.z());

            normals.push_back(n.x());
            normals.push_back(n.y());
            normals.push_back(n.z());


            Polyhedron::Halfedge_around_facet_circulator
                    he = (*it)->facet_begin(),
                    cend = he;

            CGAL_For_all(he,cend)
            {
                const Kernel::Point_3& p = he->vertex()->point();
                positions_facets.push_back(p.x());
                positions_facets.push_back(p.y());
                positions_facets.push_back(p.z());
            }
        }
    }

    //The Lines
    {

        for(Selection_set_edge::iterator it = selected_edges.begin(); it != selected_edges.end(); ++it) {
            const Kernel::Point_3& a = (it->halfedge())->vertex()->point();
            const Kernel::Point_3& b = (it->halfedge())->opposite()->vertex()->point();
            positions_lines.push_back(a.x());
            positions_lines.push_back(a.y());
            positions_lines.push_back(a.z());

            positions_lines.push_back(b.x());
            positions_lines.push_back(b.y());
            positions_lines.push_back(b.z());
        }

    }

    //The points
    {
        for(Selection_set_vertex::iterator
            it = selected_vertices.begin(),
            end = selected_vertices.end();
            it != end; ++it)
        {
            const Kernel::Point_3& p = (*it)->point();
            positions_points.push_back(p.x());
            positions_points.push_back(p.y());
            positions_points.push_back(p.z());
        }
    }
}