From fe88ad19d6c472412a224e5253b63130af5e9bab Mon Sep 17 00:00:00 2001 From: cilix42 Date: Mon, 17 Dec 2007 14:42:10 +0000 Subject: [PATCH] Use golden ratio as additional constrained ratio during Ctrl+dragging rectangles (fixes bug/RFE #170540) --- src/context-fns.cpp | 23 ++++++++++++++++++++--- src/context-fns.h | 2 ++ src/rect-context.cpp | 19 ++++++++++++++++++- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/context-fns.cpp b/src/context-fns.cpp index 8a131b081..c845fd275 100644 --- a/src/context-fns.cpp +++ b/src/context-fns.cpp @@ -13,6 +13,9 @@ #include "event-context.h" #include "sp-namedview.h" +static const double midpt_1_goldenratio = (1 + goldenratio) / 2; +static const double midpt_goldenratio_2 = (goldenratio + 2) / 2; + /* FIXME: could probably use a template here */ /** @@ -90,11 +93,25 @@ NR::Rect Inkscape::snap_rectangular_box(SPDesktop const *desktop, SPItem *item, /* Vector from the centre of the box to the point we are dragging to */ NR::Point delta = pt - center; - /* Round it so that we have an integer-ratio box */ + /* Round it so that we have an integer-ratio (or golden ratio) box */ if (fabs(delta[NR::X]) > fabs(delta[NR::Y]) && (delta[NR::Y] != 0.0)) { - delta[NR::X] = floor(delta[NR::X] / delta[NR::Y] + 0.5) * delta[NR::Y]; + double ratio = delta[NR::X] / delta[NR::Y]; + double ratioabs = fabs (ratio); + double sign = (ratio < 0 ? -1 : 1); + if (midpt_1_goldenratio < ratioabs && ratioabs < midpt_goldenratio_2) { + delta[NR::X] = sign * goldenratio * delta[NR::Y]; + } else { + delta[NR::X] = floor(ratio + 0.5) * delta[NR::Y]; + } } else if (delta[NR::X] != 0.0) { - delta[NR::Y] = floor(delta[NR::Y] / delta[NR::X] + 0.5) * delta[NR::X]; + double ratio = delta[NR::Y] / delta[NR::X]; + double ratioabs = fabs (ratio); + double sign = (ratio < 0 ? -1 : 1); + if (midpt_1_goldenratio < ratioabs && ratioabs < midpt_goldenratio_2) { + delta[NR::Y] = sign * goldenratio * delta[NR::X]; + } else { + delta[NR::Y] = floor(delta[NR::Y] / delta[NR::X] + 0.5) * delta[NR::X]; + } } /* p[1] is the dragged point with the integer-ratio constraint */ diff --git a/src/context-fns.h b/src/context-fns.h index 522871e75..e295f8529 100644 --- a/src/context-fns.h +++ b/src/context-fns.h @@ -1,6 +1,8 @@ #include struct SPDesktop; +const double goldenratio = 1.61803398874989484820; // golden ratio + namespace Inkscape { diff --git a/src/rect-context.cpp b/src/rect-context.cpp index 3efc81596..5969c1fb2 100644 --- a/src/rect-context.cpp +++ b/src/rect-context.cpp @@ -40,6 +40,8 @@ #include "prefs-utils.h" #include "context-fns.h" +//static const double goldenratio = 1.61803398874989484820; // golden ratio + static void sp_rect_context_class_init(SPRectContextClass *klass); static void sp_rect_context_init(SPRectContext *rect_context); static void sp_rect_context_dispose(GObject *object); @@ -507,14 +509,29 @@ static void sp_rect_drag(SPRectContext &rc, NR::Point const pt, guint state) GString *ys = SP_PX_TO_METRIC_STRING(rdimy, desktop->namedview->getDefaultMetric()); if (state & GDK_CONTROL_MASK) { int ratio_x, ratio_y; + bool is_golden_ratio = false; if (fabs (rdimx) > fabs (rdimy)) { + if (fabs(rdimx / rdimy - goldenratio) < 1e-6) { + is_golden_ratio = true; + } ratio_x = (int) rint (rdimx / rdimy); ratio_y = 1; } else { + if (fabs(rdimy / rdimx - goldenratio) < 1e-6) { + is_golden_ratio = true; + } ratio_x = 1; ratio_y = (int) rint (rdimy / rdimx); } - rc._message_context->setF(Inkscape::IMMEDIATE_MESSAGE, _("Rectangle: %s × %s (constrained to ratio %d:%d); with Shift to draw around the starting point"), xs->str, ys->str, ratio_x, ratio_y); + if (!is_golden_ratio) { + rc._message_context->setF(Inkscape::IMMEDIATE_MESSAGE, _("Rectangle: %s × %s (constrained to ratio %d:%d); with Shift to draw around the starting point"), xs->str, ys->str, ratio_x, ratio_y); + } else { + if (ratio_y == 1) { + rc._message_context->setF(Inkscape::IMMEDIATE_MESSAGE, _("Rectangle: %s × %s (constrained to golden ratio 1.618 : 1); with Shift to draw around the starting point"), xs->str, ys->str); + } else { + rc._message_context->setF(Inkscape::IMMEDIATE_MESSAGE, _("Rectangle: %s × %s (constrained to golden ratio 1 : 1.618); with Shift to draw around the starting point"), xs->str, ys->str); + } + } } else { rc._message_context->setF(Inkscape::IMMEDIATE_MESSAGE, _("Rectangle: %s × %s; with Ctrl to make square or integer-ratio rectangle; with Shift to draw around the starting point"), xs->str, ys->str); } -- 2.30.2