Krita Source Code Documentation
Loading...
Searching...
No Matches
KisSpatialContainer.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 Agata Cacko <cacko.azh@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#ifndef __KIS_SPATIAL_CONTAINER_H
8#define __KIS_SPATIAL_CONTAINER_H
9
10#include <QPoint>
11#include <QPointF>
12#include <QVector>
13#include <QPolygonF>
14#include <QTransform>
15#include <QDebug>
16#include <cmath>
17#include <kis_global.h>
18#include <kritaimage_export.h>
19#include <boost/optional.hpp>
20#include <optional>
21
22
23class KRITAIMAGE_EXPORT KisSpatialContainer
24{
25 // right now it's just a standard Quadtree, since it seemed like it would work well
26 // for points that are mostly uniformly located
27 // and need a decent amount of changes and need to have fast queries
28
29
30public:
31 struct SpatialNode;
32
33public:
34
35
36 KisSpatialContainer(QRectF startArea, int maxPointsInDict = 100);
37 KisSpatialContainer(QRectF startArea, QVector<QPointF> &points);
39
41
42 void initializeFor(int numPoints, QRectF startArea);
43 void initializeWith(const QVector<QPointF> &points);
44
45 void initializeWithGridPoints(QRectF gridRect, int pixelPrecision);
46
47 void addPoint(int index, QPointF position);
48 void removePoint(int index, QPointF position);
49 void movePoint(int index, QPointF positionBefore, QPointF positionAfter);
50 QVector<QPointF> toVector();
51
52 void findAllInRange(QVector<int> &indexes, QPointF center, qreal range);
53
54 int count();
55 // O(log(n)*m_maxPointsInDict)
56 QPointF getTopLeft();
57 // O(log(n)*m_maxPointsInDict)
58 QRectF exactBounds();
59
60 // erase everything
61 void clear();
62
63
64 void debugWriteOut();
65
66
67private:
68
69 void addPointRec(int index, QPointF position, SpatialNode* node);
70 void removePointRec(int index, QPointF position, SpatialNode* node);
71 void movePointRec(int index, QPointF positionBefore, QPointF positionAfter, SpatialNode* node);
72 SpatialNode *createNodeForPoint(int index, QPointF position);
73
74
75 void findAllInRangeRec(QVector<int> &indexes, QPointF center, qreal range, SpatialNode* node);
76
77
78 void gatherDataRec(QVector<QPointF> &vector, SpatialNode* node);
79
80 void debugWriteOutRec(SpatialNode* node, QString prefix);
81
82 std::optional<qreal> getBoundaryOnAxis(bool positive, bool xAxis, SpatialNode* node);
83 QPointF getBoundaryPoint(bool left, bool top);
84
85 void initializeLevels(SpatialNode* node, int levelsLeft, QRectF area);
86 void initializeWithGridPointsRec(QRectF gridRect, int pixelPrecision, SpatialNode* node, int startRow, int startColumn, int columnCount);
87
88 void clearRec(SpatialNode* node);
89
90 void deepCopyData(SpatialNode* node, const SpatialNode* from);
91
92
93
94private:
95
96 int m_count {0};
97 int m_maxPointsInDict = {100};
98 int m_nextNodeId = {0}; // just for debug
99 SpatialNode* m_root {nullptr};
100
101 friend class KisSpatialContainerTest;
102
103
104};
105
106
107
108
109
110#endif /* __KIS_SPATIAL_CONTAINER_H */