Files
Seth Hillbrand edbf34c2b2 Adjust RTree default floating point to use double
This reverts the previous work-around 7d62f14dd for the RTree splitting
degeneracy that was placed prior to v5.  It appears not to have worked
for all systems.  In its place, we use doubles instead of floats to
calculate the bounding box when filling the RTree.  This keeps maximum
volume items from overlapping with the system boundary in test cases.

(cherry-picked from 539ca5aa3)
2018-08-06 17:01:59 -07:00

93 lines
2.8 KiB
C++

/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2013 CERN
* @author Tomasz Wlostowski <[email protected]>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef __VIEW_RTREE_H
#define __VIEW_RTREE_H
#include <math/box2.h>
#include <geometry/rtree.h>
namespace KIGFX
{
typedef RTree<VIEW_ITEM*, int, 2, double> VIEW_RTREE_BASE;
/**
* Class VIEW_RTREE -
* Implements an R-tree for fast spatial indexing of VIEW items.
* Non-owning.
*/
class VIEW_RTREE : public VIEW_RTREE_BASE
{
public:
/**
* Function Insert()
* Inserts an item into the tree. Item's bounding box is taken via its ViewBBox() method.
*/
void Insert( VIEW_ITEM* aItem )
{
const BOX2I& bbox = aItem->ViewBBox();
const int mmin[2] = { bbox.GetX(), bbox.GetY() };
const int mmax[2] = { bbox.GetRight(), bbox.GetBottom() };
VIEW_RTREE_BASE::Insert( mmin, mmax, aItem );
}
/**
* Function Remove()
* Removes an item from the tree. Removal is done by comparing pointers, attepmting to remove a copy
* of the item will fail.
*/
void Remove( VIEW_ITEM* aItem )
{
// const BOX2I& bbox = aItem->ViewBBox();
// FIXME: use cached bbox or ptr_map to speed up pointer <-> node lookups.
const int mmin[2] = { INT_MIN, INT_MIN };
const int mmax[2] = { INT_MAX, INT_MAX };
VIEW_RTREE_BASE::Remove( mmin, mmax, aItem );
}
/**
* Function Query()
* Executes a function object aVisitor for each item whose bounding box intersects
* with aBounds.
*/
template <class Visitor>
void Query( const BOX2I& aBounds, Visitor& aVisitor ) // const
{
const int mmin[2] = { aBounds.GetX(), aBounds.GetY() };
const int mmax[2] = { aBounds.GetRight(), aBounds.GetBottom() };
VIEW_RTREE_BASE::Search( mmin, mmax, aVisitor );
}
private:
};
} // namespace KIGFX
#endif