3 #include <QGraphicsEllipseItem>
4 #include <QGraphicsLineItem>
11 #include <QTextStream>
36 : mDir(numberToDirection(idir))
48 mDir = numberToDirection(mDir + 1);
54 mDir = numberToDirection(mDir + 1);
60 int dy = omitEndpoint ? 2 : 1;
100 return NetLayoutPoint(boxPosition.
x() + (isInput?0:1), boxPosition.
y() * 2);
110 int dy = abs(other.
y()-
y());
111 int dx = abs(other.
x()-
x());
139 int n = points.
size();
140 for (
int i=1; i<n; i++)
141 for (
int j=0; j<i; j++)
142 distanceMap.
insert(points.
at(i).distanceTo(points.
at(j)), qMakePair(i,j));
154 while (retval.
size() < points.
size())
156 auto it = distanceMap.
begin();
162 while(it != distanceMap.
end() &&
167 for (
int ipair=0; ipair<2; ipair++)
169 int i = ipair ? it.
value().second : it.value().first;
176 distanceMap.
erase(it);
184 : mPoint(p), mDir(dir), mIsEndpoint(isEnd)
203 return (mPoint==other.mPoint &&
205 mIsEndpoint==other.mIsEndpoint);
210 static const char* cdir =
"LRUD";
216 if (mDir.
isNull())
return nullptr;
244 int dx = pb.
x() - pa.
x();
245 int dy = pb.
y() - pa.
y();
252 waypoint = addWire(waypoint, vdir,
false);
258 for (
int i=0; i<abs(dx); i++)
259 waypoint = addWire(waypoint, hdir,
true);
262 dy = pb.
y() - waypoint.
y();
266 int ysteps = abs(dy) / 2;
267 for (
int i=0; i<ysteps; i++)
268 waypoint = addWire(waypoint, vdir,
true);
273 dy = pb.
y() - waypoint.
y();
275 addWire(waypoint, vdir,
false);
282 int bestDistance = 0;
285 if (testP.isUndefined())
continue;
287 if (retval.
isUndefined() || distance < bestDistance)
289 bestDistance = distance;
295 qDebug() <<
"undefined closest point" << pnt.
x() << pnt.
y();
297 qDebug() << (
QPoint) testP;
298 qDebug() <<
"-----------";
308 if (atomicNet && !w.isHorizontal() && !w.isEndpoint())
318 mWaypointLinks[pA].append(n);
319 mWaypointLinks[pB].append(n);
320 mWaypointLinks[pB].append(n+1);
321 mWaypointLinks[pC].append(n+1);
336 mWaypointLinks[pnt].append(n);
338 mWaypointLinks[nextP].append(n);
344 : mId(
id), mFirst(0), mSecond(0)
352 if (w.isHorizontal())
353 horizontalMap[p.
y()].
insert(p.
x(),0);
357 evaluate(horizontalMap);
358 evaluate(verticalMap);
363 if (mSecond > other.mSecond)
return true;
364 if (mSecond < other.mSecond)
return false;
365 if (mFirst > other.mFirst)
return true;
366 if (mFirst < other.mFirst)
return false;
367 return (mId < other.mId);
374 while (!
set.isEmpty())
377 auto it =
set.begin();
378 int q = it.key() + 1;
380 auto jt =
set.find(q);
381 while (jt !=
set.end())
397 : connection(nullptr), mSources(sources), mDestinations(destinations)
400 mPoints.
append(mDestinations);
410 int n=mPoints.
size();
412 for (
int i=2; i<n; i++)
417 seedConnection.
add(nextConnection,
false);
426 xout << stub <<
"\n";
443 .
arg(w.isHorizontal()?
'-':
'|');
445 xout <<
"\n===========================\n";
NetLayoutConnectionFactory(const QList< NetLayoutPoint > &sources, const QList< NetLayoutPoint > &destinations)
void dump(const QString &stub) const
NetLayoutConnection * connection
NetLayoutPoint closestPoint(const NetLayoutPoint &pnt) const
void add(const NetLayoutConnection &other, bool atomicNet)
~NetLayoutConnectionMetric()
NetLayoutDirection operator++()
NetLayoutDirection(DirectionType dir=Undefined)
QPoint step(bool omitEndpoint=false) const
DirectionType direction() const
NetLayoutMetric(u32 id, const NetLayoutConnection *con)
bool operator<(const NetLayoutMetric &other) const
static QList< NetLayoutPoint > orderByDistance(const QList< NetLayoutPoint > &points)
NetLayoutPoint nextPoint(const NetLayoutDirection &dir, bool omitEndpoint=false) const
int distanceTo(const NetLayoutPoint &other) const
QGraphicsEllipseItem * graphicsFactory(float r) const
NetLayoutPoint(int x_=INT_MIN, int y_=INT_MIN)
static NetLayoutPoint fromBox(const QPoint &boxPosition, bool isInput)
NetLayoutWire(const NetLayoutPoint &p, const NetLayoutDirection &dir, bool isEnd)
bool isHorizontal() const
NetLayoutPoint endPoint(WirePointType pnt) const
QGraphicsLineItem * graphicsFactory() const
bool operator==(const NetLayoutWire &other) const
uint qHashPoint(const QPoint &p)
uint qHash(const LaneIndex &ri)
QPointF scenePoint(const QPoint &p)
void setPen(const QPen &pen)
void setPen(const QPen &pen)
void append(const T &value)
const T & at(int i) const const
QMap::iterator erase(QMap::iterator pos)
QMap::iterator insert(const Key &key, const T &value)
QList< T > values() const const
typename QMap< Key, T >::iterator insert(const Key &key, const T &value)
bool contains(const T &value) const const
QSet::iterator insert(const T &value)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const