Skip to Content.
Sympa Menu

cgal-discuss - Re: [cgal-discuss] How do I construct a WritablePropertyMap?

Subject: CGAL users discussion list

List archive

Re: [cgal-discuss] How do I construct a WritablePropertyMap?


Chronological Thread 
  • From: Iason Manolas <>
  • To:
  • Subject: Re: [cgal-discuss] How do I construct a WritablePropertyMap?
  • Date: Fri, 4 Nov 2016 16:58:47 +0200
  • Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None ; spf=Pass ; spf=None

This is my code.
Do you think there could be something wrong with my cgal distribution?

Iason


On 4 November 2016 at 16:17, Iason Manolas <> wrote:
CGAL::Polyhedron_3<CGAL::Exact_predicates_inexact_constructions_kernel>

On 4 November 2016 at 16:10, Sebastien Loriot (GeometryFactory) <> wrote:
What is your polyhedron type?

Sebastien.

On 11/04/2016 02:59 PM, Iason Manolas wrote:
My program crashes when I call compute_vertex_normals.
The stack calling the function that crashes is:
4.In *compute_normal.h*at line 183: *(!is_border**(he,pmesh))*
3.In *helpers.h* at line 45: *face(hd,g)*
2.In *graph_traits_Polyhedron_3.h* at line: 420: *h->face();*
1.In H*alfedgeDS_halfedge_base.h* at line 327:*face()*

The error I get in Qt creator is SIGSEGV
<http://stackoverflow.com/questions/2454192/whats-sigsegv-segmentation-fault-in-qt>
which after searching found out that propably means: "Trying to access
pointer with invalid value."
My guess was that I had not correctly initialized the Polyhedron but
everything seems fine..

Any idea why this happens?

Best Regards,
Iason Manolas

