17#include <QPainterPath>
19#include <boost/graph/astar_search.hpp>
35 if (
m.find(k) ==
m.end())
41 std::map<key_type, data_type>
m;
52 typedef boost::read_write_property_map_tag
category;
59 std::map<VertexDescriptor, VertexDescriptor>
m_map;
64 auto found = m.
m_map.find(
v);
65 return found != m.
m_map.end() ? found->second :
v;
75 return std::sqrt(std::pow(
p1.y -
p2.y, 2) + std::pow(
p1.x -
p2.x, 2));
78class AStarHeuristic :
public boost::astar_heuristic<KisMagneticGraph, double>
114 typedef std::pair<VertexDescriptor, VertexDescriptor>
key_type;
134 std::map<key_type, data_type>
m_map;
144 int tilesPerColumn = (int) std::ceil((
double) s.height() / (double)
m_tileSize.height());
147 for (
int i = 0; i < tilesPerColumn; i++) {
160 auto divide = [](QPoint
p, QSize s){
161 return QPoint(
p.x() / s.width(),
p.y() / s.height());
166 for (
int i = firstTile.y(); i <= lastTile.y(); i++) {
167 for (
int j = firstTile.x(); j <= lastTile.x(); j++) {
169 if (currentTile <
m_tiles.size()
182 m_lazyTileFilter(dev)
200 DistanceMap dmap(std::numeric_limits<double>::max());
202 std::map<VertexDescriptor, double> rmap;
203 std::map<VertexDescriptor, boost::default_color_type> cmap;
204 std::map<VertexDescriptor, double> imap;
210 boost::astar_search_no_init(
213 .distance_map(boost::associative_property_map<DistanceMap>(dmap))
214 .predecessor_map(boost::ref(pmap))
215 .weight_map(boost::associative_property_map<WeightMap>(wmap))
216 .vertex_index_map(boost::associative_property_map<std::map<VertexDescriptor, double> >(imap))
217 .rank_map(boost::associative_property_map<std::map<VertexDescriptor, double> >(rmap))
218 .color_map(boost::associative_property_map<std::map<VertexDescriptor, boost::default_color_type> >
220 .distance_combine(std::plus<double>())
221 .distance_compare(std::less<double>())
225 result.push_front(QPointF(
u.x,
u.y));
229 result.push_front(QPoint(start.
x, start.
y));
244 for (QPointF &pt : points) {
248 img.convertTo(QImage::Format_ARGB32);
253 for (
int i = 0; i < points.size(); i++) {
255 path.moveTo(points[i]);
257 path.lineTo(points[i]);
264 gc.setPen(Qt::green);
265 gc.drawEllipse(points[0], 3, 3);
267 gc.drawEllipse(points[points.count() - 1], 2, 2);
273 img.save(
"result.png");
float value(const T *src, size_t ch)
VertexDescriptor get(PredecessorMap const &m, VertexDescriptor v)
void put(PredecessorMap &m, VertexDescriptor key, VertexDescriptor value)
double EuclideanDistance(VertexDescriptor p1, VertexDescriptor p2)
AStarGoalVisitor(VertexDescriptor goal)
void examine_vertex(VertexDescriptor u, KisMagneticGraph const &g)
double operator()(VertexDescriptor v)
AStarHeuristic(VertexDescriptor goal)
virtual QRect bounds() const =0
static void applyTightLoG(KisPaintDeviceSP device, const QRect &rect, qreal radius, qreal coeff, const QBitArray &channelFlags, KoUpdater *progressUpdater)
KisPaintDeviceSP device()
void filter(qreal radius, QRect &rect)
QVector< qreal > m_radiusRecord
KisMagneticLazyTiles(KisPaintDeviceSP dev)
KisMagneticGraph * m_graph
QVector< QPointF > computeEdge(int bounds, QPoint start, QPoint end, qreal radius)
qreal intensity(QPoint pt)
KisMagneticLazyTiles m_lazyTileFilter
KisMagneticWorker(const KisPaintDeviceSP &dev)
void saveTheImage(vQPointF points)
void setDefaultBounds(KisDefaultBoundsBaseSP bounds)
QRect exactBounds() const
QImage convertToQImage(const KoColorProfile *dstProfile, qint32 x, qint32 y, qint32 w, qint32 h, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags()) const
KisDefaultBoundsBaseSP defaultBounds() const
static KisPaintDeviceSP convertToAlphaAsGray(KisPaintDeviceSP src)
T kisGrowRect(const T &rect, U offset)
void accumulateBounds(const Point &pt, Rect *bounds)
std::pair< key_type, data_type > value_type
DistanceMap(double const &dval)
VertexDescriptor key_type
data_type const m_default
std::map< key_type, data_type > m
data_type & operator[](key_type const &k)
quint8 getIntensity(VertexDescriptor pt)
VertexDescriptor key_type
std::map< VertexDescriptor, VertexDescriptor > m_map
boost::read_write_property_map_tag category
PredecessorMap(PredecessorMap const &that)=default
VertexDescriptor value_type
VertexDescriptor & operator[](VertexDescriptor v)
std::pair< key_type, data_type > value_type
std::map< key_type, data_type > m_map
std::pair< VertexDescriptor, VertexDescriptor > key_type
WeightMap(const KisMagneticGraph &g)
data_type & operator[](key_type const &k)