From 487d84a5ef64f0cab76ed04c8b5aa578978b6097 Mon Sep 17 00:00:00 2001 From: Ivan Mahonin Date: Aug 18 2023 07:53:10 +0000 Subject: #assistants: improve ellipse ruler marks --- diff --git a/toonz/sources/include/tools/assistant.h b/toonz/sources/include/tools/assistant.h index ac44d4c..14931aa 100644 --- a/toonz/sources/include/tools/assistant.h +++ b/toonz/sources/include/tools/assistant.h @@ -311,6 +311,7 @@ protected: double getDrawingGridAlpha() const; void drawSegment(const TPointD &p0, const TPointD &p1, double pixelSize, double alpha) const; + void drawMark(const TPointD &p, const TPointD &normal, double pixelSize, double alpha) const; void drawDot(const TPointD &p, double alpha) const; void drawPoint(const TAssistantPoint &point, double pixelSize) const; diff --git a/toonz/sources/tnztools/assistant.cpp b/toonz/sources/tnztools/assistant.cpp index a7d9e88..826ab4e 100644 --- a/toonz/sources/tnztools/assistant.cpp +++ b/toonz/sources/tnztools/assistant.cpp @@ -430,6 +430,14 @@ TAssistant::drawSegment(const TPointD &p0, const TPointD &p1, double pixelSize, //--------------------------------------------------------------------------------------------------- void +TAssistant::drawMark(const TPointD &p, const TPointD &normal, double pixelSize, double alpha) const { + TPointD d = normal*5*pixelSize; + drawSegment(p - d,p + d, pixelSize, alpha); +} + +//--------------------------------------------------------------------------------------------------- + +void TAssistant::drawDot(const TPointD &p, double alpha) const { double colorBlack[4] = { 0.0, 0.0, 0.0, alpha }; double colorWhite[4] = { 1.0, 1.0, 1.0, alpha }; diff --git a/toonz/sources/tnztools/assistants/assistantellipse.cpp b/toonz/sources/tnztools/assistants/assistantellipse.cpp index 236c6a7..db6055e 100644 --- a/toonz/sources/tnztools/assistants/assistantellipse.cpp +++ b/toonz/sources/tnztools/assistants/assistantellipse.cpp @@ -249,11 +249,9 @@ private: void drawRuler(const TAffine &ellipseMatrix, double pixelSize) const { double minStep = 10.0*pixelSize; - double alpha = getDrawingGridAlpha(); + double alpha = getDrawingAlpha(); - const TAffine &em = ellipseMatrix; - double r = sqrt(0.5*(norm2(TPointD(em.a11, em.a21)) + norm2(TPointD(em.a12, em.a22)))); - double actualMinStep = minStep/r; + TAffine em = ellipseMatrix; TAffine ellipseMatrixInv = ellipseMatrix.inv(); TPointD g0 = ellipseMatrixInv*m_grid0.position; TPointD g1 = ellipseMatrixInv*m_grid1.position; @@ -262,22 +260,55 @@ private: double ga0 = atan(g0); double ga1 = atan(g1); + // x and y radiuses + TPointD r( norm2(TPointD(em.a11, em.a21)), norm2(TPointD(em.a12, em.a22)) ); + double avgR = 0.5*(r.x + r.y); + if (avgR <= TConsts::epsilon*TConsts::epsilon) return; + avgR = sqrt(avgR); + double actualMinStep = minStep/avgR; + r.x = sqrt(r.x); + r.y = sqrt(r.y); + + // remove radiuses from ellipse matrix + double rkx = r.x > TConsts::epsilon ? 1.0/r.x : 0.0; + double rky = r.y > TConsts::epsilon ? 1.0/r.y : 0.0; + em.a11 *= rkx; em.a21 *= rkx; + em.a12 *= rky; em.a22 *= rky; + if (getPerspective()) { // draw perspective if (ga0 < 0.0) { if (ga1 > 0.0) ga1 -= M_2PI; } else { if (ga1 < 0.0) ga1 += M_2PI; } double k = 0.0, begin = 0.0, end = 0.0; if (!calcPerspectiveStep(actualMinStep, 0.0, M_2PI, 0.0, fabs(ga0), ga1, k, begin, end)) return; - for(double x = begin; fabs(x) < fabs(end); x *= k) - drawDot(ellipseMatrix * TPointD(cos(x), (ga0 < 0.0 ? -1.0 : 1.0)*sin(x))); + for(double a = begin; fabs(a) < fabs(end); a *= k) { + TPointD p( cos(a), (ga0 < 0.0 ? -1.0 : 1.0)*sin(a) ); + TPointD n( p.x*r.y, p.y*r.x ); // perp to allipse + double nl2 = norm2(n); + if (nl2 > TConsts::epsilon*TConsts::epsilon) { + p.x *= r.x; + p.y *= r.y; + n = n*(1.0/sqrt(nl2)); + drawMark(em*p, em.transformDirection(n), pixelSize, alpha); + } + } } else { // draw linear double da = ga1 - ga0; if (da < 0.0) { da = -da; std::swap(ga0, ga1); } if (ga1 - ga0 > M_PI) { da = M_2PI - da; std::swap(ga0, ga1); } if (da < actualMinStep) return; - for(double a = ga0 - floor(M_PI/da)*da; a < ga0 + M_PI; a += da) - drawDot(ellipseMatrix * TPointD(cos(a), sin(a))); + for(double a = ga0 - floor(M_PI/da)*da; a < ga0 + M_PI; a += da) { + TPointD p( cos(a), sin(a) ); + TPointD n( p.x*r.y, p.y*r.x ); // perp to allipse + double nl2 = norm2(n); + if (nl2 > TConsts::epsilon*TConsts::epsilon) { + p.x *= r.x; + p.y *= r.y; + n = n*(1.0/sqrt(nl2)); + drawMark(em*p, em.transformDirection(n), pixelSize, alpha); + } + } } } diff --git a/toonz/sources/tnztools/assistants/assistantline.cpp b/toonz/sources/tnztools/assistants/assistantline.cpp index 1b464aa..d87134f 100644 --- a/toonz/sources/tnztools/assistants/assistantline.cpp +++ b/toonz/sources/tnztools/assistants/assistantline.cpp @@ -166,7 +166,7 @@ private: if (l2 <= TConsts::epsilon*TConsts::epsilon) return; double dirLen = sqrt(l2); TPointD dirProj = direction*(1.0/l2); - TPointD markOffset = TPointD(-direction.y, direction.x)*(5*pixelSize/dirLen); + TPointD normal = TPointD(-direction.y, direction.x)*(1.0/dirLen); double xg0 = dirProj*(m_grid0.position - a); double xg1 = dirProj*(m_grid1.position - a); @@ -176,18 +176,14 @@ private: double xa0 = dirProj*(m_a.position - a); double k = 0.0, begin = 0.0, end = 0.0; if (!calcPerspectiveStep(minStep/dirLen, 0.0, 1.0, xa0, xg0, xg1, k, begin, end)) return; - for(double x = begin; fabs(x) < fabs(end); x *= k) { - TPointD p = a + direction*(xa0 + x); - drawSegment(p - markOffset, p + markOffset, pixelSize, alpha); - } + for(double x = begin; fabs(x) < fabs(end); x *= k) + drawMark(a + direction*(xa0 + x), normal, pixelSize, alpha); } else { // draw linear double dx = fabs(xg1 - xg0); if (dx*dirLen < minStep) return; - for(double x = xg0 - floor(xg0/dx)*dx; x < 1.0; x += dx) { - TPointD p = a + direction*x; - drawSegment(p - markOffset, p + markOffset, pixelSize, alpha); - } + for(double x = xg0 - floor(xg0/dx)*dx; x < 1.0; x += dx) + drawMark(a + direction*x, normal, pixelSize, alpha); } } @@ -323,7 +319,14 @@ public: success = TGuidelineLineBase::truncateRay(oneBox, bb, aa); else success = TGuidelineLineBase::truncateInfiniteLine(oneBox, aa, bb); - if (!success) return; + + if (!success) { + // line is out of screen, bud grid still can be visible + if (grid && getParallel()) + drawGrid(matrix, matrixInv, pixelSize, restrictA, restrictB, perspective); + return; + } + TPointD a = matrixInv*aa; TPointD b = matrixInv*bb;