Commit 89b80b2b authored by Maciej Suminski's avatar Maciej Suminski

Merged rtree.h, to avoid code duplication.

Fixes the case, when waste is never greater then the worst case and seeds assignment does not occur.
parent 17980792
......@@ -153,10 +153,12 @@ struct queryVisitor
{
}
void operator()( VIEW_ITEM* aItem )
bool operator()( VIEW_ITEM* aItem )
{
if( aItem->ViewIsVisible() )
m_cont.push_back( VIEW::LAYER_ITEM_PAIR( aItem, m_layer ) );
return true;
}
Container& m_cont;
......@@ -387,7 +389,7 @@ struct VIEW::updateItemsColor
{
}
void operator()( VIEW_ITEM* aItem )
bool operator()( VIEW_ITEM* aItem )
{
// Obtain the color that should be used for coloring the item
const COLOR4D color = painter->GetSettings()->GetColor( aItem, layer );
......@@ -395,6 +397,8 @@ struct VIEW::updateItemsColor
if( group >= 0 )
gal->ChangeGroupColor( group, color );
return true;
}
int layer;
......@@ -447,12 +451,14 @@ struct VIEW::changeItemsDepth
{
}
void operator()( VIEW_ITEM* aItem )
bool operator()( VIEW_ITEM* aItem )
{
int group = aItem->getGroup( layer );
if( group >= 0 )
gal->ChangeGroupDepth( group, depth );
return true;
}
int layer, depth;
......@@ -571,15 +577,17 @@ struct VIEW::drawItem
{
}
void operator()( VIEW_ITEM* aItem )
bool operator()( VIEW_ITEM* aItem )
{
// Conditions that have te be fulfilled for an item to be drawn
bool drawCondition = aItem->ViewIsVisible() &&
aItem->ViewGetLOD( currentLayer->id ) < view->m_scale;
if( !drawCondition )
return;
return true;
view->draw( aItem, currentLayer->id );
return true;
}
const VIEW_LAYER* currentLayer;
......@@ -676,9 +684,11 @@ bool VIEW::IsDirty() const
struct VIEW::unlinkItem
{
void operator()( VIEW_ITEM* aItem )
bool operator()( VIEW_ITEM* aItem )
{
aItem->m_view = NULL;
return true;
}
};
......@@ -690,7 +700,7 @@ struct VIEW::recacheItem
{
}
void operator()( VIEW_ITEM* aItem )
bool operator()( VIEW_ITEM* aItem )
{
// Remove previously cached group
int prevGroup = aItem->getGroup( layer );
......@@ -712,6 +722,8 @@ struct VIEW::recacheItem
{
aItem->setGroup( layer, -1 );
}
return true;
}
VIEW* view;
......@@ -792,12 +804,14 @@ struct VIEW::clearLayerCache
{
}
void operator()( VIEW_ITEM* aItem )
bool operator()( VIEW_ITEM* aItem )
{
if( aItem->storesGroups() )
{
aItem->deleteGroups();
}
return true;
}
VIEW* view;
......
......@@ -163,7 +163,7 @@ public:
/// Calculate Statistics
Statistics CalcStats( );
Statistics CalcStats();
/// Remove all entries from tree
void RemoveAll();
......@@ -396,7 +396,7 @@ protected:
bool IsInternalNode() { return m_level > 0; } // Not a leaf, but a internal node
bool IsLeaf() { return m_level == 0; } // A leaf, contains data
int m_count; ///< Count
int m_count; ///< Count
int m_level; ///< Leaf is zero, others positive
Branch m_branch[MAXNODES]; ///< Branch
};
......@@ -830,18 +830,18 @@ RTREE_TEMPLATE
bool RTREE_QUAL::Load( RTFileStream& a_stream )
{
// Write some kind of header
int _dataFileId = ('R' << 0) | ('T' << 8) | ('R' << 16) | ('E' << 24);
int _dataSize = sizeof(DATATYPE);
int _dataNumDims = NUMDIMS;
int _dataElemSize = sizeof(ELEMTYPE);
int _dataFileId = ('R' << 0) | ('T' << 8) | ('R' << 16) | ('E' << 24);
int _dataSize = sizeof(DATATYPE);
int _dataNumDims = NUMDIMS;
int _dataElemSize = sizeof(ELEMTYPE);
int _dataElemRealSize = sizeof(ELEMTYPEREAL);
int _dataMaxNodes = TMAXNODES;
int _dataMinNodes = TMINNODES;
int dataFileId = 0;
int dataSize = 0;
int dataNumDims = 0;
int dataElemSize = 0;
int dataFileId = 0;
int dataSize = 0;
int dataNumDims = 0;
int dataElemSize = 0;
int dataElemRealSize = 0;
int dataMaxNodes = 0;
int dataMinNodes = 0;
......@@ -932,10 +932,10 @@ RTREE_TEMPLATE
bool RTREE_QUAL::Save( RTFileStream& a_stream )
{
// Write some kind of header
int dataFileId = ('R' << 0) | ('T' << 8) | ('R' << 16) | ('E' << 24);
int dataSize = sizeof(DATATYPE);
int dataNumDims = NUMDIMS;
int dataElemSize = sizeof(ELEMTYPE);
int dataFileId = ('R' << 0) | ('T' << 8) | ('R' << 16) | ('E' << 24);
int dataSize = sizeof(DATATYPE);
int dataNumDims = NUMDIMS;
int dataElemSize = sizeof(ELEMTYPE);
int dataElemRealSize = sizeof(ELEMTYPEREAL);
int dataMaxNodes = TMAXNODES;
int dataMinNodes = TMINNODES;
......@@ -1293,20 +1293,20 @@ int RTREE_QUAL::PickBranch( Rect* a_rect, Node* a_node )
for( int index = 0; index < a_node->m_count; ++index )
{
Rect* curRect = &a_node->m_branch[index].m_rect;
area = CalcRectVolume( curRect );
area = CalcRectVolume( curRect );
tempRect = CombineRect( a_rect, curRect );
increase = CalcRectVolume( &tempRect ) - area;
if( (increase < bestIncr) || firstTime )
{
best = index;
best = index;
bestArea = area;
bestIncr = increase;
firstTime = false;
}
else if( (increase == bestIncr) && (area < bestArea) )
{
best = index;
best = index;
bestArea = area;
bestIncr = increase;
}
......@@ -1594,8 +1594,8 @@ void RTREE_QUAL::InitParVars( PartitionVars* a_parVars, int a_maxRects, int a_mi
for( int index = 0; index < a_maxRects; ++index )
{
a_parVars->m_taken[index] = false;
a_parVars->m_partition[index] = -1;
a_parVars->m_taken[index] = false;
a_parVars->m_partition[index] = -1;
}
}
......@@ -1622,7 +1622,7 @@ void RTREE_QUAL::PickSeeds( PartitionVars* a_parVars )
&a_parVars->m_branchBuf[indexB].m_rect );
waste = CalcRectVolume( &oneRect ) - area[indexA] - area[indexB];
if( waste > worst )
if( waste >= worst )
{
worst = waste;
seed0 = indexA;
......@@ -1856,8 +1856,6 @@ bool RTREE_QUAL::Search( Node* a_node, Rect* a_rect, int& a_foundCount, bool a_r
}
//calculate the minimum distance between a point and a rectangle as defined by Manolopoulos et al.
//it uses the square distance to avoid the use of ELEMTYPEREAL values, which are slower.
RTREE_TEMPLATE
......
This diff is collapsed.
......@@ -27,7 +27,7 @@
#include <math/box2.h>
#include <rtree.h>
#include <geometry/rtree.h>
namespace KIGFX
{
......@@ -76,7 +76,6 @@ public:
* 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
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment