From 094de7ed48b715e1aab95c2ab5265f034f59feff Mon Sep 17 00:00:00 2001 From: morro Date: Thu, 6 Dec 2018 19:51:28 +0100 Subject: [PATCH 1/3] rotation snapping for arrow --- src/control/tools/ArrowHandler.cpp | 75 +++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 6 deletions(-) diff --git a/src/control/tools/ArrowHandler.cpp b/src/control/tools/ArrowHandler.cpp index bbed8532..e8213be4 100644 --- a/src/control/tools/ArrowHandler.cpp +++ b/src/control/tools/ArrowHandler.cpp @@ -26,10 +26,11 @@ void ArrowHandler::drawShape(Point& c, bool shiftDown) { stroke->addPoint(c); } - else + else { Point p = stroke->getPoint(0); + //disable this to see such a cool "serrate brush" effect if (count > 4) { // remove previous points @@ -48,10 +49,72 @@ void ArrowHandler::drawShape(Point& c, bool shiftDown) double angle = atan2((c.y - p.y), (c.x - p.x)); // an appropriate delta is Pi/3 radians for an arrow shape double delta = M_PI / 6.0; - - stroke->addPoint(c); - stroke->addPoint(Point(c.x - dist * cos(angle + delta), c.y - dist * sin(angle + delta))); - stroke->addPoint(c); - stroke->addPoint(Point(c.x - dist * cos(angle - delta), c.y - dist * sin(angle - delta))); + + if (shiftDown) + { + stroke->addPoint(c); + stroke->addPoint(Point(c.x - dist * cos(angle + delta), c.y - dist * sin(angle + delta))); + stroke->addPoint(c); + stroke->addPoint(Point(c.x - dist * cos(angle - delta), c.y - dist * sin(angle - delta))); + } + else + { + double epsilon = 0.1; + if (std::abs(angle) < epsilon) //0 + { + angle = 0; + stroke->addPoint(Point(c.x, p.y)); + stroke->addPoint(Point(c.x - dist * cos(angle + delta), p.y - dist * sin(angle + delta))); + stroke->addPoint(Point(c.x, p.y)); + stroke->addPoint(Point(c.x - dist * cos(angle - delta), p.y - dist * sin(angle - delta))); + } + //else if (std::abs(angle - M_PI / 4.0) < epsilon) + //{ + // //stroke->setLastPoint(dist / sqrt(2.0) + firstPoint.x, dist / sqrt(2.0) + firstPoint.y); + //} + //else if (std::abs(angle - 3.0 * M_PI / 4.0) < epsilon) + //{ + // //stroke->setLastPoint(-dist / sqrt(2.0) + firstPoint.x, dist / sqrt(2.0) + firstPoint.y); + //} + //else if (std::abs(angle + M_PI / 4.0) < epsilon) + //{ + // //stroke->setLastPoint(dist / sqrt(2.0) + firstPoint.x, -dist / sqrt(2.0) + firstPoint.y); + //} + //else if (std::abs(angle + 3.0 * M_PI / 4.0) < epsilon) + //{ + // //stroke->setLastPoint(-dist / sqrt(2.0) + firstPoint.x, -dist / sqrt(2.0) + firstPoint.y); + //} + else if (std::abs(std::abs(angle) - M_PI) < epsilon) //180 + { + angle = - M_PI; + stroke->addPoint(Point(c.x, p.y)); + stroke->addPoint(Point(c.x - dist * cos(angle + delta), p.y - dist * sin(angle + delta))); + stroke->addPoint(Point(c.x, p.y)); + stroke->addPoint(Point(c.x - dist * cos(angle - delta), p.y - dist * sin(angle - delta))); + } + else if (std::abs(angle - M_PI / 2.0) < epsilon) //270 + { + angle = M_PI / 2.0; + stroke->addPoint(Point(p.x, c.y)); + stroke->addPoint(Point(p.x - dist * cos(angle + delta), c.y - dist * sin(angle + delta))); + stroke->addPoint(Point(p.x, c.y)); + stroke->addPoint(Point(p.x - dist * cos(angle - delta), c.y - dist * sin(angle - delta))); + } + else if (std::abs(angle + M_PI / 2.0) < epsilon) //90 + { + angle = - M_PI / 2.0; + stroke->addPoint(Point(p.x, c.y)); + stroke->addPoint(Point(p.x - dist * cos(angle + delta), c.y - dist * sin(angle + delta))); + stroke->addPoint(Point(p.x, c.y)); + stroke->addPoint(Point(p.x - dist * cos(angle - delta), c.y - dist * sin(angle - delta))); + } + else //otherwise + { + stroke->addPoint(c); + stroke->addPoint(Point(c.x - dist * cos(angle + delta), c.y - dist * sin(angle + delta))); + stroke->addPoint(c); + stroke->addPoint(Point(c.x - dist * cos(angle - delta), c.y - dist * sin(angle - delta))); + } + } } } From 253941ec6bce04082ead8ec43f1189b25744ed1b Mon Sep 17 00:00:00 2001 From: morro Date: Thu, 6 Dec 2018 20:04:22 +0100 Subject: [PATCH 2/3] updated degrees --- src/control/tools/ArrowHandler.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/control/tools/ArrowHandler.cpp b/src/control/tools/ArrowHandler.cpp index e8213be4..18d1198d 100644 --- a/src/control/tools/ArrowHandler.cpp +++ b/src/control/tools/ArrowHandler.cpp @@ -68,19 +68,19 @@ void ArrowHandler::drawShape(Point& c, bool shiftDown) stroke->addPoint(Point(c.x, p.y)); stroke->addPoint(Point(c.x - dist * cos(angle - delta), p.y - dist * sin(angle - delta))); } - //else if (std::abs(angle - M_PI / 4.0) < epsilon) + //else if (std::abs(angle - M_PI / 4.0) < epsilon) //45 //{ // //stroke->setLastPoint(dist / sqrt(2.0) + firstPoint.x, dist / sqrt(2.0) + firstPoint.y); //} - //else if (std::abs(angle - 3.0 * M_PI / 4.0) < epsilon) + //else if (std::abs(angle - 3.0 * M_PI / 4.0) < epsilon) //135 //{ // //stroke->setLastPoint(-dist / sqrt(2.0) + firstPoint.x, dist / sqrt(2.0) + firstPoint.y); //} - //else if (std::abs(angle + M_PI / 4.0) < epsilon) + //else if (std::abs(angle + M_PI / 4.0) < epsilon) //210 //{ // //stroke->setLastPoint(dist / sqrt(2.0) + firstPoint.x, -dist / sqrt(2.0) + firstPoint.y); //} - //else if (std::abs(angle + 3.0 * M_PI / 4.0) < epsilon) + //else if (std::abs(angle + 3.0 * M_PI / 4.0) < epsilon) //315 //{ // //stroke->setLastPoint(-dist / sqrt(2.0) + firstPoint.x, -dist / sqrt(2.0) + firstPoint.y); //} From 64b96e8e5dc0ea8f55624f2e9ace2aa978f80d75 Mon Sep 17 00:00:00 2001 From: morro Date: Fri, 7 Dec 2018 20:44:23 +0100 Subject: [PATCH 3/3] snap every 45 degrees --- src/control/tools/ArrowHandler.cpp | 81 ++++++++++++++++++------------ 1 file changed, 49 insertions(+), 32 deletions(-) diff --git a/src/control/tools/ArrowHandler.cpp b/src/control/tools/ArrowHandler.cpp index 18d1198d..845f9c3a 100644 --- a/src/control/tools/ArrowHandler.cpp +++ b/src/control/tools/ArrowHandler.cpp @@ -44,7 +44,8 @@ void ArrowHandler::drawShape(Point& c, bool shiftDown) // so we just have to build the head // set up the size of the arrowhead to be 1/8 the length of arrow - double dist = sqrt(pow(c.x - p.x, 2.0) + pow(c.y - p.y, 2.0)) / 8.0; + double dist = sqrt(pow(c.x - p.x, 2.0) + pow(c.y - p.y, 2.0)); + double arrowDist = dist/8; double angle = atan2((c.y - p.y), (c.x - p.x)); // an appropriate delta is Pi/3 radians for an arrow shape @@ -60,60 +61,76 @@ void ArrowHandler::drawShape(Point& c, bool shiftDown) else { double epsilon = 0.1; - if (std::abs(angle) < epsilon) //0 + if (std::abs(angle) < epsilon) { angle = 0; stroke->addPoint(Point(c.x, p.y)); - stroke->addPoint(Point(c.x - dist * cos(angle + delta), p.y - dist * sin(angle + delta))); + stroke->addPoint(Point(c.x - arrowDist * cos(angle + delta), p.y - arrowDist * sin(angle + delta))); stroke->addPoint(Point(c.x, p.y)); - stroke->addPoint(Point(c.x - dist * cos(angle - delta), p.y - dist * sin(angle - delta))); + stroke->addPoint(Point(c.x - arrowDist * cos(angle - delta), p.y - arrowDist * sin(angle - delta))); } - //else if (std::abs(angle - M_PI / 4.0) < epsilon) //45 - //{ - // //stroke->setLastPoint(dist / sqrt(2.0) + firstPoint.x, dist / sqrt(2.0) + firstPoint.y); - //} - //else if (std::abs(angle - 3.0 * M_PI / 4.0) < epsilon) //135 - //{ - // //stroke->setLastPoint(-dist / sqrt(2.0) + firstPoint.x, dist / sqrt(2.0) + firstPoint.y); - //} - //else if (std::abs(angle + M_PI / 4.0) < epsilon) //210 - //{ - // //stroke->setLastPoint(dist / sqrt(2.0) + firstPoint.x, -dist / sqrt(2.0) + firstPoint.y); - //} - //else if (std::abs(angle + 3.0 * M_PI / 4.0) < epsilon) //315 - //{ - // //stroke->setLastPoint(-dist / sqrt(2.0) + firstPoint.x, -dist / sqrt(2.0) + firstPoint.y); - //} - else if (std::abs(std::abs(angle) - M_PI) < epsilon) //180 + else if (std::abs(angle - M_PI / 4.0) < epsilon) + { + angle = M_PI / 4.0; + stroke->addPoint(Point(dist / sqrt(2.0) + p.x, dist / sqrt(2.0) + p.y)); + stroke->addPoint(Point(dist / sqrt(2.0) + p.x - arrowDist * cos(angle + delta), dist / sqrt(2.0) + p.y - arrowDist * sin(angle + delta))); + stroke->addPoint(Point(dist / sqrt(2.0) + p.x, dist / sqrt(2.0) + p.y)); + stroke->addPoint(Point(dist / sqrt(2.0) + p.x - arrowDist * cos(angle - delta), dist / sqrt(2.0) + p.y - arrowDist * sin(angle - delta))); + } + else if (std::abs(angle - 3.0 * M_PI / 4.0) < epsilon) + { + angle = 3.0 * M_PI / 4.0; + stroke->addPoint(Point(-dist / sqrt(2.0) + p.x, dist / sqrt(2.0) + p.y)); + stroke->addPoint(Point(-dist / sqrt(2.0) + p.x - arrowDist * cos(angle + delta), dist / sqrt(2.0) + p.y - arrowDist * sin(angle + delta))); + stroke->addPoint(Point(-dist / sqrt(2.0) + p.x, dist / sqrt(2.0) + p.y)); + stroke->addPoint(Point(-dist / sqrt(2.0) + p.x - arrowDist * cos(angle - delta), dist / sqrt(2.0) + p.y - arrowDist * sin(angle - delta))); + } + else if (std::abs(angle + M_PI / 4.0) < epsilon) + { + angle = M_PI / 4.0; + stroke->addPoint(Point(dist / sqrt(2.0) + p.x, -dist / sqrt(2.0) + p.y)); + stroke->addPoint(Point(dist / sqrt(2.0) + p.x - arrowDist * cos(angle + delta), -dist / sqrt(2.0) + p.y + arrowDist * sin(angle + delta))); + stroke->addPoint(Point(dist / sqrt(2.0) + p.x, -dist / sqrt(2.0) + p.y)); + stroke->addPoint(Point(dist / sqrt(2.0) + p.x - arrowDist * cos(angle - delta), -dist / sqrt(2.0) + p.y + arrowDist * sin(angle - delta))); + } + else if (std::abs(angle + 3.0 * M_PI / 4.0) < epsilon) + { + angle = 3.0 * M_PI / 4.0; + stroke->addPoint(Point(-dist / sqrt(2.0) + p.x, -dist / sqrt(2.0) + p.y)); + stroke->addPoint(Point(-dist / sqrt(2.0) + p.x - arrowDist * cos(angle + delta), -dist / sqrt(2.0) + p.y + arrowDist * sin(angle + delta))); + stroke->addPoint(Point(-dist / sqrt(2.0) + p.x, -dist / sqrt(2.0) + p.y)); + stroke->addPoint(Point(-dist / sqrt(2.0) + p.x - arrowDist * cos(angle - delta), -dist / sqrt(2.0) + p.y + arrowDist * sin(angle - delta))); + } + else if (std::abs(std::abs(angle) - M_PI) < epsilon) { angle = - M_PI; stroke->addPoint(Point(c.x, p.y)); - stroke->addPoint(Point(c.x - dist * cos(angle + delta), p.y - dist * sin(angle + delta))); + stroke->addPoint(Point(c.x - arrowDist * cos(angle + delta), p.y - arrowDist * sin(angle + delta))); stroke->addPoint(Point(c.x, p.y)); - stroke->addPoint(Point(c.x - dist * cos(angle - delta), p.y - dist * sin(angle - delta))); + stroke->addPoint(Point(c.x - arrowDist * cos(angle - delta), p.y - arrowDist * sin(angle - delta))); } - else if (std::abs(angle - M_PI / 2.0) < epsilon) //270 + else if (std::abs(angle - M_PI / 2.0) < epsilon) { angle = M_PI / 2.0; stroke->addPoint(Point(p.x, c.y)); - stroke->addPoint(Point(p.x - dist * cos(angle + delta), c.y - dist * sin(angle + delta))); + stroke->addPoint(Point(p.x - arrowDist * cos(angle + delta), c.y - arrowDist * sin(angle + delta))); stroke->addPoint(Point(p.x, c.y)); - stroke->addPoint(Point(p.x - dist * cos(angle - delta), c.y - dist * sin(angle - delta))); + stroke->addPoint(Point(p.x - arrowDist * cos(angle - delta), c.y - arrowDist * sin(angle - delta))); } - else if (std::abs(angle + M_PI / 2.0) < epsilon) //90 + else if (std::abs(angle + M_PI / 2.0) < epsilon) { angle = - M_PI / 2.0; stroke->addPoint(Point(p.x, c.y)); - stroke->addPoint(Point(p.x - dist * cos(angle + delta), c.y - dist * sin(angle + delta))); + stroke->addPoint(Point(p.x - arrowDist * cos(angle + delta), c.y - arrowDist * sin(angle + delta))); stroke->addPoint(Point(p.x, c.y)); - stroke->addPoint(Point(p.x - dist * cos(angle - delta), c.y - dist * sin(angle - delta))); + stroke->addPoint(Point(p.x - arrowDist * cos(angle - delta), c.y - arrowDist * sin(angle - delta))); } - else //otherwise + else { stroke->addPoint(c); - stroke->addPoint(Point(c.x - dist * cos(angle + delta), c.y - dist * sin(angle + delta))); + stroke->addPoint(Point(c.x - arrowDist * cos(angle + delta), c.y - arrowDist * sin(angle + delta))); stroke->addPoint(c); - stroke->addPoint(Point(c.x - dist * cos(angle - delta), c.y - dist * sin(angle - delta))); + stroke->addPoint(Point(c.x - arrowDist * cos(angle - delta), c.y - arrowDist * sin(angle - delta))); } } }