libkdtree experiences and questions
Paul Harris
paulharris at computer.org
Tue Nov 11 12:08:21 UTC 2008
Excellent stuff, I've put it into a test_hayne.cpp file, and attached it to
a bug report.
Sylvain and I are debugging stuff stuff now, we'll add it to the test suite
:)
thanks again,
Paul
2008/11/11 Sam Hayne <Sam.Hayne at gmx.de>
>
> Paul Harris wrote:
>
> > Hi Sam,
>
> > great email, lots of detail
>
> Thx. If it helps you in any way I'm glad.
> (Hope those issues weren't all caused by VS or my edits. :D )
>
> > 3.1)
> > > I always ended up with runtime errors using erase(). :(
>
> > Could you please boil it down to a simple test case? (eg look at
> test_kdtree.cpp, just make up a new .cpp file that builds a tree and then >
> somehow crashes or asserts).
>
>
> Puhh... wasn't that easy to create an simple example (as in my case I got
> the points out of a bitmap).
> But here a bit lengthy one - it crashes deterministically each time.
>
> In my case erase() failed to delete point (41, 189)... deleting some other
> point instead.
> Eventually resulting in this runtime error:
> http://img359.imageshack.us/img359/4623/runtimeerrordz4.jpg
>
>
> //=======
> //Defs:
> //========
>
> struct duplet {
> typedef int value_type;
>
> inline value_type operator[](size_t const N) const { return d[N]; }
> inline bool operator==(duplet const& other) const
> {
> return this->d[0] == other.d[0] && this->d[1] == other.d[1];
>
> }
>
> inline bool operator!=(duplet const& other) const
> {
> return this->d[0] != other.d[0] || this->d[1] != other.d[1];
>
> }
>
> value_type d[2];
> //typedef boost::shared_ptr<duplet> ptr;
> };
>
> typedef KDTree::KDTree<2, duplet,
> std::pointer_to_binary_function<duplet,int,double> > duplet_tree_type;
>
> inline double return_dup( duplet d, int k ) { return d[k]; }
>
>
>
>
> //=======
> //main:
> //========
>
> duplet_tree_type dupl_tree_test(std::ptr_fun(return_dup));
> std::vector<duplet> vDuplets;
>
> //srand(time(0));
> int randy1 = 0;
> int randy2 = 0;
> for (int i=0; i<700; i++)
> {
> //create coordinate for new duplet
> randy1+=2;
> randy1=randy1%255;
> randy2+=3;
> randy2=randy2%255;
> //randy1 = rand() % 255;
> //randy2 = rand() % 255;
>
> //new duplet
> duplet super_dupre = { {randy1, randy2} };
>
> //check if duplet with same coordinate already in
> vector/tree. If not: insert in vector and tree
> duplet_tree_type::iterator pItr =
>
> dupl_tree_test.find_nearest(super_dupre,std::numeric_limits<double>::max()).
> first;
> if (*pItr!=super_dupre)
> {
> dupl_tree_test.insert(super_dupre);
> vDuplets.push_back(super_dupre);
> }
>
> }
>
> dupl_tree_test.optimise();
>
> int elements;
>
> while (vDuplets.size()>0) //delete all duplets from tree which are
> in the vector
> {
> elements = vDuplets.size();
>
>
> duplet element_to_erase = vDuplets.back();
> vDuplets.pop_back();
>
> dupl_tree_test.erase(element_to_erase); //erase() : will
> probably erase wrong element sooner or later
> //dupl_tree_test.erase_exact(element_to_erase);
> //erase_exact(): works
>
>
> //debug stuff:
> duplet_tree_type::iterator pItr =
>
> dupl_tree_test.find_nearest(element_to_erase,std::numeric_limits<double>::ma
> x()).first;
> duplet nearest_to_element = *pItr;
> if (nearest_to_element==element_to_erase)
> {
> // element still in tree... wrong element must have
> been erased
> int u = 7; //set breakpoint here
> }
> }
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.alioth.debian.org/pipermail/libkdtree-devel/attachments/20081111/ce5e96b6/attachment.htm
More information about the libkdtree-devel
mailing list