Krita Source Code Documentation
Loading...
Searching...
No Matches
KoRTree< T >::NonLeafNode Class Reference

#include <KoRTree.h>

+ Inheritance diagram for KoRTree< T >::NonLeafNode:

Public Member Functions

LeafNodechooseLeaf (const QRectF &bb) override
 
NonLeafNodechooseNode (const QRectF &bb, int level) override
 
void contained (const QRectF &point, QMap< int, T > &result) const override
 
void contains (const QPointF &point, QMap< int, T > &result) const override
 
virtual NodegetNode (int index) const
 
virtual void insert (const QRectF &bb, Node *data)
 
void intersects (const QRectF &rect, QMap< int, T > &result) const override
 
void keys (QList< QRectF > &result) const override
 
void move (Node *node, int index) override
 
 NonLeafNode (int capacity, int level, Node *parent)
 
void remove (int index) override
 
void values (QMap< int, T > &result) const override
 
 ~NonLeafNode () override
 
- Public Member Functions inherited from KoRTree< T >::Node
virtual const QRectF & boundingBox () const
 
virtual const QRectF & childBoundingBox (int index) const
 
virtual int childCount () const
 
virtual void clear ()
 
virtual bool isLeaf () const
 
virtual bool isRoot () const
 
virtual int level () const
 
 Node (int capacity, int level, Node *parent)
 
virtual Nodeparent () const
 
virtual int place () const
 
virtual void setChildBoundingBox (int index, const QRectF &rect)
 
virtual void setLevel (int level)
 
virtual void setParent (Node *parent)
 
virtual void setPlace (int place)
 
virtual void updateBoundingBox ()
 
virtual ~Node ()
 

Protected Member Functions

virtual NodegetLeastEnlargement (const QRectF &bb) const
 

Protected Attributes

QVector< Node * > m_childs
 
- Protected Attributes inherited from KoRTree< T >::Node
QRectF m_boundingBox
 
QVector< QRectF > m_childBoundingBox
 
int m_counter
 
int m_level
 
Nodem_parent
 
int m_place
 

Detailed Description

template<typename T>
class KoRTree< T >::NonLeafNode

Definition at line 245 of file KoRTree.h.

Constructor & Destructor Documentation

◆ NonLeafNode()

template<typename T >
KoRTree< T >::NonLeafNode::NonLeafNode ( int capacity,
int level,
Node * parent )

Definition at line 833 of file KoRTree.h.

834 : Node(capacity, level, parent)
835 , m_childs(capacity)
836{
837 //debugFlake << "NonLeafNode::NonLeafNode()" << this;
838}
Node(int capacity, int level, Node *parent)
Definition KoRTree.h:776
virtual int level() const
Definition KoRTree.h:212
virtual Node * parent() const
Definition KoRTree.h:174
QVector< Node * > m_childs
Definition KoRTree.h:274

◆ ~NonLeafNode()

template<typename T >
KoRTree< T >::NonLeafNode::~NonLeafNode ( )
override

Definition at line 841 of file KoRTree.h.

842{
843 //debugFlake << "NonLeafNode::~NonLeafNode()" << this;
844 for (int i = 0; i < this->m_counter; ++i) {
845 delete m_childs[i];
846 }
847}

Member Function Documentation

◆ chooseLeaf()

template<typename T >
KoRTree< T >::LeafNode * KoRTree< T >::NonLeafNode::chooseLeaf ( const QRectF & bb)
overridevirtual

Implements KoRTree< T >::Node.

Definition at line 883 of file KoRTree.h.

884{
885 return getLeastEnlargement(bb)->chooseLeaf(bb);
886}
virtual LeafNode * chooseLeaf(const QRectF &bb)=0
virtual Node * getLeastEnlargement(const QRectF &bb) const
Definition KoRTree.h:952

References KoRTree< T >::LeafNode::chooseLeaf().

◆ chooseNode()

template<typename T >
KoRTree< T >::NonLeafNode * KoRTree< T >::NonLeafNode::chooseNode ( const QRectF & bb,
int level )
overridevirtual

Implements KoRTree< T >::Node.

Definition at line 889 of file KoRTree.h.

890{
891 if (this->m_level > level) {
892 return getLeastEnlargement(bb)->chooseNode(bb, level);
893 } else {
894 return this;
895 }
896
897}
virtual NonLeafNode * chooseNode(const QRectF &bb, int level)=0

References KoRTree< T >::NonLeafNode::chooseNode().

◆ contained()

template<typename T >
void KoRTree< T >::NonLeafNode::contained ( const QRectF & point,
QMap< int, T > & result ) const
overridevirtual

Implements KoRTree< T >::Node.

Definition at line 920 of file KoRTree.h.

921{
922 for (int i = 0; i < this->m_counter; ++i) {
923 if (this->m_childBoundingBox[i].intersects(rect)) {
924 m_childs[i]->contained(rect, result);
925 }
926 }
927}
QVector< QRectF > m_childBoundingBox
Definition KoRTree.h:235
void intersects(const QRectF &rect, QMap< int, T > &result) const override
Definition KoRTree.h:900

References KoRTree< T >::intersects().

◆ contains()

template<typename T >
void KoRTree< T >::NonLeafNode::contains ( const QPointF & point,
QMap< int, T > & result ) const
overridevirtual

Implements KoRTree< T >::Node.

Definition at line 910 of file KoRTree.h.

