diff --git a/include/gridItem.h b/include/gridItem.h
index 40a81200c19edbf617e46dd17807ce5118f8f8a3..422850d0fcf9cb91d0c432c83ecf3260abe63009 100644
--- a/include/gridItem.h
+++ b/include/gridItem.h
@@ -26,27 +26,41 @@ class CoordinateSystemBox;
 #include "extrCalibration.h"
 
 #include <QGraphicsItem>
+#include <utility>
+
 
 class GridItem : public QGraphicsItem
 {
 private:
     Petrack             *mMainWindow;
-    ExtrCalibration     *mExtCalib;
+    ExtrCalibration     *mExtrCalib;
     CoordinateSystemBox *mCoordSys;
     Control             *mControlWidget;
-    float                mouse_x, mouse_y;
-    int                  gridTrans_x, gridTrans_y;
-    int                  gridDimension;
+    float                mMouseX, mMouseY;
+    int                  mGridTransX, mGridTransY;
+    int                  mGridDimension;
 
 public:
-    inline void setGridDimension(int gDimension) { this->gridDimension = gDimension; }
-    inline int  getGridDimension() const { return this->gridDimension; }
+    inline void setGridDimension(int gDimension) { this->mGridDimension = gDimension; }
+    inline int  getGridDimension() const { return this->mGridDimension; }
     GridItem(QWidget *wParent, QGraphicsItem *parent, CoordinateSystemBox *coordSys);
-    QRectF boundingRect() const;
-    void   mouseMoveEvent(QGraphicsSceneMouseEvent *event);
-    void   mousePressEvent(QGraphicsSceneMouseEvent *event);
-    int    drawLine(QPainter *painter, cv::Point2f *p, int y_offset);
-    void   paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
+    QRectF boundingRect() const override;
+    void   mouseMoveEvent(QGraphicsSceneMouseEvent *event) override;
+    void   mousePressEvent(QGraphicsSceneMouseEvent *event) override;
+    void   drawLine(QPainter *painter, const std::array<cv::Point2f, 2> &p);
+    void   paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
+
+private:
+    void draw2DGrid(QPainter *painter, int imageHeight, int imageWidth, int borderSize);
+    void draw3DGrid(
+        QPainter   *painter,
+        int         imageHeight,
+        int         imageWidth,
+        int         borderSize,
+        bool        vanishPointYIsInsideImage,
+        bool        vanishPointXIsInsideImage,
+        cv::Point2f vanishPointY,
+        cv::Point2f vanishPointX);
 };
 
 #endif
