1#include "MatrixSceneWidget.h"
6#include <QGraphicsRectItem>
7#include <QGraphicsSceneMouseEvent>
16#include "CorrelationMatrix.h"
20#include "GraphicsView.h"
21#include "IException.h"
23#include "MatrixGraphicsScene.h"
24#include "MatrixGraphicsView.h"
25#include "MatrixOptions.h"
26#include "ProgressBar.h"
30#include "SparseBlockMatrix.h"
35#include <boost/numeric/ublas/fwd.hpp>
36#include <boost/numeric/ublas/io.hpp>
37#include <boost/numeric/ublas/matrix_sparse.hpp>
38#include <boost/numeric/ublas/matrix_proxy.hpp>
40using namespace boost::numeric::ublas;
53 bool internalizeToolBarsAndProgress,
93 QGridLayout * sceneLayout =
new QGridLayout;
94 sceneLayout->setContentsMargins(0, 0, 0, 0);
95 setLayout(sceneLayout);
98 if (!status && internalizeToolBarsAndProgress)
99 status =
new QStatusBar;
103 if (internalizeToolBarsAndProgress) {
107 QHBoxLayout *horizontalStatusLayout =
new QHBoxLayout;
108 horizontalStatusLayout->addWidget(
m_progress);
109 horizontalStatusLayout->addStretch();
110 horizontalStatusLayout->addWidget(status);
112 sceneLayout->addLayout(horizontalStatusLayout, 2, 0, 1, 2);
118 setWhatsThis(
"This is the matrix scene. You can interact with the "
119 "matrix elements shown here. ");
121 getView()->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
122 getView()->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
124 getView()->enableResizeZooming(
false);
126 connect(
getView()->horizontalScrollBar(), SIGNAL( valueChanged(
int) ),
128 connect(
getView()->verticalScrollBar() , SIGNAL( valueChanged(
int) ),
130 connect(
getView()->horizontalScrollBar(), SIGNAL( rangeChanged(
int,
int) ),
132 connect(
getView()->verticalScrollBar() , SIGNAL( rangeChanged(
int,
int) ),
138 getView()->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
139 getView()->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
141 setWhatsThis(
"This is the matrix world view. The matrix will be "
142 "shown here, but you cannot zoom in.");
184 bool handled =
false;
257 boundingRect = boundingRect.united(
m_outlineRect->boundingRect() );
325 QPointF topLeft =
getView()->mapToScene(0, 0);
326 QPointF bottomRight =
329 QRectF visibleRect(topLeft, bottomRight);
352 bool stopProcessingEvent =
true;
354 switch( event->type() ) {
355 case QMouseEvent::GraphicsSceneMousePress: {
356 if (
m_graphicsScene->itemAt( ( (QGraphicsSceneMouseEvent *)event )->scenePos(),
359 ( (QGraphicsSceneMouseEvent *)event )->scenePos(),
360 QTransform() )->toolTip() );
362 stopProcessingEvent =
false;
366 case QMouseEvent::GraphicsSceneMouseDoubleClick:
368 ((QGraphicsSceneMouseEvent *)event)->scenePos());
370 stopProcessingEvent =
false;
374 stopProcessingEvent =
false;
378 return stopProcessingEvent;
407 int elementSize = 10;
418 QBrush fillBrush(Qt::blue);
419 QPen outlinePen(Qt::black);
420 outlinePen.setWidth(0);
428 QMapIterator<int, matrix<double>*> block(blockColumn);
429 bool lastBlock =
true;
432 rowIterator = colIterator;
436 rowIterator.previous();
437 for (
int row = 0; row < (int)block.value()->size1(); row++) {
438 for (
int column = 0; column < (int)block.value()->size2(); column++) {
445 double lowerColorValue = fabs( ( *block.value() )(row, column) ) * 255.0;
446 if (fabs( ( *block.value() )(row, column) ) < .5) {
447 red = lowerColorValue * 2;
451 green = 255 - ( (lowerColorValue - 127.5) * 2 );
454 fillColor = QColor(red, green, 0);
463 else if (column == row) {
464 outlinePen.setColor(Qt::black);
465 fillBrush.setColor(Qt::blue);
468 outlinePen.setColor(Qt::black);
470 if ( fabs( ( *block.value() )(row, column) ) >=
479 fillBrush.setColor(fillColor);
484 outlinePen.setColor(Qt::black);
486 if ( fabs( ( *block.value() )(row, column) ) >=
495 fillBrush.setColor(fillColor);
502 elementSize, elementSize,
503 outlinePen, fillBrush);
504 QString img1 =
"Image 1 : " + colIterator.key() +
"\n";
505 QString param1 =
"Parameter 1: " + colIterator.value().at(column) +
"\n";
506 QString img2 =
"Image 2 : " + rowIterator.key() +
"\n";
507 QString param2 =
"Parameter 2: " + rowIterator.value().at(row);
508 QString toolTip =
"Correlation : "
509 + QString::number( ( *block.value() )(row, column) )
510 +
"\n" + img1 + param1 + img2 + param2;
511 rectangle->setToolTip(toolTip);
520 if ( block.hasPrevious() ) {
521 yOffset += block.peekPrevious().value()->size1() * elementSize;
523 y = startY - yOffset;
525 }
while ( block.hasPrevious() );
527 startX += block.value()->size2() * elementSize;
528 startY += block.value()->size1() * elementSize;
547 int elementSize = 10;
550 int segmentLength = 0;
554 while ( it.hasNext() ) {
556 int numOfParams = it.value().count();
557 segmentLength += numOfParams * elementSize;
558 segments.append(segmentLength);
561 segments.removeLast();
566 pen.setColor(Qt::black);
570 QGraphicsLineItem *hLine;
571 hLine =
new QGraphicsLineItem(startHX, startHY,
572 startHX + segmentLength, startHY);
577 QGraphicsLineItem *vLine;
578 vLine =
new QGraphicsLineItem(startVX + segmentLength, startVY,
579 startVX + segmentLength, startVY + segmentLength);
583 int edge = startVX + segmentLength;
584 int currentLength = segmentLength;
585 int currentVX = startVX;
588 foreach (
int segment, segments) {
589 currentVX = startVX + segment;
590 currentLength = segmentLength - segment;
592 vLine =
new QGraphicsLineItem(currentVX, startVY,
593 currentVX, startVY + segment);
595 hLine =
new QGraphicsLineItem(edge - currentLength, startHY + segment,
596 edge, startHY + segment);
This is a container for the correlation matrix that comes from a bundle adjust.
QMap< QString, QStringList > * imagesAndParameters()
Public access for the qmap of images and parameters.
QList< SparseBlockColumnMatrix > * visibleBlocks()
Get the visible part of the matrix.
A graphics scene with improved user-interaction for use with the MatrixSceneWidget.
A graphics view that resizes in a more friendly way.
This class holds the matrix color and focus information.
This is free and unencumbered software released into the public domain.
This is free and unencumbered software released into the public domain.