On 1 November 2016 at 10:53, Andreas Fabri
<
<mailto:>> wrote:

    You must
    #include <boost/property_map/property_map.hpp>

    and write
    compute_vertex_normals(P,boost::make_assoc_property_map(normals))


    On 01/11/2016 09:45, Iason Manolas wrote:

        Thanks for your response Sebastien.

        After reading your code  I wrote:
        using vd=boost::graph_traits<CGALPolyhedron>::vertex_descriptor;
        std::map<vd,Kernel::Vector_3>* normals;
        CGAL::Polygon_mesh_processing::compute_vertex_normals(P,normals); (since
        I want to compute vertex and not face normals)

        But I get:

        /usr/include/CGAL/Polygon_mesh_processing/compute_normal.h:228:
        error:
        no matching function for call to
        ‘put(std::map<CGAL::internal::In_place_list_iterator<CGAL::HalfedgeDS_in_place_list_vertex<CGAL::I_Polyhedron_vertex<CGAL::HalfedgeDS_vertex_base<CGAL::HalfedgeDS_list_types<CGAL::Epick,
        CGAL::I_Polyhedron_derived_items_3<CGAL::Polyhedron_items_3>,
        std::allocator<int> >, CGAL::Boolean_tag<true>,
        CGAL::Point_3<CGAL::Epick> > > >,
        std::allocator<CGAL::HalfedgeDS_in_place_list_vertex<CGAL::I_Polyhedron_vertex<CGAL::HalfedgeDS_vertex_base<CGAL::HalfedgeDS_list_types<CGAL::Epick,
        CGAL::I_Polyhedron_derived_items_3<CGAL::Polyhedron_items_3>,
        std::allocator<int> >, CGAL::Boolean_tag<true>,
        CGAL::Point_3<CGAL::Epick> > > > > >,
        CGAL::Vector_3<CGAL::Epick> >&,
        CGAL::HDS_graph_traits<CGAL::Polyhedron_3<CGAL::Epick>

            ::vertex_descriptor&,

        CGAL::Type_equality_wrapper<CGAL::Cartesian_base_no_ref_count<double,
        CGAL::Epick>, CGAL::Epick>::Vector_3&)’
             put(vnm, v, vec);
                ^
        That propably means that the put fuction cannot recognize vnm ( I
        passed) as a valid argument?



        On 1 November 2016 at 09:50, Sebastien Loriot (GeometryFactory)
        < <mailto:>
        <mailto: <mailto:>>> wrote:

            A writable property map, as describe in the concept of the
        boost web
            site is a mecanism that allow to generically associate a
        property
            (the value type) to a given object (the key).

            If you want to associate a normal to a facet of a
        Polyhedron, here
            is a simple example (not tested):


            struct Poly_normal_map{

              typedef Polyhedron::Facet_handle key_type;
              typedef Kernel::Vector_3 value_type;
              typedef boost::writable_property_map_tag category;

              std::map<Polyhedron::Facet_handle, Kernel::Vector_3>* normals;

              Poly_normal_map() : normals(NULL)
              {}

              Poly_normal_map(std::map<Polyhedron::Facet_handle,
                                       Kernel::Vector_3>& n)
                : normals(*n)
              {}

              friend void put(Poly_normal_map pnm,
                              Polyhedron::Facet_handle fh,
                              const Kernel::Vector_3& n
              {
                CGAL_assertion(pnm.normals!=0);
                pnm.normals.insert( std::make_pair(fh, n) );
              }
            };

            std::map<Polyhedron::Facet_handle, Kernel::Vector_3> normals;
            Poly_normal_map vpm(normals); //vpm is you writable property map


            If you want to make the property map read-write, you can add
            a get function:

              friend const value_type& get(Poly_normal_map pnm,
                                           Polyhedron::Facet_handle fh)
              {
                CGAL_assertion(pnm.normals!=0);
                return pnm.normals[fh];
              }

            and update the category tag.

            Note that the code I've written is roughly equivalent to using a
            boost::associative_property_map

        (http://www.boost.org/doc/libs/1_62_0/libs/property_map/doc/associative_property_map.html
        <http://www.boost.org/doc/libs/1_62_0/libs/property_map/doc/associative_property_map.html>

        <http://www.boost.org/doc/libs/1_62_0/libs/property_map/doc/associative_property_map.html
        <http://www.boost.org/doc/libs/1_62_0/libs/property_map/doc/associative_property_map.html>>)
            :

            std::map<Polyhedron::Facet_handle, Kernel::Vector_3> normals;
            boost::associative_property_map<
                     std::map<Polyhedron::Facet_handle,
                              Kernel::Vector_3> > vpm(normals);

            If you're not stuck with Polyhedron_3, you can use class
            Surface_mesh that comes with its own property mechanism
            as illustrated in this example:


        http://doc.cgal.org/latest/Polygon_mesh_processing/Polygon_mesh_processing_2compute_normals_example_8cpp-example.html
        <http://doc.cgal.org/latest/Polygon_mesh_processing/Polygon_mesh_processing_2compute_normals_example_8cpp-example.html>

        <http://doc.cgal.org/latest/Polygon_mesh_processing/Polygon_mesh_processing_2compute_normals_example_8cpp-example.html
        <http://doc.cgal.org/latest/Polygon_mesh_processing/Polygon_mesh_processing_2compute_normals_example_8cpp-example.html>>

            Sebastien.



            On 10/31/2016 12:46 PM, Iason Manolas wrote:

                Hi,

                I am new to CGAL. I have constructed a
        CGAL::Polyhedron_3 and
                now I want
                to compute the normal vector for each of its vertices. So I
                found the
                Polygon Mesh Processing package which happens to have a
        function

        <http://doc.cgal.org/latest/Polygon_mesh_processing/group__PMP__normal__grp.html#gad46aaf003999b2939f3f9e4f6fa58d0e
        <http://doc.cgal.org/latest/Polygon_mesh_processing/group__PMP__normal__grp.html#gad46aaf003999b2939f3f9e4f6fa58d0e>

        <http://doc.cgal.org/latest/Polygon_mesh_processing/group__PMP__normal__grp.html#gad46aaf003999b2939f3f9e4f6fa58d0e
        <http://doc.cgal.org/latest/Polygon_mesh_processing/group__PMP__normal__grp.html#gad46aaf003999b2939f3f9e4f6fa58d0e>>>
                doing exactly what I want . In the above link I found
        out that the
                second argument was of type  VertexNormalMap which is a
        model of
                WritablePropertyMap. There was a link

        <http://www.boost.org/doc/libs/1_62_0/libs/property_map/doc/WritablePropertyMap.html
        <http://www.boost.org/doc/libs/1_62_0/libs/property_map/doc/WritablePropertyMap.html>

        <http://www.boost.org/doc/libs/1_62_0/libs/property_map/doc/WritablePropertyMap.html
        <http://www.boost.org/doc/libs/1_62_0/libs/property_map/doc/WritablePropertyMap.html>>>
                to boost libraries explaining(?) what writable property
        map is .

                Unfortunately this is my first encounter with property
        maps and
                consequently I am a bit confused..
                I also had a look at cgal's explanation of property maps
        page
                <http://doc.cgal.org/latest/Property_map/index.html
        <http://doc.cgal.org/latest/Property_map/index.html>
                <http://doc.cgal.org/latest/Property_map/index.html
        <http://doc.cgal.org/latest/Property_map/index.html>> >, but I
                did not
                understand much..

                Could anyone suggest a way of creating the property map
        I need?

                Best Regards,
                Iason



            --
            You are currently subscribed to cgal-discuss.
            To unsubscribe or access the archives, go to
            https://sympa.inria.fr/sympa/info/cgal-discuss
        <https://sympa.inria.fr/sympa/info/cgal-discuss>
            <https://sympa.inria.fr/sympa/info/cgal-discuss
        <https://sympa.inria.fr/sympa/info/cgal-discuss>>




    --
    Andreas Fabri, PhD
    Chief Officer, GeometryFactory
    Editor, The CGAL Project

    phone: +33.492.954.912 <tel:%2B33.492.954.912>    skype: andreas.fabri

    --
    You are currently subscribed to cgal-discuss.
    To unsubscribe or access the archives, go to
    https://sympa.inria.fr/sympa/info/cgal-discuss
    <https://sympa.inria.fr/sympa/info/cgal-discuss>





--
You are currently subscribed to cgal-discuss.
To unsubscribe or access the archives, go to
https://sympa.inria.fr/sympa/info/cgal-discuss







Archive powered by MHonArc 2.6.18.

Top of Page