diff --git a/src/gridItem.cpp b/src/gridItem.cpp
index bd2bcfc307023ffefa0bc796fd5a63b731a4af04..5245d7343f8747818199c39866a6d6fc0d753349 100644
--- a/src/gridItem.cpp
+++ b/src/gridItem.cpp
@@ -31,7 +31,7 @@ GridItem::GridItem(QWidget *wParent, QGraphicsItem *parent, CoordinateSystemBox
     QGraphicsItem(parent), mCoordSys(coordSys)
 {
     mMainWindow    = (class Petrack *) wParent;
-    mExtCalib      = mMainWindow->getExtrCalibration();
+    mExtrCalib     = mMainWindow->getExtrCalibration();
     mControlWidget = mMainWindow->getControlWidget();
 }
 
@@ -45,8 +45,6 @@ GridItem::GridItem(QWidget *wParent, QGraphicsItem *parent, CoordinateSystemBox
  */
 QRectF GridItem::boundingRect() const
 {
-    // -mMainWindow->getImageBorderSize(), -mMainWindow->getImageBorderSize() TUTS NICHT !!!!!
-    // aber setMatrix istr hier nicht so schoen
     if(mMainWindow->getImage())
     {
         return QRectF(
@@ -59,8 +57,6 @@ QRectF GridItem::boundingRect() const
     {
         return QRectF(0, 0, 0, 0);
     }
-    // FOLGENDE ZEILE HAT FUER ENDLOSSCHLEIFE GESORGT; DA QT INTERN SICH 2 FKT GEGENSEITIG AUFGERUFEN HABEN!!!!!!!!!!
-    // return QRectF(0, 0, mMainWindow->getScene()->width(), mMainWindow->getScene()->height());
 }
 
 // event, of moving mouse while pressing a mouse button
@@ -70,8 +66,8 @@ void GridItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
     {
         setCursor(Qt::SizeBDiagCursor);
         QPointF diff = event->scenePos() -
-                       event->lastScenePos();   // screenPos()-buttonDownScreenPos(Qt::RightButton) also interesting
-        if(event->buttons() == Qt::RightButton) // event->button() doesnt work
+                       event->lastScenePos(); // screenPos()-buttonDownScreenPos(Qt::RightButton) also interesting
+        if(event->buttons() == Qt::RightButton)
         {
             mControlWidget->setCalibGridRotate(
                 mControlWidget->getCalibGridRotate() + (int) (3. * (diff.x() + diff.y())));
@@ -82,13 +78,12 @@ void GridItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
             {
                 const auto &swap = mCoordSys->getSwap3D();
 
-                cv::Point3f p3d = mExtCalib->get3DPoint(
+                cv::Point3f p3d = mExtrCalib->get3DPoint(
                     cv::Point2f(event->scenePos().x(), event->scenePos().y()), mControlWidget->getCalibGrid3DTransZ());
-                cv::Point3f p3d_last = mExtCalib->get3DPoint(
-                    cv::Point2f(mouse_x /*event->lastScenePos().x()*/, mouse_y /*event->lastScenePos().y()*/),
-                    mControlWidget->getCalibGrid3DTransZ());
-                mControlWidget->setCalibGrid3DTransX(gridTrans_x + (swap.x ? -1 : 1) * round(p3d.x - p3d_last.x));
-                mControlWidget->setCalibGrid3DTransY(gridTrans_y + (swap.y ? -1 : 1) * round(p3d.y - p3d_last.y));
+                cv::Point3f p3d_last =
+                    mExtrCalib->get3DPoint(cv::Point2f(mMouseX, mMouseY), mControlWidget->getCalibGrid3DTransZ());
+                mControlWidget->setCalibGrid3DTransX(mGridTransX + (swap.x ? -1 : 1) * round(p3d.x - p3d_last.x));
+                mControlWidget->setCalibGrid3DTransY(mGridTransY + (swap.y ? -1 : 1) * round(p3d.y - p3d_last.y));
             }
             else
             {
@@ -123,11 +118,11 @@ void GridItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
     {
         if(event->button() == Qt::LeftButton)
         {
-            mouse_x = event->scenePos().x();
-            mouse_y = event->scenePos().y();
+            mMouseX = event->scenePos().x();
+            mMouseY = event->scenePos().y();
 
-            gridTrans_x = mControlWidget->getCalibGrid3DTransX();
-            gridTrans_y = mControlWidget->getCalibGrid3DTransY();
+            mGridTransX = mControlWidget->getCalibGrid3DTransX();
+            mGridTransY = mControlWidget->getCalibGrid3DTransY();
         }
     }
     else
@@ -136,142 +131,190 @@ void GridItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
     }
 }
 
-int GridItem::drawLine(QPainter *painter, cv::Point2f *p, int y_offset)
+void GridItem::drawLine(QPainter *painter, const std::array<cv::Point2f, 2> &p)
 {
-    int     bS  = mMainWindow->getImageBorderSize();
-    QImage *img = mMainWindow->getImage();
-
-    int iW, iH;
+    QLineF line{p[0].x, p[0].y, p[1].x, p[1].y};
+    line.setLength(1'000'000);
+    painter->drawLine(line);
+}
 
-    if(img)
-    {
-        iW = img->width();
-        iH = img->height();
-    }
-    else
+void GridItem::draw2DGrid(QPainter *painter, int imageHeight, int imageWidth, int borderSize)
+{
     {
-        iW = (int) mMainWindow->getScene()->width();
-        iH = (int) mMainWindow->getScene()->height();
-    }
+        double scale = mControlWidget->getCalibGridScale() / 10.;
+        double tX    = mControlWidget->getCalibGridTransX() / 10.;
+        double tY    = mControlWidget->getCalibGridTransY() / 10.;
+        double angle = mControlWidget->getCalibGridRotate() / 10.;
 
+        painter->save(); // save current state (like matrix) on stack
 
-    double x1_d = 0., y1_d = 0., x2_d = 0., y2_d = 0.;
-
-    // Steigung m und Achsenabschnitt b der Geraden berechnen: g(x) = m * x + b
-    double m = (p[1].y - p[0].y) / (p[1].x - p[0].x), // Steigung
-        b    = p[1].y - m * p[1].x;                   // Achsenabschnitt
-
-    // boolean Werte fuer beide Endpunkte der Geraden, am Ende schauen, ob beide gesetzt wurden
-    bool p1IsSet = false, p2IsSet = false;
-
-    // Sonderfall falls Steigung unendlich ist (horizontale Linie)
-    if(isinf(m))
-    {
-        if(p[0].x >= 0 - bS && p[0].x <= iW - bS)
+        QTransform matrixPaint;
+        matrixPaint.translate(tX, tY);
+        matrixPaint.rotate(angle);
+        painter->setWorldTransform(matrixPaint,
+                                   true); // true means relative not absolute transform
+        painter->setPen(Qt::red);
+
+        int maxExp = imageHeight > imageWidth ? imageHeight : imageWidth;
+        for(int i = (int) -((maxExp + 100) / scale); i < 2 * (maxExp / scale); i++)
         {
-            painter->drawLine(QPointF(p[0].x, -bS), QPointF(p[1].x, iH - bS));
-            return 1;
+            painter->drawLine(QPointF(i * scale, -maxExp - 100), QPointF(i * scale, 2 * maxExp));
+            painter->drawLine(QPointF(-maxExp - 100, i * scale), QPointF(2 * maxExp, i * scale));
         }
-    }
 
-    // Schnittpunkt mit oberer Bildkante? ( y = y_offset )
-    if((y_offset - b) / m >= 0 - bS && (y_offset - b) / m <= iW - bS)
-    {
-        x1_d    = (y_offset - b) / m;
-        y1_d    = y_offset;
-        p1IsSet = true;
+        painter->restore(); // restore from stack
+
+        // white polygon, to overcast sticking out parts of grid
+        QPointF points[] = {
+            QPointF(-borderSize, -borderSize),
+            QPointF(imageWidth - borderSize, -borderSize),
+            QPointF(imageWidth - borderSize, imageHeight - borderSize),
+            QPointF(imageWidth + 3 * (maxExp + 200) - borderSize, imageHeight - borderSize),
+            QPointF(imageWidth + 3 * (maxExp + 200) - borderSize, -2 * maxExp - 100 - borderSize),
+            QPointF(-2 * maxExp - 400 - borderSize, -2 * maxExp - 100 - borderSize),
+            QPointF(-2 * maxExp - 400 - borderSize, imageHeight + 3 * (maxExp + 200) - borderSize),
+            QPointF(imageWidth + 3 * (maxExp + 200) - borderSize, imageHeight + 3 * (maxExp + 200) - borderSize),
+            QPointF(imageWidth + 3 * (maxExp + 200) - borderSize, imageHeight - borderSize),
+            QPointF(-borderSize, imageHeight - borderSize)};
+        painter->setPen(Qt::NoPen);
+        painter->setBrush(Qt::white);
+
+        painter->drawPolygon(points, 10);
     }
+}
 
-    // Schnittpunkt mit rechter Bildkante? ( x = iW-bS )
-    if(m * (iW - bS) + b >= y_offset && m * (iW - bS) + b <= iH - bS)
+void GridItem::draw3DGrid(
+    QPainter   *painter,
+    int         imageHeight,
+    int         imageWidth,
+    int         borderSize,
+    bool        vanishPointYIsInsideImage,
+    bool        vanishPointXIsInsideImage,
+    cv::Point2f vanishPointY,
+    cv::Point2f vanishPointX)
+{
     {
-        if(p1IsSet)
+        double minX = INT_MAX, minY = INT_MAX, maxX = INT_MIN, maxY = INT_MIN;
+        int    yOffset = -borderSize;
+
+        if(vanishPointXIsInsideImage)
         {
-            x2_d    = iW - bS;
-            y2_d    = m * (iW - bS) + b;
-            p2IsSet = true;
+            yOffset = vanishPointX.y + 100;
         }
-        else
+        if(vanishPointYIsInsideImage)
         {
-            x1_d    = iW - bS;
-            y1_d    = m * (iW - bS) + b;
-            p1IsSet = true;
+            yOffset = vanishPointY.y + 100;
         }
-    }
 
-    // Schnittpunkt mit unterer Bildkante? ( y = iH-bS )
-    if((iH - bS - b) / m >= 0 - bS && (iH - bS - b) / m <= iW - bS)
-    {
-        if(p1IsSet)
+        int   gridTransX = mControlWidget->getCalibGrid3DTransX();
+        int   gridTransY = mControlWidget->getCalibGrid3DTransY();
+        int   gridTransZ = mControlWidget->getCalibGrid3DTransZ();
+        Vec3F gridTrans(gridTransX, gridTransY, gridTransZ);
+        int   resolution = mControlWidget->getCalibGrid3DResolution();
+
+        cv::Point3f corners[4];
+        // top left corner
+        corners[0] = mExtrCalib->get3DPoint(cv::Point2f(0 - borderSize, yOffset), gridTransZ);
+        // top right corner
+        corners[1] = mExtrCalib->get3DPoint(cv::Point2f(imageWidth, yOffset), gridTransZ);
+        // bottom left corner
+        corners[2] = mExtrCalib->get3DPoint(cv::Point2f(0 - borderSize, imageHeight), gridTransZ);
+        // bottom right corner
+        corners[3] = mExtrCalib->get3DPoint(cv::Point2f(imageWidth, imageHeight), gridTransZ);
+
+        QPolygon poly;
+        poly << QPoint(-borderSize, yOffset) << QPoint(imageWidth - borderSize, yOffset)
+             << QPoint(imageWidth - borderSize, imageHeight - borderSize)
+             << QPoint(-borderSize, imageHeight - borderSize);
+        painter->setClipRegion(QRegion(poly));
+
+        for(int i = 0; i < 4; i++)
+        {
+            double x = corners[i].x;
+            double y = corners[i].y;
+
+            maxX = x > maxX ? x : maxX;
+            minX = x < minX ? x : minX;
+            maxY = y > maxY ? y : maxY;
+            minY = y < minY ? y : minY;
+        }
+
+        painter->setPen(Qt::red);
+
+        const auto &swap       = mCoordSys->getSwap3D();
+        const auto  coordTrans = mCoordSys->getCoordTrans3D();
+        const auto  trans      = gridTrans - coordTrans;
+        int         swapX      = swap.x ? -1 : 1;
+        int         swapY      = swap.y ? -1 : 1;
+        int         gridHeight = gridTransZ - coordTrans.z(); // Since ExtCalibration always uses origin
+                                                              // but grid should be independent of that
+
+        std::array<cv::Point2f, 2> linePoints;
+        // horizontal lines from the left to the right on height tZ3D the lines start from origin point
+        // (tY3D) until max_y or if tY3D < min_y it starts with min_y because otherwise it is outside the
+        // image
+        for(int i = trans.y(); i < (swapY > 0 ? maxY : -minY); i += resolution)
         {
-            x2_d    = (iH - bS - b) / m;
-            y2_d    = iH - bS;
-            p2IsSet = true;
+            // Bildpunkte zu den Endpunkten der Linie holen
+            linePoints[0] = mExtrCalib->getImagePoint(cv::Point3f(minX, swapY * i, gridHeight));
+            linePoints[1] = mExtrCalib->getImagePoint(cv::Point3f(maxX, swapY * i, gridHeight));
+            drawLine(painter, linePoints);
         }
-        else
+        // see above but now the lines start from origin point (tY3D) until min_y
+        // y-
+        for(int i = trans.y() - resolution; i > (swapY > 0 ? minY : -maxY); i -= resolution)
         {
-            x1_d    = (iH - bS - b) / m;
-            y1_d    = iH - bS;
-            p1IsSet = true;
+            // Bildpunkte zu den Endpunkten der Linie holen
+            linePoints[0] = mExtrCalib->getImagePoint(cv::Point3f(minX, swapY * i, gridHeight));
+            linePoints[1] = mExtrCalib->getImagePoint(cv::Point3f(maxX, swapY * i, gridHeight));
+            drawLine(painter, linePoints);
         }
-    }
-
-    // Schnittpunkt mit linker Bildkante? ( x = 0-bS )
-    if(m * (-bS) + b >= y_offset && m * (-bS) + b <= iH - bS)
-    {
-        if(p1IsSet)
+        // vertical lines from the top to the bottom on height tZ3D the lines start from origin point(tX3D)
+        // until max_x of if tX3D < minx it starts with min_x because otherwise the lines are outside the
+        // image x+
+        for(int i = trans.x(); i < (swapX > 0 ? maxX : -minX); i += resolution)
         {
-            x2_d    = -bS;
-            y2_d    = m * (-bS) + b;
-            p2IsSet = true;
+            // Bildpunkte zu den Endpunkten der Linie holen
+            linePoints[0] = mExtrCalib->getImagePoint(cv::Point3f(swapX * i, minY, gridHeight));
+            linePoints[1] = mExtrCalib->getImagePoint(cv::Point3f(swapX * i, maxY, gridHeight));
+            drawLine(painter, linePoints);
         }
-        else
+        // see above but now the lines start from origin point until min_x
+        // x-
+        for(int i = trans.x() - resolution; i > (swapX > 0 ? minX : -maxX); i -= resolution)
         {
-            x1_d    = -bS;
-            y1_d    = m * (-bS) + b;
-            p1IsSet = true;
+            // Bildpunkte zu den Endpunkten der Linie holen
+            linePoints[0] = mExtrCalib->getImagePoint(cv::Point3f(swapX * i, minY, gridHeight));
+            linePoints[1] = mExtrCalib->getImagePoint(cv::Point3f(swapX * i, maxY, gridHeight));
+            drawLine(painter, linePoints);
         }
     }
-
-    // Schauen, ob beide Endpunkte der Geraden gesetzt wurden
-    if(p1IsSet && p2IsSet)
-    {
-        painter->drawLine(QPointF(x1_d, y1_d), QPointF(x2_d, y2_d));
-        return 1;
-    }
-    return 0;
 }
 
 void GridItem::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/)
 {
     if(!mControlWidget->getCalibGridFix() && mControlWidget->getCalibGridShow())
     {
-        setFlag(
-            ItemIsMovable); // noetig, damit mouseEvent leftmousebutton weitergegeben wird, aber drag mach ich selber
+        // such that mouseEvent leftmousebutton is forwarded; drag is done ourself
+        setFlag(ItemIsMovable);
     }
     else
     {
         setFlag(ItemIsMovable, false);
     }
 
-    int tX3D       = mControlWidget->getCalibGrid3DTransX();
-    int tY3D       = mControlWidget->getCalibGrid3DTransY();
-    int tZ3D       = mControlWidget->getCalibGrid3DTransZ();
-    int resolution = mControlWidget->getCalibGrid3DResolution();
-
     // confirmation prompt if the vanish points are inside the image
-    bool        vanishPointIsInsideImage  = false;
     bool        vanishPointYIsInsideImage = false;
     bool        vanishPointXIsInsideImage = false;
     cv::Point2f vanishPointY, vanishPointX;
     double      x, y;
-    if(mMainWindow->getImage() && mExtCalib->isSetExtrCalib())
+    if(mMainWindow->getImage())
     {
         // create 2 parallel lines in x-direction
         cv::Point3f a3d = cv::Point3f(-500, -500, 0), b3d = cv::Point3f(500, -500, 0), c3d = cv::Point3f(-500, 500, 0),
                     d3d = cv::Point3f(500, 500, 0);
-        cv::Point2f a2d = mExtCalib->getImagePoint(a3d), b2d = mExtCalib->getImagePoint(b3d),
-                    c2d = mExtCalib->getImagePoint(c3d), d2d = mExtCalib->getImagePoint(d3d);
+        cv::Point2f a2d = mExtrCalib->getImagePoint(a3d), b2d = mExtrCalib->getImagePoint(b3d),
+                    c2d = mExtrCalib->getImagePoint(c3d), d2d = mExtrCalib->getImagePoint(d3d);
 
         // y = m*x+n
         float m1 = (b2d.y - a2d.y) / (b2d.x - a2d.x), m2 = (d2d.y - c2d.y) / (d2d.x - c2d.x), n1 = a2d.y - m1 * a2d.x,
@@ -285,8 +328,8 @@ void GridItem::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*optio
         // create 2 parallel lines in y-direction
         a3d = cv::Point3f(-500, -500, 0), b3d = cv::Point3f(-500, 500, 0), c3d = cv::Point3f(500, -500, 0),
         d3d = cv::Point3f(500, 500, 0);
-        a2d = mExtCalib->getImagePoint(a3d), b2d = mExtCalib->getImagePoint(b3d), c2d = mExtCalib->getImagePoint(c3d),
-        d2d = mExtCalib->getImagePoint(d3d);
+        a2d = mExtrCalib->getImagePoint(a3d), b2d = mExtrCalib->getImagePoint(b3d),
+        c2d = mExtrCalib->getImagePoint(c3d), d2d = mExtrCalib->getImagePoint(d3d);
 
         // y = m*x+n
         m1 = (b2d.y - a2d.y) / (b2d.x - a2d.x), m2 = (d2d.y - c2d.y) / (d2d.x - c2d.x), n1 = a2d.y - m1 * a2d.x,
@@ -297,8 +340,8 @@ void GridItem::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*optio
         y            = ((m1 * x + n1) + (m2 * x + n2)) / 2.0;
         vanishPointX = cv::Point2f(x, y);
 
-        vanishPointYIsInsideImage = !mExtCalib->isOutsideImage(vanishPointY);
-        vanishPointXIsInsideImage = !mExtCalib->isOutsideImage(vanishPointX);
+        vanishPointYIsInsideImage = !mExtrCalib->isOutsideImage(vanishPointY);
+        vanishPointXIsInsideImage = !mExtrCalib->isOutsideImage(vanishPointX);
 
         ////////////////////////////////
         // Drawing Vanish Points      //
@@ -326,245 +369,33 @@ void GridItem::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*optio
         }
     }
 
-    if(mControlWidget->getCalibGridShow())
+    if(!mControlWidget->getCalibGridShow())
     {
-        QImage    *img = mMainWindow->getImage();
-        QTransform matrixPaint;
-        QPointF    pnt1, pnt2; // floating point
-        int        bS = mMainWindow->getImageBorderSize();
-        int        iW, iH;
-        int        maxExp;
+        return;
+    }
 
-        if(img)
-        {
-            iW = img->width();
-            iH = img->height();
-        }
-        else
-        {
-            iW = (int) mMainWindow->getScene()->width();
-            iH = (int) mMainWindow->getScene()->height();
-        }
-        maxExp = iH > iW ? iH : iW;
+    QImage *img = mMainWindow->getImage();
+    int     bS  = mMainWindow->getImageBorderSize();
+    int     iW, iH;
 
-        if(mControlWidget->getCalibGridDimension() == 1)
-        {
-            double sc = mControlWidget->getCalibGridScale() / 10.;
-            double tX = mControlWidget->getCalibGridTransX() / 10.;
-            double tY = mControlWidget->getCalibGridTransY() / 10.;
-            double ro = mControlWidget->getCalibGridRotate() / 10.;
-
-            // transformation nicht des koordinatensystems wie bei coorditem sondern bei grid der painter
-            // grid
-            painter->save(); // wie opengl matrix aber auch pen etc auf stack
-            matrixPaint.translate(
-                tX, tY); // hier ist translate zusaetzlich auf matrix, bei translate-fkt von item ist absolut
-            matrixPaint.rotate(ro);
-            painter->setWorldTransform(
-                matrixPaint,
-                true); // true sagt, dass relativ und nicht absolut (also zusaetzlich zur uebergeordneten matrizen)
-            painter->setPen(Qt::red);
+    if(img)
+    {
+        iW = img->width();
+        iH = img->height();
+    }
+    else
+    {
+        iW = (int) mMainWindow->getScene()->width();
+        iH = (int) mMainWindow->getScene()->height();
+    }
 
-            for(int i = (int) -((maxExp + 100) / sc); i < 2 * (maxExp / sc); i++)
-            {
-                pnt1.setX(i * sc);
-                pnt1.setY(-maxExp - 100);
-                pnt2.setX(i * sc);
-                pnt2.setY(2 * maxExp);
-                painter->drawLine(pnt1, pnt2);
-                pnt1.setX(-maxExp - 100);
-                pnt1.setY(i * sc);
-                pnt2.setX(2 * maxExp);
-                pnt2.setY(i * sc);
-                painter->drawLine(pnt1, pnt2);
-            }
-            painter->restore(); // matr etc von stack
-
-            // weisses polygon, was ueberragende bereiche von grid ueberdeckt
-            QPointF points[] = {
-                QPointF(-bS, -bS),
-                QPointF(iW - bS, -bS),
-                QPointF(iW - bS, iH - bS),
-                QPointF(iW + 3 * (maxExp + 200) - bS, iH - bS),
-                QPointF(iW + 3 * (maxExp + 200) - bS, -2 * maxExp - 100 - bS),
-                QPointF(-2 * maxExp - 400 - bS, -2 * maxExp - 100 - bS),
-                QPointF(-2 * maxExp - 400 - bS, iH + 3 * (maxExp + 200) - bS),
-                QPointF(iW + 3 * (maxExp + 200) - bS, iH + 3 * (maxExp + 200) - bS),
-                QPointF(iW + 3 * (maxExp + 200) - bS, iH - bS),
-                QPointF(-bS, iH - bS)};
-            painter->setPen(Qt::NoPen);
-            painter->setBrush(Qt::white);
-
-            bool drawPolygon = true;
-
-            if(drawPolygon)
-            {
-                painter->drawPolygon(points, 10);
-            }
-        }
-        else
-        {
-            if(mExtCalib->isSetExtrCalib())
-            {
-                double min_x = INT_MAX, min_y = INT_MAX, max_x = INT_MIN, max_y = INT_MIN;
-                int    y_offset = -bS;
-
-                if(vanishPointXIsInsideImage)
-                {
-                    y_offset = vanishPointX.y + 100;
-                }
-                if(vanishPointYIsInsideImage)
-                {
-                    y_offset = vanishPointY.y + 100;
-                }
-
-                cv::Point3f points[4];
-                // top left corner
-                points[0] = mExtCalib->get3DPoint(cv::Point2f(0 - bS, y_offset), tZ3D);
-                // top right corner
-                points[1] = mExtCalib->get3DPoint(cv::Point2f(iW, y_offset), tZ3D);
-                // bottom left corner
-                points[2] = mExtCalib->get3DPoint(cv::Point2f(0 - bS, iH), tZ3D);
-                // bottom right corner
-                points[3] = mExtCalib->get3DPoint(cv::Point2f(iW, iH), tZ3D);
-
-
-                painter->setPen(Qt::green);
-
-                for(int i = 0; i < 4; i++)
-                {
-                    x = points[i].x;
-                    y = points[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;
-                }
-
-                cv::Point3f ursprung(0, 0, 0);
-
-                cv::Point3f xl, xr, yo, yu;
-                cv::Point2f p[4];
-                QPointF     point[4];
-
-                painter->setPen(Qt::red);
-
-                if constexpr(false && vanishPointIsInsideImage)
-                {
-                    bool simpleMethod = true;
-                    if(simpleMethod)
-                    {
-                        // Draw simple Grid around origin point
-                        for(int i = 0; i <= 2500; i += resolution)
-                        {
-                            p[0] = mExtCalib->getImagePoint(cv::Point3f(tX3D + 2500, tY3D + i, tZ3D));
-                            p[1] = mExtCalib->getImagePoint(cv::Point3f(tX3D, tY3D + i, tZ3D));
-                            painter->drawLine(QPointF(p[0].x, p[0].y), QPointF(p[1].x, p[1].y));
-                            p[0] = mExtCalib->getImagePoint(cv::Point3f(tX3D + i, tY3D + 2500, tZ3D));
-                            p[1] = mExtCalib->getImagePoint(cv::Point3f(tX3D + i, tY3D, tZ3D));
-                            painter->drawLine(QPointF(p[0].x, p[0].y), QPointF(p[1].x, p[1].y));
-                        }
-                    }
-                    else
-                    {
-                        // Draw line by line
-                        for(int i = min_y * 5; i < max_y * 5; i += resolution)
-                        {
-                            for(int j = min_x * 5; j < max_x * 5; j += resolution)
-                            {
-                                p[0] = mExtCalib->getImagePoint(cv::Point3f(tX3D + i, tY3D + j, tZ3D));
-                                p[1] = mExtCalib->getImagePoint(cv::Point3f(tX3D + i + resolution, tY3D + j, tZ3D));
-
-                                point[0] = QPointF(p[0].x, p[0].y);
-                                point[1] = QPointF(p[1].x, p[1].y);
-
-                                p[0] = mExtCalib->getImagePoint(cv::Point3f(tX3D + i, tY3D + j, tZ3D));
-                                p[1] = mExtCalib->getImagePoint(cv::Point3f(tX3D + i, tY3D + j + resolution, tZ3D));
-
-                                point[2] = QPointF(p[0].x, p[0].y);
-                                point[3] = QPointF(p[1].x, p[1].y);
-
-                                if((point[0].x() > -bS && point[0].x() < (iW + bS) && point[0].y() > -bS &&
-                                    point[0].y() < (iH + bS)) ||
-                                   (point[1].x() > -bS && point[1].x() < (iW + bS) && point[1].y() > -bS &&
-                                    point[1].y() < (iH + bS)) ||
-                                   (point[3].x() > -bS && point[3].x() < (iW + bS) && point[2].y() > -bS &&
-                                    point[2].y() < (iH + bS)) ||
-                                   (point[2].x() > -bS && point[2].x() < (iW + bS) && point[3].y() > -bS &&
-                                    point[3].y() < (iH + bS)))
-
-                                {
-                                    float a = sqrt(
-                                              pow(point[1].x() - point[0].x(), 2) +
-                                              pow(point[1].y() - point[0].y(), 2)),
-                                          b = sqrt(
-                                              pow(point[3].x() - point[2].x(), 2) +
-                                              pow(point[3].y() - point[2].y(), 2)),
-                                          c = sqrt(
-                                              pow(point[1].x() - point[3].x(), 2) +
-                                              pow(point[1].y() - point[3].y(), 2)),
-                                          s = (a + b + c) / 2.0;
-                                    if(sqrt(s * (s - a) * (s - b) * (s - c)) > 15)
-                                    {
-                                        painter->drawLine(point[0], point[1]);
-                                        painter->drawLine(point[2], point[3]);
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-                else
-                {
-                    const auto &swap  = mCoordSys->getSwap3D();
-                    const auto  trans = mCoordSys->getCoordTrans3D();
-                    int         swapX = swap.x ? -1 : 1;
-                    int         swapY = swap.y ? -1 : 1;
-                    int grid_height = tZ3D - trans.z(); // Da extCalibration immer vom Koordinatensystemursprung ausgeht
-                                                        // (Das Grid soll aber unabhngig davon gezeichnet werden)
-
-                    // horizontal lines from the left to the right on height tZ3D the lines start from origin point
-                    // (tY3D) until max_y or if tY3D < min_y it starts with min_y because otherwise it is outside the
-                    // image
-
-                    for(int i = -trans.y() + tY3D; i < (swapY > 0 ? max_y : -min_y); i += resolution)
-                    {
-                        // Bildpunkte zu den Endpunkten der Linie holen
-                        p[0] = mExtCalib->getImagePoint(cv::Point3f(min_x, swapY * i, grid_height));
-                        p[1] = mExtCalib->getImagePoint(cv::Point3f(max_x, swapY * i, grid_height));
-                        drawLine(painter, p, y_offset);
-                    }
-                    // see above but now the lines start from origin point (tY3D) until min_y
-                    // y-
-                    for(int i = -trans.y() + tY3D - resolution; i > (swapY > 0 ? min_y : -max_y); i -= resolution)
-                    {
-                        // Bildpunkte zu den Endpunkten der Linie holen
-                        p[0] = mExtCalib->getImagePoint(cv::Point3f(min_x, swapY * i, grid_height));
-                        p[1] = mExtCalib->getImagePoint(cv::Point3f(max_x, swapY * i, grid_height));
-                        drawLine(painter, p, y_offset);
-                    }
-                    // vertical lines from the top to the bottom on height tZ3D the lines start from origin point(tX3D)
-                    // until max_x of if tX3D < minx it starts with min_x because otherwise the lines are outside the
-                    // image x+
-                    for(int i = -trans.x() + tX3D; i < (swapX > 0 ? max_x : -min_x); i += resolution)
-                    {
-                        // Bildpunkte zu den Endpunkten der Linie holen
-                        p[0] = mExtCalib->getImagePoint(cv::Point3f(swapX * i, min_y, grid_height));
-                        p[1] = mExtCalib->getImagePoint(cv::Point3f(swapX * i, max_y, grid_height));
-                        drawLine(painter, p, y_offset);
-                    }
-                    // see above but now the lines start from origin point until min_x
-                    // x-
-                    for(int i = -trans.x() + tX3D - resolution; i > (swapX > 0 ? min_x : -max_x); i -= resolution)
-                    {
-                        // Bildpunkte zu den Endpunkten der Linie holen
-                        p[0] = mExtCalib->getImagePoint(cv::Point3f(swapX * i, min_y, grid_height));
-                        p[1] = mExtCalib->getImagePoint(cv::Point3f(swapX * i, max_y, grid_height));
-                        drawLine(painter, p, y_offset);
-                    }
-                }
-            }
-        }
+    if(mControlWidget->getCalibGridDimension() == 1)
+    {
+        draw2DGrid(painter, iH, iW, bS);
+    }
+    else
+    {
+        draw3DGrid(
+            painter, iH, iW, bS, vanishPointYIsInsideImage, vanishPointXIsInsideImage, vanishPointY, vanishPointX);
     }
 }