Skip to content

Commit db3499d

Browse files
committed
Update configuration space rendering
1 parent 7023795 commit db3499d

File tree

5 files changed

+81
-71
lines changed

5 files changed

+81
-71
lines changed

demos/rlPlanDemo/ConfigurationSpaceScene.cpp

Lines changed: 63 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
// POSSIBILITY OF SUCH DAMAGE.
2525
//
2626

27-
#include <QGraphicsRectItem>
2827
#include <QGraphicsSceneMouseEvent>
28+
#include <QPainter>
2929

3030
#include "ConfigurationModel.h"
3131
#include "ConfigurationSpaceScene.h"
@@ -43,11 +43,12 @@ ConfigurationSpaceScene::ConfigurationSpaceScene(QObject* parent) :
4343
model(nullptr),
4444
range(),
4545
steps(),
46-
collisions(nullptr),
46+
collisions(true),
4747
configuration(nullptr),
48+
data(),
4849
edges(nullptr),
50+
image(),
4951
path(nullptr),
50-
scene(nullptr),
5152
thread(new ConfigurationSpaceThread(this))
5253
{
5354
this->axis[0] = 0;
@@ -57,13 +58,6 @@ ConfigurationSpaceScene::ConfigurationSpaceScene(QObject* parent) :
5758

5859
this->thread->scene = this;
5960

60-
this->scene = this->addRect(0, 0, 0, 0, QPen(Qt::NoPen), QBrush(Qt::white));
61-
this->scene->setFlag(QGraphicsItem::ItemClipsChildrenToShape, true);
62-
this->scene->setZValue(0);
63-
64-
this->collisions = this->createItemGroup(QList<QGraphicsItem*>());
65-
this->collisions->setZValue(1);
66-
6761
this->configuration = this->addEllipse(-3, -3, 6, 6, QPen(Qt::NoPen), QBrush((QColor(247, 127, 7))));
6862
this->configuration->setFlag(QGraphicsItem::ItemIgnoresTransformations);
6963
this->configuration->setVisible(false);
@@ -79,9 +73,9 @@ ConfigurationSpaceScene::ConfigurationSpaceScene(QObject* parent) :
7973

8074
QObject::connect(
8175
this->thread,
82-
SIGNAL(addCollision(const qreal&, const qreal&, const qreal&, const qreal&, const int&)),
76+
SIGNAL(addCollision(const int&, const int&, const unsigned char&)),
8377
this,
84-
SLOT(addCollision(const qreal&, const qreal&, const qreal&, const qreal&, const int&))
78+
SLOT(addCollision(const int&, const int&, const unsigned char&))
8579
);
8680

8781
QObject::connect(this->thread, SIGNAL(finished()), this, SIGNAL(evalFinished()));
@@ -93,18 +87,16 @@ ConfigurationSpaceScene::~ConfigurationSpaceScene()
9387
}
9488