911{
912 for (int i = 0; i < this->m_counter; ++i) {
913 if (this->m_childBoundingBox[i].contains(point)) {
914 m_childs[i]->contains(point, result);
915 }
916 }
917}
void contains(const QPointF &point, QMap< int, T > &result) const override
Definition KoRTree.h:910

References KoRTree< T >::contains().

◆ getLeastEnlargement()

template<typename T >
KoRTree< T >::Node * KoRTree< T >::NonLeafNode::getLeastEnlargement ( const QRectF & bb) const
protectedvirtual

Definition at line 952 of file KoRTree.h.

953{
954 //debugFlake << "NonLeafNode::getLeastEnlargement";
955 QVarLengthArray<qreal> area(this->m_counter);
956 for (int i = 0; i < this->m_counter; ++i) {
957 QSizeF big(this->m_childBoundingBox[i].united(bb).size());
958 area[i] = big.width() * big.height() - this->m_childBoundingBox[i].width() * this->m_childBoundingBox[i].height();
959 }
960
961 int minIndex = 0;
962 qreal minArea = area[minIndex];
963 //debugFlake << " min" << minIndex << minArea;
964
965 for (int i = 1; i < this->m_counter; ++i) {
966 if (area[i] < minArea) {
967 minIndex = i;
968 minArea = area[i];
969 //debugFlake << " min" << minIndex << minArea;
970 }
971 }
972
973 return m_childs[minIndex];
974}
int size(const Forest< T > &forest)
Definition KisForest.h:1232

◆ getNode()

template<typename T >
KoRTree< T >::Node * KoRTree< T >::NonLeafNode::getNode ( int index) const
virtual

Definition at line 946 of file KoRTree.h.

947{
948 return m_childs[index];
949}

◆ insert()

template<typename T >
void KoRTree< T >::NonLeafNode::insert ( const QRectF & bb,
Node * data )
virtual

Definition at line 850 of file KoRTree.h.

851{
852 m_childs[this->m_counter] = data;
853 data->setPlace(this->m_counter);
854 data->setParent(this);
855 this->m_childBoundingBox[this->m_counter] = bb;
856 this->m_boundingBox = this->m_boundingBox.united(bb);
857 //debugFlake << "NonLeafNode::insert" << this->nodeId() << data->nodeId();
858 ++this->m_counter;
859}
QRectF m_boundingBox
Definition KoRTree.h:234

References KoRTree< T >::Node::setParent(), and KoRTree< T >::Node::setPlace().

◆ intersects()

template<typename T >
void KoRTree< T >::NonLeafNode::intersects ( const QRectF & rect,
QMap< int, T > & result ) const
overridevirtual

Implements KoRTree< T >::Node.

Definition at line 900 of file KoRTree.h.

901{
902 for (int i = 0; i < this->m_counter; ++i) {
903 if (this->m_childBoundingBox[i].intersects(rect)) {
904 m_childs[i]->intersects(rect, result);
905 }
906 }
907}

References KoRTree< T >::intersects(), and KoRTree< T >::NonLeafNode::intersects().

◆ keys()

template<typename T >
void KoRTree< T >::NonLeafNode::keys ( QList< QRectF > & result) const
overridevirtual

Implements KoRTree< T >::Node.

Definition at line 930 of file KoRTree.h.

931{
932 for (int i = 0; i < this->m_counter; ++i) {
933 m_childs[i]->keys(result);
934 }
935}

◆ move()

template<typename T >
void KoRTree< T >::NonLeafNode::move ( Node * node,
int index )
overridevirtual

Implements KoRTree< T >::Node.

Definition at line 872 of file KoRTree.h.

873{
874 //debugFlake << "NonLeafNode::move" << this << node << index << node->nodeId() << "->" << this->nodeId();
875 NonLeafNode * n = dynamic_cast<NonLeafNode *>(node);
876 if (n) {
877 QRectF bb = n->childBoundingBox(index);
878 insert(bb, n->getNode(index));
879 }
880}
virtual void insert(const QRectF &bb, Node *data)
Definition KoRTree.h:850
NonLeafNode(int capacity, int level, Node *parent)
Definition KoRTree.h:833

References KoRTree< T >::Node::childBoundingBox(), KoRTree< T >::NonLeafNode::getNode(), and KoRTree< T >::insert().

◆ remove()

template<typename T >
void KoRTree< T >::NonLeafNode::remove ( int index)
overridevirtual

Reimplemented from KoRTree< T >::Node.

Definition at line 862 of file KoRTree.h.

863{
864 for (int i = index + 1; i < this->m_counter; ++i) {
865 m_childs[i-1] = m_childs[i];
866 m_childs[i-1]->setPlace(i - 1);
867 }
868 Node::remove(index);
869}
bool remove()
remove removes this node from its parent image.
Definition Node.cpp:634

References Node::remove().

◆ values()

template<typename T >
void KoRTree< T >::NonLeafNode::values ( QMap< int, T > & result) const
overridevirtual

Implements KoRTree< T >::Node.

Definition at line 938 of file KoRTree.h.

939{
940 for (int i = 0; i < this->m_counter; ++i) {
941 m_childs[i]->values(result);
942 }
943}

Member Data Documentation

◆ m_childs

template<typename T >
QVector<Node *> KoRTree< T >::NonLeafNode::m_childs
protected

Definition at line 274 of file KoRTree.h.


The documentation for this class was generated from the following file: