Skip to content
Snippets Groups Projects
coordItem.cpp 40.4 KiB
Newer Older
/*
 * PeTrack - Software for tracking pedestrians movement in videos
 * Copyright (C) 2010-2020 Forschungszentrum Jülich GmbH,
 * Maik Boltes, Juliane Adrian, Ricardo Martin Brualla, Arne Graf, Paul Häger, Daniel Hillebrand,
 * Deniz Kilic, Paul Lieberenz, Daniel Salden, Tobias Schrödter, Ann Katrin Seemann
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

d.kilic's avatar
d.kilic committed
#include <algorithm>
#include <math.h>
#include <QtWidgets>

#include "petrack.h"
#include "control.h"
#include "view.h"
#include "coordItem.h"
#include "extrCalibration.h"

using namespace::cv;

// in x und y gleichermassen skaliertes koordinatensystem,
// da von einer vorherigen intrinsischen kamerakalibrierung ausgegenagen wird,
// so dass pixel quadratisch 
CoordItem::CoordItem(QWidget *wParent,/* QGraphicsScene * scene,*/ QGraphicsItem * parent)
    : QGraphicsItem(parent/*, scene*/)
{
    mMainWindow = (class Petrack*) wParent;
    extCalib = mMainWindow->getExtrCalibration();
    mControlWidget = mMainWindow->getControlWidget();
    //mScene = scene;

    //Set Min and Max
    calibPointsMin.x = 50000;
    calibPointsMax.x = 0;
    calibPointsMin.y = 50000;
    calibPointsMax.y = 0;

    updateData(); // um zB setFlags(ItemIsMovable) je nach anzeige zu aendern
    //setEnabled(false); // all mouse events connot access this item, but it will be seen
    //einzig move koennte interessant sein, um grid zu verschieben?!

    //setAcceptsHoverEvents(true);
}
// bounding box wird durch linke obere ecke und breite/hoehe angegeben
// wenn an den rand gescrollt wurde im view, dann wird durch das dynamische anpassen
// bei trans und scale zwar zuerst alles neu gezeichnet durch update, 
// aber beim verkleinern des scrollbereichs nur der teil von coord neu gezeichnet
QRectF CoordItem::boundingRect() const
{
   /* double sc = mControlWidget->getCalibCoordScale()/10;
    double tX = mControlWidget->getCalibCoordTransX();
    double tY = mControlWidget->getCalibCoordTransY();
    double tZ = mControlWidget->getCalibCoordRotate();
    double cU = mControlWidget->getCalibCoordUnit();

    Point2f p[4];
    p[0] = extCalib->getImagePoint(Point3f(tX+cU,tY,tZ));
    p[1] = extCalib->getImagePoint(Point3f(tX,tY+cU,tZ));
    p[2] = extCalib->getImagePoint(Point3f(tX,tY,tZ+cU));
    p[3] = extCalib->getImagePoint(Point3f(0,0,0));
    double min_x = 1000, min_y = 1000, max_x = -1000, max_y = -1000;

    double x,y;

    for(int i=0;i<4;i++)
    {
        x = p[i].x;
        y = p[i].y;
        max_x = x > max_x ? x : max_x;
        min_x = x < min_x ? x : min_x;
        max_y = y > max_y ? y : max_y;
        min_y = y < min_y ? y : min_y;
    }*/

    // bounding box wird in lokalen koordinaten angegeben!!! (+-10 wegen zahl "1")

    if (mControlWidget->getCalibCoordShow() /*|| mControlWidget->getCalibExtrCalibPointsShow()*/)
    {
        //debout << "Items pos: " << this->pos() << " scenePos(): " << this->scenePos() << endl;

        if( mControlWidget->getCalibCoordDimension() != 0 ) // 2D view
d.kilic's avatar
d.kilic committed
        {
            return QRectF(-110., -110., 220., 220.);
        }
        else // 3D view
        {
            //debout << x.x << " " << y.x << " " << z.x << " " << ursprung.x << " " << calibPointsMin.x << " " << calibPointsMax.x << endl;
            double min_x = min(min(x.x,y.x),min(z.x,ursprung.x));
            double max_x = max(max(x.x,y.x),max(z.x,ursprung.x));

            //debout << x.y << " " << y.y << " " << z.y << " " << ursprung.y << " " << calibPointsMin.y << " " << calibPointsMax.y << endl;
            double min_y = min(min(x.y,y.y),min(z.y,ursprung.y));
            double max_y = max(max(x.y,y.y),max(z.y,ursprung.y));

            if( mControlWidget->getCalibExtrCalibPointsShow() )
            {
                min_x = min(float(min_x),calibPointsMin.x);
                max_x = max(float(max_x),calibPointsMax.x);

                min_y = min(float(min_y),calibPointsMin.y);
                max_y = max(float(max_y),calibPointsMax.y);
            }
            //debout << "Bounding Rect: x: " << min_x << " y: " << min_y << ", width: " << max_x << " height: " << max_y << endl;
            //debout << "Bounding Rect: " << mapToScene(min_x,min_y) << ", " << mapToItem(this,max_x-min_x,max_y-min_y) << endl;
            //return QRectF(mapToItem( this, min_x, min_y),mapToItem( this,max_x-min_x,max_y-min_y));
            //double delta_x = max_x-min_x, delta_y = max_y-min_y;
            //return QRectF(-0.5*delta_x,-0.5*delta_y,delta_x, delta_y);
            return QRectF(min_x-25, min_y-25, max_x-min_x+50, max_y-min_y+50);
//            return QRectF(-mMainWindow->getImageBorderSize(),
//                          -mMainWindow->getImageBorderSize(),
//                          mControlWidget->getMainWindow()->getImage()->width()
//                          + 2*mMainWindow->getImageBorderSize(),
//                          mControlWidget->getMainWindow()->getImage()->height()
//                          + 2*mMainWindow->getImageBorderSize());
            //return QRectF(-img->width(),-img->height(),img->width()*2,img->height()*2);
        }
    }
    else
    {
        return QRectF(0., 0., 0., 0.);
    }

    // sicher ware diese boundingbox, da alles
    //     return QRectF(xMin, yMin, xMax-xMin, yMax-yMin);
    // eigentlich muesste folgende Zeile reichen, aber beim ranzoomen verschwindet dann koord.sys.
    //     return QRectF(mControlWidget->getCalibCoordTransX()/10.-scale, mControlWidget->getCalibCoordTransY()/10.-scale, 2*scale, 2*scale);
}

// event, of moving mouse while button is pressed
void CoordItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{

    // if coordinate system position is not fixed
    if (!mControlWidget->getCalibCoordFix())
    {

        setCursor(Qt::ClosedHandCursor);

        QPointF diff = event->scenePos()-event->lastScenePos(); //screenPos()-buttonDownScreenPos(Qt::RightButton) also interesting
        if (event->buttons() == Qt::RightButton) // event->button() doesnt work
        {
            mControlWidget->setCalibCoordRotate(mControlWidget->getCalibCoordRotate()-(int)(3.*(diff.x()+diff.y()))); //10* nicht noetig, da eh nur relativ
                //cout << diff.x()-diff.y() <<endl; //globalPos()
        }
        else if (event->buttons() == Qt::LeftButton)
        {
            if( mControlWidget->getCalibCoordDimension() == 0 ) // 3D
            {

                //debout << "P_cur: " << event->scenePos().x() << "," << event->scenePos().y() << endl;
                //debout << "P_last: " << event->lastScenePos().x() << "," << event->lastScenePos().y() << endl;

                Point3f p_cur = extCalib->get3DPoint(Point2f(event->scenePos().x(),
                                                             event->scenePos().y()),
                                                     mControlWidget->getCalibCoord3DTransZ());
                Point3f p_last = extCalib->get3DPoint(Point2f(mouse_x/*event->lastScenePos().x()*/,
                                                              mouse_y/*event->lastScenePos().y()*/),
                                                      mControlWidget->getCalibCoord3DTransZ());
                // ToDo:
                // Problem: Die Mouse Bewegungen, die erfasst werden sind zu gering, sodass viele Werte als 0 gewertet werden
                // und nicht als Bewegung bercksichtigt werden, obwohl man die Maus bewegt. D.h. die Maus bewegt sich
                // der Abstand zwischen dem Start und dem End-punkt ist aber sehr gering und wird als 0 gewertet und
                // das Kooridnatensystem bewegt sich nicht. Effekt wird noch verstrkt, da das stndig passiert
                // Besonders schnelle Mausbewegungen lindern den Effekt

                mControlWidget->setCalibCoord3DTransX(coordTrans_x/*mControlWidget->getCalibCoord3DTransX()*/-(mControlWidget->getCalibCoord3DSwapX() ? -1 : 1)*round(p_last.x-p_cur.x));
                mControlWidget->setCalibCoord3DTransY(coordTrans_y/*mControlWidget->getCalibCoord3DTransY()*/-(mControlWidget->getCalibCoord3DSwapY() ? -1 : 1)*round(p_last.y-p_cur.y));

//                mControlWidget->setCalibExtrTrans1(mControlWidget->getCalibExtrTrans1()+round(p_cur.x-p_last.x));
//                mControlWidget->setCalibExtrTrans2(mControlWidget->getCalibExtrTrans2()+round(p_cur.y-p_last.y));

            }else
            {
                mControlWidget->setCalibCoordTransX(mControlWidget->getCalibCoordTransX()+(int)(10.*diff.x()));
                mControlWidget->setCalibCoordTransY(mControlWidget->getCalibCoordTransY()+(int)(10.*diff.y()));
            }
        }
        else if (event->buttons() == Qt::MiddleButton)
d.kilic's avatar
d.kilic committed
        {
            if( mControlWidget->getCalibCoordDimension() == 0 )
            {
                mControlWidget->setCalibCoord3DAxeLen(mControlWidget->getCalibCoord3DAxeLen()+(int)(10.*(diff.x()-diff.y())));
            }else
            {
                mControlWidget->setCalibCoordScale(mControlWidget->getCalibCoordScale()+(int)(10.*(diff.x()-diff.y())));
            }
        }
    }
    else
    {
        QGraphicsItem::mouseMoveEvent(event); // drag mach ich selber
    }
    //mMainWindow->updateSceneRect();

}

void CoordItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    if (!mControlWidget->getCalibCoordFix())
    {
        if (event->button() == Qt::LeftButton)
        {
            mouse_x = event->scenePos().x();
            mouse_y = event->scenePos().y();

            coordTrans_x = mControlWidget->getCalibCoord3DTransX();
            coordTrans_y = mControlWidget->getCalibCoord3DTransY();

           //debout << ">>>>>>>>MousePressEvent: " << mouse_x << ", " << mouse_y << endl;
        }
    }else
    {
        QGraphicsItem::mousePressEvent(event);
    }
}


// event, of moving mouse
//void CoordItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
//{
//    QPointF pos = event->scenePos();
//    pos.setX(pos.x() + mMainWindow->getImageBorderSize());
//    pos.setY(pos.y() + mMainWindow->getImageBorderSize());
//    if (pos.x() >=0 && pos.x() <= mMainWindow->getImage()->width() && pos.y() >=0 && pos.y() <= mMainWindow->getImage()->height())
//        mMainWindow->setMousePosOnImage(pos);

//    if (!mControlWidget->getCalibCoordFix())
//        setCursor(Qt::OpenHandCursor);
//    else
//        setCursor(Qt::CrossCursor);

//    QGraphicsItem::hoverMoveEvent(event);
//}

void CoordItem::updateData()
{
    if (!mControlWidget->getCalibCoordFix())
         setFlag(ItemIsMovable); // noetig, damit mouseEvent leftmousebutton weitergegeben wird, aber drag mach ich selber
    else
       setFlag(ItemIsMovable, false); // noetig, damit mouseEvent leftmousebutton weitergegeben wird, aber drag mach ich selber

    if( mControlWidget->getCalibCoordDimension() == 1 ) // 2D
    {
        double sc = mControlWidget->getCalibCoordScale()/10.;
        double tX = mControlWidget->getCalibCoordTransX()/10.;
        double tY = mControlWidget->getCalibCoordTransY()/10.;
        double ro = mControlWidget->getCalibCoordRotate()/10.;

        // aktualisierung der transformationsmatrix
        QTransform matrix;
d.kilic's avatar
d.kilic committed
        // matrix wird nur bei aenderungen neu bestimmt
        matrix.translate(tX, tY);
        matrix.rotate(ro);
        matrix.scale(sc/100., sc/100.);
        //matrix.shear(tX,tY);
        setTransform(matrix);
d.kilic's avatar
d.kilic committed

    }else // 3D
    {
        ////////////////////////////////////////
        //     3D World-Coordinate-System     //
        ////////////////////////////////////////
        if( mMainWindow->getImage())
        {

        //prepareGeometryChange();
        // Reset Matrix - No Matrix Transformations for 3D Coordsystem
        // aktualisierung der transformationsmatrix
        QTransform matrix;
d.kilic's avatar
d.kilic committed
        // matrix wird nur bei aenderungen neu bestimmt
        matrix.translate(0, 0);
        matrix.rotate(0);
        matrix.scale(1, 1);
        //matrix.shear(tX,tY);
        setTransform(matrix);
d.kilic's avatar
d.kilic committed

//        double tX3D = mControlWidget->getCalibCoord3DTransX();
//        double tY3D = mControlWidget->getCalibCoord3DTransY();
//        double tZ3D = mControlWidget->getCalibCoord3DTransZ();
        double axeLen = mControlWidget->getCalibCoord3DAxeLen();
        int bS = mMainWindow->getImageBorderSize();
//        int swapX = 1;//mControlWidget->getCalibCoord3DSwapX() ? -1 : 1;
//        int swapY = 1;//mControlWidget->getCalibCoord3DSwapY() ? -1 : 1;
//        int swapZ = 1;//mControlWidget->getCalibCoord3DSwapZ() ? -1 : 1;


        //debout << "Before isSetExtrCalib..." << endl;
        // Coordinate-system origin at (tX,tY,tZ)
        if( extCalib->isSetExtrCalib() ){

            //debout << "X: swap: " << swapX << " T1: " << mControlWidget->getCalibExtrTrans1() << " tX3D: " << tX3D << endl;
            //debout << "Y: swap: " << swapY << " T2: " << mControlWidget->getCalibExtrTrans2() << " tY3D: " << tY3D << endl;
            //debout << "Z: swap: " << swapZ << " T3: " << mControlWidget->getCalibExtrTrans3() << " tZ3D: " << tZ3D << endl;

            ursprung = extCalib->getImagePoint(Point3f(0,0,0));

            x3D = Point3f(axeLen,0,0);
            y3D = Point3f(0,axeLen,0);
            z3D = Point3f(0,0,axeLen);

            // Tests if the origin-point of the coordinate-system is outside the image
            if( extCalib->isOutsideImage(ursprung) )
            {
                //debout << "Ursprung: " << ursprung.x << ", " <<ursprung.y << endl;
                return;
            }
            //debout << "Test" << endl;
//            x3D.x += swapX;
//            y3D.y += swapY;
//            z3D.z += swapZ;
            x3D.x++;
            y3D.y++;
            z3D.z++;

            // Kuerzt die Koordinaten-Achsen, falls sie aus dem angezeigten Bild raus laufen wuerden
            do{
                x3D.x--;
                x = extCalib->getImagePoint(x3D);
                //if( ursprungOutside ){ break; }
                //debout << x.x << ", " << x.y << endl;
                // tests if the coord system axis are inside the view or outside, if outside short them till they are inside the image
            }while( x.x < -bS || x.x > mMainWindow->getImage()->width()-bS || x.y < -bS || x.y > mMainWindow->getImage()->height()-bS );
            do{
                y3D.y--;
                y = extCalib->getImagePoint(y3D);
                //if( ursprungOutside ){ break; }
                //debout << y.x << ", " << y.y << endl;
            }while( y.x < -bS || y.x > mMainWindow->getImage()->width()-bS || y.y < -bS || y.y > mMainWindow->getImage()->height()-bS );
            do{
                z3D.z--;
                z = extCalib->getImagePoint(z3D);
                //if( ursprungOutside ){ break; }
                //debout << z.x << ", " << z.y << endl;
            }while( z.x < -bS || z.x > mMainWindow->getImage()->width()-bS || z.y < -bS || z.y > mMainWindow->getImage()->height()-bS );
        }
        }
    //}

        prepareGeometryChange();

    }
    if (!mMainWindow->isLoading()){
        mMainWindow->updateImage();
    }
}

void CoordItem::paint(QPainter *painter, const QStyleOptionGraphicsItem */*option*/, QWidget */*widget*/)
d.kilic's avatar
d.kilic committed
{
    bool debug = false;


    if( debug ) debout << "**************** CoordItem:paint() aufgerufen" << std::endl;
    if( debug ) debout << "show coord: " << mControlWidget->getCalibCoordShow() << std::endl;
d.kilic's avatar
d.kilic committed
    ////////////////////////////////
    // Drawing Calibration Points //
    ////////////////////////////////
    if( mControlWidget->getCalibExtrCalibPointsShow() && mControlWidget->getCalibCoordDimension() == 0 )
    {

        if( extCalib->isSetExtrCalib() )
        {

            QFont font;
            font.setBold(mControlWidget->trackNumberBold->checkState() == Qt::Checked);
            font.setPixelSize(mControlWidget->trackNumberSize->value());

            painter->setFont(font);

            for(size_t i=0; i< extCalib->get2DList().size(); i++)
d.kilic's avatar
d.kilic committed
            {
                painter->setPen(Qt::red);
                painter->setBrush(Qt::NoBrush);
                // Original 2D-Pixel-Points
                Point2f p2 = extCalib->get2DList().at(i);
                painter->drawEllipse(p2.x-8,p2.y-8,16,16);

                // general configuration
                painter->setPen(Qt::blue);
                painter->setBrush(Qt::blue);

                // Projected 3D-Points
                Point3f p3d = extCalib->get3DList().at(i);
                p3d.x -= mControlWidget->getCalibCoord3DTransX();
                p3d.y -= mControlWidget->getCalibCoord3DTransY();
                p3d.z -= mControlWidget->getCalibCoord3DTransZ();

                p3d.x *= (mControlWidget->getCalibCoord3DSwapX() ? -1 : 1);
                p3d.y *= (mControlWidget->getCalibCoord3DSwapY() ? -1 : 1);
                p3d.z *= (mControlWidget->getCalibCoord3DSwapZ() ? -1 : 1);

                Point2f p3 = extCalib->getImagePoint(p3d);

                //QPointF axis = mMainWindow->getImageItem()->getCmPerPixel(p3.x,p3.y,p3d.z);

                painter->drawEllipse(p3.x-4,p3.y-4,8,8);

                // Connecting-line Pixel-3D-Points
                painter->drawLine(QPointF(p2.x,p2.y),QPointF(p3.x,p3.y));

                // Show point number
                painter->setPen(Qt::black);
                painter->setBrush(Qt::black);
                painter->drawText(QPointF(p2.x+10,p2.y+font.pixelSize()), QObject::tr("%1").arg((i+1)));

                //painter->setPen(Qt::blue);
                //painter->setBrush(Qt::blue);

                // min/max of calibration points for bounding box
//                if( i == 0)
//                {
//                    calibPointsMin.x = p2.x;
//                    calibPointsMin.y = p2.y;
//                    calibPointsMax.x = p2.x;
//                    calibPointsMax.y = p2.y;
//                }
                if( p2.x < calibPointsMin.x ) calibPointsMin.x = p2.x;
                if( p2.x > calibPointsMax.x ) calibPointsMax.x = p2.x;
                if( p3.x < calibPointsMin.x ) calibPointsMin.x = p3.x;
                if( p3.x > calibPointsMax.x ) calibPointsMax.x = p3.x;

                if( p2.y < calibPointsMin.y ) calibPointsMin.y = p2.y;
                if( p2.y > calibPointsMax.y ) calibPointsMax.y = p2.y;
                if( p3.y < calibPointsMin.y ) calibPointsMin.y = p3.y;
                if( p3.y > calibPointsMax.y ) calibPointsMax.y = p3.y;

            }
        }
    }

    if (mControlWidget->getCalibCoordShow())
    {
        // general configuration
        painter->setPen(Qt::blue);
        painter->setBrush(QBrush(Qt::blue,Qt::SolidPattern));

        if ( mControlWidget->getCalibCoordDimension() == 1 ) // 2D
        {
            //////////////////////////
            // 2D Coordinate-System //
            //////////////////////////

            painter->setPen(QPen(QBrush(Qt::blue),0));
//            double sc = mControlWidget->getCalibCoordScale();
//            double tX = mControlWidget->getCalibCoordTransX();
//            double tY = mControlWidget->getCalibCoordTransY();
//            double tZ = mControlWidget->getCalibCoordRotate();
//            double cU = mControlWidget->getCalibCoordUnit();

            static QPointF points[3];

            //         //eigentliche BoundingBox: painter->drawRect(QRectF(mControlWidget->getCalibCoordTransX()/10.-scale, mControlWidget->getCalibCoordTransY()/10.-scale, 2*scale, 2*scale));
            //         matrix.translate(mControlWidget->getCalibCoordTransX()/10., mControlWidget->getCalibCoordTransY()/10.);
            //         matrix.rotate((mControlWidget->getCalibCoordRotate())/10.);
            // mit folgender zeile wuerde nur der painter bewegt, nicht aber das koord des items!!!
            //         painter->setWorldMatrix(matrix, true); // true sagt, dass relativ und nicht absolut (also zusaetzlichj zur uebergeordneten matrizen)

            // Koordinatenachsen
            points[0].setX(-10.); points[0].setY(0.);
            points[1].setX(100.);     points[1].setY(0.);
            painter->drawLine(points[0], points[1]);

            //debout << "1. Points[0]: " << points[0].x() << " " << points[0].y() << endl;
            //debout << "1. Points[1]: " << points[1].x() << " " << points[1].y() << endl;

            points[0].setX(0.); points[0].setY(10.);
            points[1].setX(0.); points[1].setY(-100.);
            painter->drawLine(points[0], points[1]);

            //debout << "2. Points[0]: " << points[0].x() << " " << points[0].y() << endl;
            //debout << "2. Points[1]: " << points[1].x() << " " << points[1].y() << endl;

            // Ticks
            for (int i=1; i<11; i++) // i=10 zeichnen sieht ungewoehnlich aus, laeest sich aber besser mit messen
            {
                points[0].setX(2.);  points[0].setY(-i*10.);
                points[1].setX(-2.); points[1].setY(-i*10.);
                painter->drawLine(points[0], points[1]);
                points[0].setX(i*10.); points[0].setY(2.);
                points[1].setX(i*10.); points[1].setY(-2.);
                painter->drawLine(points[0], points[1]);
            }

            // Beschriftung
            points[0].setX(97.); points[0].setY(12.);
            painter->drawText(points[0], QObject::tr("1"));
            points[0].setX(-8.); points[0].setY(-97.);
            painter->drawText(points[0], QObject::tr("1"));

            // Pfeilspitzen
            painter->setPen(Qt::NoPen);
            painter->setBrush(Qt::blue);

            points[0].setX(100.);points[0].setY(0.);
            points[1].setX(95.); points[1].setY(2.);
            points[2].setX(95.); points[2].setY(-2.);
            painter->drawPolygon(points, 3);

            points[0].setX(0.);  points[0].setY(-100.);
            points[1].setX(2.);  points[1].setY(-95.);
            points[2].setX(-2.); points[2].setY(-95.);
            painter->drawPolygon(points, 3);

            /*
            //         // Koordinatenachsen
            //         painter->setPen(Qt::blue);

            //         points[0].setX(-.1*scale); points[0].setY(0.);
            //         points[1].setX(scale);     points[1].setY(0.);
            //         painter->drawLine(points[0], points[1]);

            //         points[0].setX(0.); points[0].setY(.1*scale);
            //         points[1].setX(0.); points[1].setY(-scale);
            //         painter->drawLine(points[0], points[1]);

            //         // Ticks
            //         for (int i=1; i<10; i++)
            //         {
            //             points[0].setX(0.02*scale);  points[0].setY(-i*scale/10.);
            //             points[1].setX(-0.02*scale); points[1].setY(-i*scale/10.);
            //             painter->drawLine(points[0], points[1]);
            //             points[0].setX(i*scale/10.); points[0].setY(0.02*scale);
            //             points[1].setX(i*scale/10.); points[1].setY(-0.02*scale);
            //             painter->drawLine(points[0], points[1]);
            //         }

            //         // Beschriftung
            //         points[0].setX(0.97*scale); points[0].setY(0.12*scale);
            //         painter->drawText(points[0], QObject::tr("1"));
            //         points[0].setX(-0.08*scale); points[0].setY(-0.97*scale);
            //         painter->drawText(points[0], QObject::tr("1"));

            //         // Pfeilspitzen
            //         painter->setPen(Qt::NoPen);
            //         painter->setBrush(Qt::blue);

            //         points[0].setX(scale);      points[0].setY(0.);
            //         points[1].setX(0.95*scale); points[1].setY(0.02*scale);
            //         points[2].setX(0.95*scale); points[2].setY(-0.02*scale);
            //         painter->drawPolygon(points, 3);

            //         points[0].setX(0.);           points[0].setY(-scale);
            //         points[1].setX(0.02*scale);  points[1].setY(-0.95*scale);
            //         points[2].setX(-0.02*scale); points[2].setY(-0.95*scale);
            //         painter->drawPolygon(points, 3);
            */

        }else
        {
            double tX3D = mControlWidget->getCalibCoord3DTransX();
            double tY3D = mControlWidget->getCalibCoord3DTransY();
            double tZ3D = mControlWidget->getCalibCoord3DTransZ();
            double axeLen = mControlWidget->getCalibCoord3DAxeLen();

//            int swapX = mControlWidget->getCalibCoord3DSwapX() ? -1 : 1;
//            int swapY = mControlWidget->getCalibCoord3DSwapY() ? -1 : 1;
//            int swapZ = mControlWidget->getCalibCoord3DSwapZ() ? -1 : 1;

            qreal coordLineWidth = 2.0;


            if( extCalib->isSetExtrCalib() ){

            QPointF points[4];
            Point2f p[4];
            char coordinaten[50];

            /////////////////////////////////////////////////////
            // Draw a cube (Quader) near coord system          //
            /////////////////////////////////////////////////////

            bool drawCube = false;

            if( drawCube ){
                painter->setPen(Qt::green);
                // Boden
                p[0] = extCalib->getImagePoint(Point3f(100,100,0));
                p[1] = extCalib->getImagePoint(Point3f(200,100,0));
                painter->drawLine(QPointF(p[0].x,p[0].y), QPointF(p[1].x, p[1].y));
                p[0] = extCalib->getImagePoint(Point3f(200,100,0));
                p[1] = extCalib->getImagePoint(Point3f(200,200,0));
                painter->drawLine(QPointF(p[0].x,p[0].y), QPointF(p[1].x, p[1].y));
                p[0] = extCalib->getImagePoint(Point3f(200,200,0));
                p[1] = extCalib->getImagePoint(Point3f(100,200,0));
                painter->drawLine(QPointF(p[0].x,p[0].y), QPointF(p[1].x, p[1].y));
                p[0] = extCalib->getImagePoint(Point3f(100,200,0));
                p[1] = extCalib->getImagePoint(Point3f(100,100,0));
                painter->drawLine(QPointF(p[0].x,p[0].y), QPointF(p[1].x, p[1].y));
                // Seiten
                p[0] = extCalib->getImagePoint(Point3f(100,100,0));
                p[1] = extCalib->getImagePoint(Point3f(100,100,100));
                painter->drawLine(QPointF(p[0].x,p[0].y), QPointF(p[1].x, p[1].y));
                p[0] = extCalib->getImagePoint(Point3f(200,100,0));
                p[1] = extCalib->getImagePoint(Point3f(200,100,100));
                painter->drawLine(QPointF(p[0].x,p[0].y), QPointF(p[1].x, p[1].y));
                p[0] = extCalib->getImagePoint(Point3f(100,200,0));
                p[1] = extCalib->getImagePoint(Point3f(100,200,100));
                painter->drawLine(QPointF(p[0].x,p[0].y), QPointF(p[1].x, p[1].y));
                p[0] = extCalib->getImagePoint(Point3f(200,200,0));
                p[1] = extCalib->getImagePoint(Point3f(200,200,100));
                painter->drawLine(QPointF(p[0].x,p[0].y), QPointF(p[1].x, p[1].y));
                // Oben
                p[0] = extCalib->getImagePoint(Point3f(100,100,100));
                p[1] = extCalib->getImagePoint(Point3f(200,100,100));
                painter->drawLine(QPointF(p[0].x,p[0].y), QPointF(p[1].x, p[1].y));
                p[0] = extCalib->getImagePoint(Point3f(200,100,100));
                p[1] = extCalib->getImagePoint(Point3f(200,200,100));
                painter->drawLine(QPointF(p[0].x,p[0].y), QPointF(p[1].x, p[1].y));
                p[0] = extCalib->getImagePoint(Point3f(200,200,100));
                p[1] = extCalib->getImagePoint(Point3f(100,200,100));
                painter->drawLine(QPointF(p[0].x,p[0].y), QPointF(p[1].x, p[1].y));
                p[0] = extCalib->getImagePoint(Point3f(100,200,100));
                p[1] = extCalib->getImagePoint(Point3f(100,100,100));
                painter->drawLine(QPointF(p[0].x,p[0].y), QPointF(p[1].x, p[1].y));


            }

            /////////////////////////////////////////////////////
            // Draw the bounding rect                          //
            /////////////////////////////////////////////////////

            bool drawBoundingRect = false;

            if( drawBoundingRect )
            {
                QRectF boundingBox = boundingRect();
                double min_x = boundingBox.x(), max_x = min_x+boundingBox.width();
                double min_y = boundingBox.y(), max_y = min_y+boundingBox.height();

                painter->setPen(Qt::cyan);
                painter->drawLine(QPointF(min_x, min_y), QPointF(min_x, max_y));
                painter->drawLine(QPointF(min_x, max_y), QPointF(max_x, max_y));
                painter->drawLine(QPointF(max_x, max_y), QPointF(max_x, min_y));
                painter->drawLine(QPointF(max_x, min_y), QPointF(min_x, min_y));
            }

            /////////////////////////////////////////////////////
            // Draw a rect around the whole coordinate system //
            /////////////////////////////////////////////////////

            bool paintRectCoordArea = false;

            if( paintRectCoordArea )
            {
                int min_x = min(min(x.x,y.x),min(z.x,ursprung.x));
                int max_x = max(max(x.x,y.x),max(z.x,ursprung.x));

                int min_y = min(min(x.y,y.y),min(z.y,ursprung.y));
                int max_y = max(max(x.y,y.y),max(z.y,ursprung.y));

                painter->setFont(QFont("Arial", 20));

                painter->setPen(Qt::green);

                painter->drawLine(QPointF(min_x, min_y), QPointF(min_x, max_y));
                painter->drawLine(QPointF(min_x, max_y), QPointF(max_x, max_y));
                painter->drawLine(QPointF(max_x, max_y), QPointF(max_x, min_y));
                painter->drawLine(QPointF(max_x, min_y), QPointF(min_x, min_y));

                sprintf (coordinaten, "(%d, %d)", min_x, min_y);
                painter->drawText(QPoint(min_x-45, min_y-10), QString(coordinaten));

                sprintf (coordinaten, "%d", max_y-min_y);
                painter->drawText(QPoint(min_x+10,min_y+(max_y-min_y)/2.0), QString(coordinaten));

                sprintf (coordinaten, "%d", max_x-min_x);
                painter->drawText(QPoint(min_x+(max_x-min_x)/2.0,min_y+30), QString(coordinaten));
            }


            //////////////////////////////
            // Drawing the X,Y,Z - Axis //
            //////////////////////////////

            painter->setPen(QPen(QBrush(Qt::blue),coordLineWidth));
            p[0] = extCalib->getImagePoint(Point3f(0,0,0));
            p[1] = extCalib->getImagePoint(Point3f(x3D.x,x3D.y,x3D.z));
            painter->drawLine(QPointF(p[0].x,p[0].y),QPointF(p[1].x,p[1].y));
            p[1] = extCalib->getImagePoint(Point3f(y3D.x,y3D.y,y3D.z));
            painter->drawLine(QPointF(p[0].x,p[0].y),QPointF(p[1].x,p[1].y));
            p[1] = extCalib->getImagePoint(Point3f(z3D.x,z3D.y,z3D.z));
            painter->drawLine(QPointF(p[0].x,p[0].y),QPointF(p[1].x,p[1].y));
//            painter->drawLine(QPointF(ursprung.x,ursprung.y),QPointF(x.x,x.y));
//            painter->drawLine(QPointF(ursprung.x,ursprung.y),QPointF(y.x,y.y));
//            painter->drawLine(QPointF(ursprung.x,ursprung.y),QPointF(z.x,z.y));

            /////////////////////////////////
            // Drawing the X,Y,Z - Symbols //
            /////////////////////////////////

            painter->setPen(QPen(QBrush(Qt::black),coordLineWidth));
            painter->setFont(QFont("Arial", 15 ));

            p[0] = extCalib->getImagePoint(Point3f(x3D.x+10, x3D.y, x3D.z));
            painter->drawText(QPointF(p[0].x-5,p[0].y+5), QString("X"));
            p[0] = extCalib->getImagePoint(Point3f(y3D.x, y3D.y+10, y3D.z));
            painter->drawText(QPointF(p[0].x-5,p[0].y+5), QString("Y"));
            p[0] = extCalib->getImagePoint(Point3f(z3D.x, z3D.y, z3D.z+10));
            painter->drawText(QPointF(p[0].x-5,p[0].y+5), QString("Z"));


            if( debug ) debout << "Ursprungskoordinaten: " << ursprung.x << ", " << ursprung.y << std::endl;
            if( debug ) debout << "Bildsize: " << mMainWindow->getImage()->width() << "x" << mMainWindow->getImage()->height() << std::endl;
            if( debug ) sprintf (coordinaten, "(%f  %f %f)", tX3D, tY3D, tZ3D);
d.kilic's avatar
d.kilic committed
            //painter->drawText(QPoint(ursprung.x+25,ursprung.y),QString(coordinaten));

            //////////////////////////////
            // Drawing the tick-markers //
            //////////////////////////////

            int tickLength = AXIS_MARKERS_LENGTH;
            painter->setPen(QPen(QBrush(Qt::blue),coordLineWidth));

            // Start bei 100cm bis Achsen-Laenge-Pfeilspitzenlaenge alle 100cm
            for(int i=100;i<axeLen-tickLength;i+=100)
            {
                // Solange Achsen-Ende noch nicht erreicht: Markierung zeichnen
                if( i+tickLength < x3D.x )
                {
                    p[0] = extCalib->getImagePoint(Point3f(i,-tickLength,0));
                    p[1] = extCalib->getImagePoint(Point3f(i, tickLength,0));
                    painter->drawLine(QPointF(p[0].x,p[0].y),QPointF(p[1].x,p[1].y));
                    p[0] = extCalib->getImagePoint(Point3f(i,0,-tickLength));
                    p[1] = extCalib->getImagePoint(Point3f(i,0, tickLength));
                    painter->drawLine(QPointF(p[0].x,p[0].y),QPointF(p[1].x,p[1].y));
                    p[0] = extCalib->getImagePoint(Point3f(i,0,0));
                }
                if( i+tickLength < y3D.y )
                {
                    p[0] = extCalib->getImagePoint(Point3f(-tickLength,i,0));
                    p[1] = extCalib->getImagePoint(Point3f( tickLength,i,0));
                    painter->drawLine(QPointF(p[0].x,p[0].y),QPointF(p[1].x,p[1].y));
                    p[0] = extCalib->getImagePoint(Point3f(0,i,-tickLength));
                    p[1] = extCalib->getImagePoint(Point3f(0,i, tickLength));
                    painter->drawLine(QPointF(p[0].x,p[0].y),QPointF(p[1].x,p[1].y));
                }
                if( i+tickLength < z3D.z )
                {
                    p[0] = extCalib->getImagePoint(Point3f(-tickLength,0,i));
                    p[1] = extCalib->getImagePoint(Point3f( tickLength,0,i));
                    painter->drawLine(QPointF(p[0].x,p[0].y),QPointF(p[1].x,p[1].y));
                    p[0] = extCalib->getImagePoint(Point3f(0,-tickLength,i));
                    p[1] = extCalib->getImagePoint(Point3f(0, tickLength,i));
                    painter->drawLine(QPointF(p[0].x,p[0].y),QPointF(p[1].x,p[1].y));
                }
            }

            QFont font("Arial", tickLength*0.5 );
            painter->setFont(font);

            painter->setPen(Qt::green);
            painter->setBrush(Qt::green);
            painter->setFont(QFont("Arial", 20));

            if( debug ) sprintf (coordinaten, "(%.2f, %.2f)", ursprung.x,ursprung.y);
            if( debug ) painter->drawText(QPoint(ursprung.x-100,ursprung.y),QString(coordinaten));

            //////////////////////////////////////////////
            // Drawing the peaks at the end of the axis //
            //////////////////////////////////////////////            

            int peakSize = AXIS_MARKERS_LENGTH;

            ///////
            // X //
            ///////

            p[0] = extCalib->getImagePoint(Point3f(x3D.x,0,0));
            p[1] = extCalib->getImagePoint(Point3f(x3D.x-peakSize,-peakSize,0));
            p[2] = extCalib->getImagePoint(Point3f(x3D.x-peakSize, peakSize,0));
            points[0] = QPointF(p[0].x,p[0].y);
            points[1] = QPointF(p[1].x,p[1].y);
            points[2] = QPointF(p[2].x,p[2].y);
            painter->setPen(Qt::green);
//            painter->drawPolygon(points,3,Qt::WindingFill);
            painter->setPen(QPen(QBrush(Qt::blue),coordLineWidth));
            painter->drawLine(points[0],points[1]);
            painter->drawLine(points[0],points[2]);
            painter->drawLine(points[2],points[1]);
            p[0] = extCalib->getImagePoint(Point3f(x3D.x,0,0));
            p[1] = extCalib->getImagePoint(Point3f(x3D.x-peakSize,0,-peakSize));
            p[2] = extCalib->getImagePoint(Point3f(x3D.x-peakSize,0, peakSize));
            p[3] = extCalib->getImagePoint(Point3f(x3D.x+peakSize,0,0));
            points[0] = QPointF(p[0].x,p[0].y);
            points[1] = QPointF(p[1].x,p[1].y);
            points[2] = QPointF(p[2].x,p[2].y);
            painter->setPen(Qt::green);
//            painter->drawPolygon(points,3,Qt::WindingFill);
            painter->setPen(QPen(QBrush(Qt::blue),coordLineWidth));
            painter->drawLine(points[0],points[1]);
            painter->drawLine(points[0],points[2]);
            painter->drawLine(points[2],points[1]);

            if( debug ) sprintf (coordinaten, "(%.2f, %.2f)", p[1].x,p[1].y);
            if( debug ) painter->drawText(QPoint(p[3].x,p[3].y),QString(coordinaten));

            if( debug ) sprintf(coordinaten, "X");
            if( debug ) painter->drawText(QPoint(p[1].x,p[1].y),QString(coordinaten));

            ///////
            // Y //
            ///////

            p[0] = extCalib->getImagePoint(Point3f(0,y3D.y,0));
            p[1] = extCalib->getImagePoint(Point3f(-peakSize,y3D.y-peakSize,0));
            p[2] = extCalib->getImagePoint(Point3f( peakSize,y3D.y-peakSize,0));
            points[0] = QPointF(p[0].x,p[0].y);
            points[1] = QPointF(p[1].x,p[1].y);
            points[2] = QPointF(p[2].x,p[2].y);
            painter->setPen(Qt::green);
//            painter->drawPolygon(points,3,Qt::WindingFill);
            painter->setPen(QPen(QBrush(Qt::blue),coordLineWidth));
            painter->drawLine(points[0],points[1]);
            painter->drawLine(points[0],points[2]);
            painter->drawLine(points[2],points[1]);
            p[0] = extCalib->getImagePoint(Point3f(0,y3D.y,0));
            p[1] = extCalib->getImagePoint(Point3f(0,y3D.y-peakSize,-peakSize));
            p[2] = extCalib->getImagePoint(Point3f(0,y3D.y-peakSize, peakSize));
            p[3] = extCalib->getImagePoint(Point3f(0,y3D.y+peakSize,0));
            points[0] = QPointF(p[0].x,p[0].y);
            points[1] = QPointF(p[1].x,p[1].y);
            points[2] = QPointF(p[2].x,p[2].y);
            painter->setPen(Qt::green);
//            painter->drawPolygon(points,3,Qt::WindingFill);
            painter->setPen(QPen(QBrush(Qt::blue),coordLineWidth));
            painter->drawLine(points[0],points[1]);
            painter->drawLine(points[0],points[2]);
            painter->drawLine(points[2],points[1]);

            if( debug ) sprintf (coordinaten, "(%.2f, %.2f)", p[1].x,p[1].y);
            if( debug ) painter->drawText(QPoint(p[3].x,p[3].y),QString(coordinaten));

            if( debug ) sprintf(coordinaten, "Y");
            if( debug ) painter->drawText(QPoint(p[1].x,p[1].y),QString(coordinaten));

            ///////
            // Z //
            ///////

            p[0] = extCalib->getImagePoint(Point3f(0,0,z3D.z));
            p[1] = extCalib->getImagePoint(Point3f(0,-peakSize,z3D.z-peakSize));
            p[2] = extCalib->getImagePoint(Point3f(0, peakSize,z3D.z-peakSize));
            points[0] = QPointF(p[0].x,p[0].y);
            points[1] = QPointF(p[1].x,p[1].y);
            points[2] = QPointF(p[2].x,p[2].y);
            painter->setPen(Qt::green);
//            painter->drawPolygon(points,3,Qt::WindingFill);
            painter->setPen(QPen(QBrush(Qt::blue),coordLineWidth));
            painter->drawLine(points[0],points[1]);
            painter->drawLine(points[0],points[2]);
            painter->drawLine(points[2],points[1]);
            p[0] = extCalib->getImagePoint(Point3f(0,0,z3D.z));
            p[1] = extCalib->getImagePoint(Point3f(-peakSize,0,z3D.z-peakSize));
            p[2] = extCalib->getImagePoint(Point3f( peakSize,0,z3D.z-peakSize));
            p[3] = extCalib->getImagePoint(Point3f(0,0,z3D.z+peakSize));
            points[0] = QPointF(p[0].x,p[0].y);
            points[1] = QPointF(p[1].x,p[1].y);
            points[2] = QPointF(p[2].x,p[2].y);
            painter->setPen(Qt::green);
//            painter->drawPolygon(points,3,Qt::WindingFill);
            painter->setPen(QPen(QBrush(Qt::blue),coordLineWidth));
            painter->drawLine(points[0],points[1]);
            painter->drawLine(points[0],points[2]);
            painter->drawLine(points[2],points[1]);

            if( debug )  sprintf (coordinaten, "(%.2f, %.2f)", p[1].x,p[1].y);
            if( debug ) painter->drawText(QPoint(p[3].x,p[3].y),QString(coordinaten));

            if( debug ) sprintf(coordinaten, "Z");
            if( debug ) painter->drawText(QPoint(p[1].x,p[1].y),QString(coordinaten));

            }
        }

    }
}