Subject: CGAL users discussion list
List archive
Re: [cgal-discuss] Fwd: How to do the nearest neighbor search on a Point_set_3 with properties
Chronological Thread
- From: Sebastien Loriot <>
- To:
- Subject: Re: [cgal-discuss] Fwd: How to do the nearest neighbor search on a Point_set_3 with properties
- Date: Fri, 11 Mar 2022 09:56:56 +0100
- Authentication-results: mail2-smtp-roc.national.inria.fr; spf=None ; spf=Pass ; spf=None
- Ironport-data: A9a23:keCd1aPefkeD1SvvrR2XkcFynXyQoLVcMsEvi/4bfWQNrUp00TEFn GYbXDqDaf+IZDb1Kth+OY6/8k0E68SHzN5lSXM5pCpnJ55ogZqcVI7Bdi8cHAvLc5adFBo/h yk6QoOdRCzhZiaE/n9BCpC48T8kk/jgqoPUUIYoAAgoLeNfYHpn2EoLd9IR2NYy24DiWlrV4 LsenuWGULOb824sWo4rw/nbwP9flKyaVOQw4zTSzdgS1LPvvyF94KA3fcldHFOkKmVgJdNWc s6YpF2PEsw1yD92Yj+tuu6TnkTn2dc+NyDW4pZdc/DKbhSvOkXe345jXMfwZ3u7hB2Ir9dU7 /5cnKC7UDd1MIrypbk4WCRXRnQW0a1uoNcrIFC6uM2XilLcKj7in6woA0YxMokVvO1wBAmi9 9RCcGFLPk3F3bjvhu7iIgVvrpxLwM3DJ4cYoHBn0XfcCd4pRJnCR+PB4towMDIY3J0QRa6EO ZpxhTxHYDv+czt/IXMtI5s1kM24vEnRLRofgQfAzUYwyzGLkFYZPKLWGNHac9jPScROlVuDv Urd7mHhC1cbMsaewHyL6BqRavTnmCr6XMcNDuT9+KIzxlKUwWMXBVsdUl7TTeSFZlCWWuJYD ms/6wMSprECqEKMcOSgehaFryvR1vIDYOZ4H+o/4QCL76Pb5QeFG2QJJgKtjvR25KfaohR6h je0c8PV6S9H6+LKFCrMnluAhXbjZnhPdD5qiTosFFNdu7HeTJcPYgUjp+uP/Yawh9zxXC7qm nWE8HF4iLIUgsoGka68+DgrYg5ARLCZEGbZBS2NBgpJCz+Vgqb7O+REDnCFsZ59wH6xFAXpg ZT9s5H2ABoyJZ+MjjeRZ+4GAauk4f2IWBWF3wIxTsJ+r2z1pyX7FWy13N2YDBc5WirjUW+5C HI/RSsMjHOuFCfwNPQvOtrZ5zoClPGwT4WNug/ogipmO8AtLmdrDQlhYkmf222FraTfufBXB HtvSu71VSxyIf0/klKeHr5BuZd2mH1W7T6MHfjTkkX/uZLDNSX9YepUYDOmMLpkhIva+1692 4gEZ6O3J+B3CrKWjt//qt5Nczjn7BETWfjLliCgXrXac1Q8Rz15VaO5LHFIU9UNopm5X9zgp hmVMnK0AnKl7ZEeAQnVOH1ldp31WpNz8SAyMSA2bASn3nEiZcCk66JGL8k7erwu9epCy/9oT qldK5/QXKgXEjmXqS4AaZTdrZB5cEv5iA+LOR2jamdtcpNlQTvP5dK5LBDk8zMDD3bsuMZn+ ++g2wrXTIAtXQNnCMqKOvujw0ng73cYkeN2GUDPJ4ALKknr9YFrLQ33j+M2c5lcc0WdmmPC2 l/PUxkCpOTLr4sky/XzhPiJ/9WzDu9zPktGBG2Ev7u7MC/t+GD8k4JNVeC/ey+ECDH59aCkU uViz//mNcoBklsX4ZF3FKxmzP5n6tbi++1awwBjECmZZlinEOk7cHyP3M0KqbcUg7EF4E25X UWA/tQcMrKMYZu3HFkULQsjT+KCyfBExWWIvKpteB33tH1t4b6KcUROJB3Q2iZTG714bdE+y uA7tc9KtgGy1kgwPtCdgnwG/miANCZbAaAut5VfH5WyzwR3kxdNZpvTDiKw65aKMo0ePk4vK z6SpazDm7UMmRaYIiRrTSDAjbhHmJADmBFW11tedV6HrdzI260s1xpL/DVrEwlYw32rCQ6o1 rSH6qG0GUmPw9usrM1KXmTpBBsYQRPFowr+zFwGkGCfRE6tPoAIwKvRJs7VlH31MUoFFtSYw F1c4GngWDfuOsr220PenGZ7/uf7Q4UZGhLqwaia8gfsI3X+STXgi66qI2EPrnMLxC/3aFLv/ YFXwQq7VUE32eP8bUH250l2GIn8kCy5GVE=
- Ironport-hdrordr: A9a23:grAeLa0FoXPiFzK8e5dEZAqjBJEkLtp133Aq2lEZdPUnSL3/qy nIpoVm6faUskdtZJhEo7q90ca7MBHhHPJOkPIs1PKZLXPbUQiTXeRfBOnZsl7d8kTFn4Y3tZ uIMZIOcOEYZWIasS+Q2njeLz9P+qj/zEnlv5a7856vd21XgmNbgjuRxjz1LqS+fmd7OaY=
- Ironport-phdr: A9a23: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
- Ironport-sdr: KV8QDw3BMiOd58Q4ryONcj2Q5yvKiAjzIrZMmAaypeLzvKapw5adGh5e/KcsIYmmtJgzf36mtF OLY2pDADPK4S6Q3GrTO10I60C3W838X0AqI9syeeU+Ua5cVhsqmNk8zMC450BwmOJ2Z2huCAoA QMssrwt0fg0A6asjshnVSAbsGOsJuTwcWb9d9LcVwAJdfxxIKMozygE//J7eUIZJfeZgP4zDYJ K+EHr/3QzcUm2PUxzP5AhNbrdfdZSjoNeISSqXIsrFw6j8yaldCMLHg76zuTFGUL3LrB2LPs9H SnkOpRLS+ZHNXTrXsRe6LX+p
Sorry for the late reply,
running your code with 5.4 on my linux I got:
Found nearest point of 0 0 0:
index = 0, distance = 0, point: [0 0 0 ]
color = [ 100, 100, 100 ]
as output which seems to be the expected result.
On what platform is the code compiled and run?
Best,
Sebastien.
On 3/6/22 18:46, Yaoyu Hu ( via cgal-discuss Mailing List) wrote:
Hi Sebastien,
In my sample code, I set up a point cloud with 10 points. Their coordinates have a range from [ 0, 0, 0 ] to [0.9, 0.9, 0.9]. Then I try to find the nearest point by using [0, 0, 0] as the query. But I got the result that point index 6 with coordinate [ 0.6, 0.6, 0.6 ] is the nearest one. In fact, no matter what query I use, I always get index 6 as the result. I must have done something wrong or misunderstood some details.
Thank you,
Yaoyu
On Fri, Mar 4, 2022 at 4:57 AM Sebastien Loriot < <>> wrote:
Could you please explain why you think there is a bug, with as
assertion
for example?
Thanks,
Sebastien.
On 3/3/22 04:06, Yaoyu Hu (
<> via cgal-discuss
Mailing List) wrote:
> I was so dumb that the compiling error in my previous email is
due to a
> typo.
>
> I have updated the sample code, now it compiles. Get the updated
code here
> https://gist.github.com/huyaoyu/6bd9e6b54bc895b7fadebe3863456e92
<https://gist.github.com/huyaoyu/6bd9e6b54bc895b7fadebe3863456e92>
> <https://gist.github.com/huyaoyu/6bd9e6b54bc895b7fadebe3863456e92
<https://gist.github.com/huyaoyu/6bd9e6b54bc895b7fadebe3863456e92>>
>
> Now I have a new problem. If I run the code, I got the following
> outputs. It seems that the search does not work for me. I must
have done
> something wrong.
>
> ========== Outputs. ==========
>
> Hello, test_point_set_nearest_neighbor!
> index = 0, point: [ 0 0 0 ], color: [ 100, 100, 100 ]
> index = 1, point: [ 0.1 0.1 0.1 ], color: [ 101, 101, 101 ]
> index = 2, point: [ 0.2 0.2 0.2 ], color: [ 102, 102, 102 ]
> index = 3, point: [ 0.3 0.3 0.3 ], color: [ 103, 103, 103 ]
> index = 4, point: [ 0.4 0.4 0.4 ], color: [ 104, 104, 104 ]
> index = 5, point: [ 0.5 0.5 0.5 ], color: [ 105, 105, 105 ]
> index = 6, point: [ 0.6 0.6 0.6 ], color: [ 106, 106, 106 ]
> index = 7, point: [ 0.7 0.7 0.7 ], color: [ 107, 107, 107 ]
> index = 8, point: [ 0.8 0.8 0.8 ], color: [ 108, 108, 108 ]
> index = 9, point: [ 0.9 0.9 0.9 ], color: [ 109, 109, 109 ]
> Found nearest point of 0 0 0:
> index = 6, distance = 0, point: [0.6 0.6 0.6 ]
> color = [ 106, 106, 106 ]
>
> ========== Outputs end. ==========
>
> Any help is appreciated.
>
> Thank you!
>
> Yaoyu
>
> ---------- Forwarded message ---------
> From: *Yaoyu Hu* <
<> <
<>>>
> Date: Wed, Mar 2, 2022 at 6:07 PM
> Subject: How to do the nearest neighbor search on a Point_set_3 with
> properties
> To: < <>
< <>>>
>
>
> Hi,
>
> On CGAL v5.4, Ubuntu 20.04, g++ 9.3.0.
>
> I'm trying to do the nearest neighbor search on a Point_set_3
object by
> "dD Spatial Searching". The Point_set_3 has a property for point
color.
> I am trying to follow the example "Using a Point Property Map of a
> Polygonal Mesh "
>
https://doc.cgal.org/latest/Spatial_searching/index.html#Spatial_searchingUsingSurfaceMesh
<https://doc.cgal.org/latest/Spatial_searching/index.html#Spatial_searchingUsingSurfaceMesh>
>
<https://doc.cgal.org/latest/Spatial_searching/index.html#Spatial_searchingUsingSurfaceMesh
<https://doc.cgal.org/latest/Spatial_searching/index.html#Spatial_searchingUsingSurfaceMesh>>
>
> The reason for referring to the above example is that I suppose
points
> and colors are saved as property maps in Point_set_3 objects and
I need
> to get the Index of a point from the Point_set_3 object, such
that I can
> use the Index object to retrieve a color object saved in the
property
> map. It looks like the relationship between mesh vertex
descriptor and
> mesh point property.
>
> I have two major questions based on my understanding of how
Point_set_3
> and "dD Spatial Searching " work:
>
> (1) Do I need an explicit Point_set_3::Index value to be able to
> retrieve a property from a property_map of a Point_set_3 object? My
> current understanding is yes, I need to have a Point_set_3::Index
value
> because the property_map is indexed by Point_set_3::Index objects.
>
> (2) When doing a search by "dD Spatial Searching", if I want to
have a
> Point_set_3::Index as the search result, I need to use things
> like CGAL::Search_traits_adapter such that the search tree will
store
> Point_set_3::Index for me.
>
> Based on the above thoughts, I have composed a sample code, which
> currently has some compile errors. I also created a GitHub gist
if that
> is more convenient.
> https://gist.github.com/huyaoyu/6bd9e6b54bc895b7fadebe3863456e92
<https://gist.github.com/huyaoyu/6bd9e6b54bc895b7fadebe3863456e92>
> <https://gist.github.com/huyaoyu/6bd9e6b54bc895b7fadebe3863456e92
<https://gist.github.com/huyaoyu/6bd9e6b54bc895b7fadebe3863456e92>>
>
> The compile error is shown after the code. The error says
> that CGAL::Search_traits_adapter needs three template arguments
but I
> only give it one. I cannot understand why it gives this error since
> there are three template arguments already. I failed to proceed any
> further and I think it's better to ask for help from experts. I
am also
> uncertain if my usage of "tree" and "search" is correct in the
reset of
> the code.
>
> Can someone help me to resolve the compile error and identify any
other
> errors regarding "tree" and "search"? Thank you so much!
>
> ========== Code begins. ==========
>
> #include <array>
> #include <iostream>
>
> #include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
> #include <CGAL/Point_set_3.h>
>
> #include <CGAL/Orthogonal_k_neighbor_search.h>
> #include <CGAL/Search_traits_3.h>
> #include <CGAL/Search_traits_adapter.h>
>
> template < typename CloudT, typename ColorMapT >
> typename boost::property_traits<ColorMapT>::value_type nearest_color(
> const CloudT& cloud,
> const ColorMapT& color_map,
> const typename CloudT::Point_3& query) {
>
> typedef typename
boost::property_traits<ColorMapT>::value_type Color_t;
>
> typedef typename CGAL::Kernel_traits<typename
> CloudT::Point_3>::Kernel CloudKernel_t;
> typedef CGAL::Search_traits_3<CloudKernel_t>
SearchTraits_base_t;
> typedef CGAL::Search_traits_adapter<
> typename CloutT::Index,
> typename CloudT::Point_map,
> SearchTraits_base_t
> > SearchTraits_t;
>
> typedef CGAL::Orthogonal_k_neighbor_search<SearchTraits_t>
> CloudSearch_t;
> typedef CloudSearch_t::Tree
> CloudSearchTree_t;
> typedef CloudSearchTree_t::Splitter
> CloudSearchSplitter_t;
> typedef CloudSearch_t::Distance
> CloudSearchDistance_t;
>
> // Set up a search tree.
> CloudSearchTree_t tree(
> cloud.begin(), cloud.end(),
> CloudSearchSplitter_t(),
> SearchTraits_t( cloud.point_map() ) );
>
> // Search.
> CloudSearchDistance_t distance( cloud.point_map() );
> CloudSearch_t search( tree, query, 1, 0, true, distance );
>
> const auto& neighbor_point_index = search.begin()->first;
> auto& cloud_neighbor_color = color_map[neighbor_point_index];
>
> return cloud_neighbor_color;
> }
>
>
> int main(int argc, char** argv) {
> std::cout << "Hello, test_point_set_nearest_neighbor! \n";
>
> typedef std::array< unsigned char, 3 > Color_t;
> typedef CGAL::Exact_predicates_inexact_constructions_kernel
Kernel_t;
> typedef Kernel_t::Point_3 Point_t;
> typedef CGAL::Point_set_3<Point_t> PointSet_t;
>
> PointSet_t cloud;
>
> auto [ color_map, flag_added ] =
> cloud.add_property_map<Color_t>("color");
>
> // Populate the point cloud with color.
> // Omitted.
>
> nearest_color( cloud, color_map, Point_t(0, 0, 0) );
>
> return 0;
> }
>
> ========== Code ends. ==========
>
> ========== Compile error begins. ==========
>
> src/test_point_set_nearest_neighbor.cpp: In function ‘typename
> boost::property_traits<IndexMap>::value_type nearest_color(const
> CloudT&, const ColorMapT&, const typename CloudT::Point_3&)’:
>
/ws/src/shimizu_test_reconstruct_surface/src/test_point_set_nearest_neighbor.cpp:26:5:
> error: wrong number of template arguments (1, should be 3)
>
> (Later error messages are omitted.)
>
> ========== Compile error ends. ==========
>
> Thank you!
>
> Yaoyu
>
> --
> 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
<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
- [cgal-discuss] How to do the nearest neighbor search on a Point_set_3 with properties, Yaoyu Hu, 03/03/2022
- [cgal-discuss] Fwd: How to do the nearest neighbor search on a Point_set_3 with properties, Yaoyu Hu, 03/03/2022
- Re: [cgal-discuss] Fwd: How to do the nearest neighbor search on a Point_set_3 with properties, Sebastien Loriot, 03/04/2022
- Re: [cgal-discuss] Fwd: How to do the nearest neighbor search on a Point_set_3 with properties, Yaoyu Hu, 03/06/2022
- Re: [cgal-discuss] Fwd: How to do the nearest neighbor search on a Point_set_3 with properties, Sebastien Loriot, 03/11/2022
- Re: [cgal-discuss] Fwd: How to do the nearest neighbor search on a Point_set_3 with properties, Yaoyu Hu, 03/06/2022
- Re: [cgal-discuss] Fwd: How to do the nearest neighbor search on a Point_set_3 with properties, Sebastien Loriot, 03/04/2022
- [cgal-discuss] Fwd: How to do the nearest neighbor search on a Point_set_3 with properties, Yaoyu Hu, 03/03/2022
Archive powered by MHonArc 2.6.19+.