Point operator()( const Vertex& v) const {
     std::size_t degree = CGAL::circulator_size( v.vertex_begin());
     if ( degree & 1) // odd degree only at border vertices
         return v.point();
     degree = degree / 2;
     double alpha = ( 4.0 - 2.0 * std::cos( 2.0 * CGAL_PI / degree)) / 9.0;
     Vector vec = (v.point() - CGAL::ORIGIN) * ( 1.0 - alpha);
     HV_circulator h = v.vertex_begin();
     do {
         // Even degree and border edges indicated non-manifold
         // vertex with two holes.
         if ( h->is_border_edge()) {
             std::cerr << "Error: non-manifold vertex. Erroneous smoothing."
                       << std::endl;
             return v.point();
         }
         vec = vec + ( h->opposite()->vertex()->point() - CGAL::ORIGIN)
           * alpha / static_cast<double>(degree);
         ++ h;
         CGAL_assertion( h != v.vertex_begin()); // even degree guaranteed
         ++ h;
     } while ( h != v.vertex_begin());
     return (CGAL::ORIGIN + vec);
 }