9589
void
96-
ConfigurationSpaceScene::addCollision(const qreal& x, const qreal& y, const qreal& w, const qreal& h, const int& rgb)
97-
{
98-
QGraphicsRectItem* rect = this->addRect(
99-
x - w * static_cast<qreal>(0.5),
100-
-y - h * static_cast<qreal>(0.5),
101-
w,
102-
h,
103-
QPen(Qt::NoPen),
104-
QBrush(QColor(rgb, rgb, rgb))
90+
ConfigurationSpaceScene::addCollision(const int& x, const int& y, const unsigned char& rgb)
91+
{
92+
this->data[y * this->steps[0] + x] = rgb;
93+
this->invalidate(
94+
this->minimum[0] + x * this->delta[0],
95+
this->minimum[1] + y * this->delta[1],
96+
this->delta[0],
97+
this->delta[1],
98+
QGraphicsScene::BackgroundLayer
10599
);
106-
107-
this->collisions->addToGroup(rect);
108100
}
109101

110102
void
@@ -114,12 +106,30 @@ ConfigurationSpaceScene::clear()
114106
this->resetCollisions();
115107
}
116108

109+
void
110+
ConfigurationSpaceScene::drawBackground(QPainter* painter, const QRectF& rect)
111+
{
112+
painter->fillRect(rect, this->palette().color(QPalette::Window));
113+
114+
if (this->collisions)
115+
{
116+
QRectF target = rect.intersected(this->sceneRect());
117+
QRectF source(
118+
(target.x() - this->minimum[0]) / this->delta[0],
119+
(target.y() - this->minimum[1]) / this->delta[1],
120+
target.width() / this->delta[0],
121+
target.height() / this->delta[1]
122+
);
123+
painter->drawImage(target, image, source, Qt::NoFormatConversion);
124+
}
125+
}
126+
117127
void
118128
ConfigurationSpaceScene::drawConfiguration(const rl::math::Vector& q)
119129
{
120130
this->configuration->setPos(
121131
q(this->axis[0]),
122-
-q(this->axis[1])
132+
q(this->axis[1])
123133
);
124134
}
125135

@@ -128,10 +138,10 @@ ConfigurationSpaceScene::drawConfigurationEdge(const rl::math::Vector& u, const
128138
{
129139
QGraphicsLineItem* line = this->addLine(
130140
u(this->axis[0]),
131-
-u(this->axis[1]),
141+
u(this->axis[1]),
132142
v(this->axis[0]),
133-
-v(this->axis[1]),
134-
free ? QPen(QBrush(QColor(0, 128, 0)), 0) : QPen(QBrush(QColor(128, 0, 0)), 0)
143+
v(this->axis[1]),
144+
QPen(QBrush(QColor(96, 96, 96)), 0)
135145
);
136146

137147
this->edges->addToGroup(line);
@@ -153,11 +163,11 @@ ConfigurationSpaceScene::drawConfigurationPath(const rl::plan::VectorList& path)
153163
}
154164

155165
QPainterPath painterPath;
156-
painterPath.moveTo(path.front()(this->axis[0]), -path.front()(this->axis[1]));
166+
painterPath.moveTo(path.front()(this->axis[0]), path.front()(this->axis[1]));
157167

158168
for (rl::plan::VectorList::const_iterator i = ++path.begin(); i != path.end(); ++i)
159169
{
160-
painterPath.lineTo((*i)(this->axis[0]), -(*i)(this->axis[1]));
170+
painterPath.lineTo((*i)(this->axis[0]), (*i)(this->axis[1]));
161171
}
162172

163173
this->path->setPath(painterPath);
@@ -252,17 +262,25 @@ ConfigurationSpaceScene::init()
252262

253263
this->configuration->setPos(
254264
(*MainWindow::instance()->q)(this->axis[0]),
255-
-(*MainWindow::instance()->q)(this->axis[1])
265+
(*MainWindow::instance()->q)(this->axis[1])
256266
);
257267

258-
this->scene->setRect(
259-
this->minimum[0],
260-
-this->maximum[1],
261-
this->range[0],
262-
this->range[1]
263-
);
268+
this->data.assign(this->steps[0] * this->steps[1], 128);
269+
270+
#if QT_VERSION >= 0x050500
271+
this->image = QImage(this->data.data(), this->steps[0], this->steps[1], this->steps[0], QImage::Format_Grayscale8);
272+
#else
273+
this->image = QImage(this->data.data(), this->steps[0], this->steps[1], this->steps[0], QImage::Format_Indexed8);
274+
QVector<QRgb> colors;
275+
colors.reserve(256);
276+
for (int i = 0; i < 256; ++i)
277+
{
278+
colors.push_back(qRgb(i, i, i));
279+
}
280+
this->image.setColorTable(colors);
281+
#endif
264282

265-
this->setSceneRect(this->scene->boundingRect());
283+
this->setSceneRect(this->minimum[0], this->minimum[1], this->range[0], this->range[1]);
266284
}
267285

268286
void
@@ -288,17 +306,11 @@ ConfigurationSpaceScene::mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent)
288306
{
289307
if (!MainWindow::instance()->thread->isRunning())
290308
{
291-
if (mouseEvent->scenePos().x() > this->minimum[0] &&
292-
mouseEvent->scenePos().x() < this->maximum[0])
293-
{
294-
(*MainWindow::instance()->q)(this->axis[0]) = mouseEvent->scenePos().x();
295-
}
309+
qreal x = qBound(this->minimum[0], mouseEvent->scenePos().x(), this->maximum[0]);
310+
qreal y = qBound(this->minimum[1], mouseEvent->scenePos().y(), this->maximum[1]);
296311

297-
if (-mouseEvent->scenePos().y() > this->minimum[1] &&
298-
-mouseEvent->scenePos().y() < this->maximum[1])
299-
{
300-
(*MainWindow::instance()->q)(this->axis[1]) = -mouseEvent->scenePos().y();
301-
}
312+
(*MainWindow::instance()->q)(this->axis[0]) = x;
313+
(*MainWindow::instance()->q)(this->axis[1]) = y;
302314

303315
MainWindow::instance()->configurationModel->invalidate();
304316
this->drawConfiguration(*MainWindow::instance()->q);
@@ -319,7 +331,8 @@ ConfigurationSpaceScene::reset()
319331
void
320332
ConfigurationSpaceScene::resetCollisions()
321333
{
322-
qDeleteAll(this->collisions->childItems());
334+
std::fill(this->data.begin(), this->data.end(), 128);
335+
this->invalidate(this->sceneRect(), QGraphicsScene::BackgroundLayer);
323336
}
324337

325338
void
@@ -362,7 +375,8 @@ ConfigurationSpaceScene::showMessage(const std::string& message)
362375
void
363376
ConfigurationSpaceScene::toggleCollisions(const bool& doOn)
364377
{
365-
this->collisions->setVisible(doOn);
378+
this->collisions = doOn;
379+
this->invalidate(this->sceneRect(), QGraphicsScene::BackgroundLayer);
366380
}
367381

368382
void

demos/rlPlanDemo/ConfigurationSpaceScene.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#ifndef CONFIGURATIONSPACESCENE_H
2828
#define CONFIGURATIONSPACESCENE_H
2929

30+
#include <QGraphicsEllipseItem>
3031
#include <QGraphicsItemGroup>
3132
#include <QGraphicsPathItem>
3233
#include <QGraphicsScene>
@@ -59,7 +60,7 @@ class ConfigurationSpaceScene : public QGraphicsScene, public rl::plan::Viewer
5960
std::array<int, 2> steps;
6061

6162
public slots:
62-
void addCollision(const qreal& x, const qreal& y, const qreal& w, const qreal& h, const int& rgb);
63+
void addCollision(const int& x, const int& y, const unsigned char& rgb);
6364

6465
void clear();
6566

@@ -118,20 +119,24 @@ public slots:
118119
void togglePathEdges(const bool& doOn);
119120

120121
protected:
122+
void drawBackground(QPainter* painter, const QRectF& rect);
123+
121124
void mouseMoveEvent(QGraphicsSceneMouseEvent* mouseEvent);
122125

123126
void mousePressEvent(QGraphicsSceneMouseEvent* mouseEvent);
124127

125128
private:
126-
QGraphicsItemGroup* collisions;
129+
bool collisions;
127130

128131
QGraphicsEllipseItem* configuration;
129132

133+
std::vector<unsigned char> data;
134+
130135
QGraphicsItemGroup* edges;
131136

132-
QGraphicsPathItem* path;
137+
QImage image;
133138

134-
QGraphicsRectItem* scene;
139+
QGraphicsPathItem* path;
135140

136141
ConfigurationSpaceThread* thread;
137142

demos/rlPlanDemo/ConfigurationSpaceThread.cpp

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -58,24 +58,15 @@ ConfigurationSpaceThread::run()
5858
{
5959
rl::math::Vector q(*MainWindow::instance()->q);
6060

61-
for (int i = 0; i < this->scene->steps[1] + 1 && this->running; ++i)
61+
for (int i = 0; i < this->scene->steps[0] && this->running; ++i)
6262
{
63-
q(this->scene->axis[1]) = this->scene->maximum[1] - i * this->scene->delta[1];
63+
q(this->scene->axis[0]) = this->scene->minimum[0] + i * this->scene->delta[0];
6464

65-
for (int j = 0; j < this->scene->steps[0] + 1 && this->running; ++j)
65+
for (int j = 0; j < this->scene->steps[1] && this->running; ++j)
6666
{
67-
q(this->scene->axis[0]) = this->scene->minimum[0] + j * this->scene->delta[0];
68-
69-
if (model->isColliding(q))
70-
{
71-
emit addCollision(
72-
q(this->scene->axis[0]),
73-
q(this->scene->axis[1]),
74-
this->scene->delta[0],
75-
this->scene->delta[1],
76-
0
77-
);
78-
}
67+
q(this->scene->axis[1]) = this->scene->minimum[1] + j * this->scene->delta[1];
68+
unsigned char rgb = model->isColliding(q) ? 0 : 255;
69+
emit addCollision(i, j, rgb);
7970
}
8071
}
8172
}
@@ -92,7 +83,7 @@ ConfigurationSpaceThread::stop()
9283

9384
while (!this->isFinished())
9485
{
95-
QThread::usleep(0);
86+
QThread::yieldCurrentThread();
9687
}
9788
}
9889
}

demos/rlPlanDemo/ConfigurationSpaceThread.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class ConfigurationSpaceThread : public QThread
5252
bool running;
5353

5454
signals:
55-
void addCollision(const qreal& x, const qreal& y, const qreal& w, const qreal& h, const int& rgb);
55+
void addCollision(const int& x, const int& y, const unsigned char& rgb);
5656
};
5757

5858
#endif // CONFIGURATIONSPACETHREAD_H

demos/rlPlanDemo/MainWindow.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags f) :
227227
this->configurationSpaceView->setAlternatingRowColors(true);
228228
this->configurationSpaceView->setModel(this->configurationSpaceModel);
229229

230-
this->configurationSpaceSceneView->setBackgroundBrush(QBrush(QWidget::palette().color(QWidget::backgroundRole())));
230+
this->configurationSpaceSceneView->scale(1, -1);
231231
this->configurationSpaceSceneView->setScene(this->configurationSpaceScene);
232232

233233
#if QT_VERSION >= 0x050000

0 commit comments

Comments
 (0)