From 0bd89e9489fa52f92545a7e94c4a31e863a5f898 Mon Sep 17 00:00:00 2001 From: Shamus Hammons Date: Tue, 15 Mar 2016 11:01:25 -0500 Subject: [PATCH] Minor fixes to polygon adding, added Tau constants to math package. --- src/editwindow.cpp | 63 ++++++++++++++++++++++++++++++++++++++++----- src/mathconstants.h | 22 ++++++++++------ src/painter.cpp | 22 +++++++++++++++- src/vector.cpp | 14 ++++------ 4 files changed, 97 insertions(+), 24 deletions(-) diff --git a/src/editwindow.cpp b/src/editwindow.cpp index e4f7d7b..d24c447 100644 --- a/src/editwindow.cpp +++ b/src/editwindow.cpp @@ -186,6 +186,23 @@ void EditWindow::paintEvent(QPaintEvent * /*event*/) } } + // Draw highlighted point on poly add tool + if (tool == TOOLAddPoly) + { + painter.SetPen(QPen(Qt::red, 1.0, Qt::SolidLine)); + + if (addPointOnCurve) + { + painter.DrawSquareDotN(addPoint, 7); + painter.DrawSquareDotN(addPoint, 9); + } + else + { + painter.DrawRoundDotN(addPoint, 7); + painter.DrawRoundDotN(addPoint, 9); + } + } + // Draw curve formed by points painter.SetPen(QPen(Qt::black, 1.0, Qt::SolidLine)); @@ -393,6 +410,8 @@ void EditWindow::mousePressEvent(QMouseEvent * event) update(); } +// Moved to mouse up routine, so we can slide the point around +#if 0 else if (tool == TOOLAddPoly) // "Add Poly" tool { #ifdef DEBUGFOO @@ -415,6 +434,7 @@ WriteLogMsg("Adding point... # polys: %u, # points: %u", pts.GetNumPolys(), pts. WriteLogMsg(" --> [# polys: %u, # points: %u]\n", pts.GetNumPolys(), pts.GetNumPoints()); #endif } +#endif else if (tool == TOOLSelect || tool == TOOLPolySelect) { if (pts.GetNumPoints() > 0) @@ -516,7 +536,7 @@ void EditWindow::mouseMoveEvent(QMouseEvent * event) if (tool == TOOLAddPt || tool == TOOLAddPoly || tool == TOOLSelect) { // Bail out if we have the select tool and no points yet... - if (tool == TOOLSelect && pts.GetNumPoints() == 0) + if ((tool == TOOLSelect) && (pts.GetNumPoints() == 0)) return; // QPoint pt2 = GetAdjustedMousePosition(event); @@ -525,8 +545,10 @@ void EditWindow::mouseMoveEvent(QMouseEvent * event) if (tool != TOOLSelect) { addPoint = pt2; + ptHighlight = -1; // Prolly should move this to the key handlers below... - addPointOnCurve = ((event->modifiers() == Qt::ShiftModifier) || (event->modifiers() == Qt::ControlModifier) ? false : true); +//now we do! :-D +// addPointOnCurve = ((event->modifiers() == Qt::ShiftModifier) || (event->modifiers() == Qt::ControlModifier) ? false : true); } else pts.SetXY(ptHighlight, pt2.x, pt2.y); @@ -699,6 +721,7 @@ void EditWindow::mouseMoveEvent(QMouseEvent * event) ptPrevious = Vector(event->x(), event->y()); addPoint = Painter::QtToCartesianCoords(Vector(event->x(), event->y())); +//handled by real key handlers now... // addPointOnCurve = ((event->modifiers() == Qt::ShiftModifier) || (event->modifiers() == Qt::ControlModifier) ? false : true); if (tool == TOOLAddPoly) @@ -767,6 +790,28 @@ void EditWindow::mouseReleaseEvent(QMouseEvent * event) selectionInProgress = false; update(); } + else if (tool == TOOLAddPoly) // "Add Poly" tool + { +#ifdef DEBUGFOO +WriteLogMsg("Adding point... # polys: %u, # points: %u", pts.GetNumPolys(), pts.GetNumPoints()); +#endif + if (polyFirstPoint) + { + polyFirstPoint = false; + pts.AddNewPolyAtEnd(); + } + +// QPoint pt = GetAdjustedMousePosition(event); + Vector pt = Painter::QtToCartesianCoords(Vector(event->x(), event->y())); +//printf("GetAdjustedMousePosition = %i, %i\n", pt.x(), pt.y()); + // Append a point to the end of the structure + pts += IPoint(pt.x, pt.y, addPointOnCurve); +// ptHighlight = pts.GetNumPoints() - 1; + update(); +#ifdef DEBUGFOO +WriteLogMsg(" --> [# polys: %u, # points: %u]\n", pts.GetNumPolys(), pts.GetNumPoints()); +#endif + } } event->accept(); @@ -775,6 +820,15 @@ void EditWindow::mouseReleaseEvent(QMouseEvent * event) void EditWindow::keyPressEvent(QKeyEvent * event) { + // We do this here because of the ptHighlight nonsense. If we're in + // the add poly tool, we'll never see this if it's under the 'sanity' + // check (which is needed for the arrow key shite, but still...) + if ((event->key() == Qt::Key_Shift) || (event->key() == Qt::Key_Control)) + { + addPointOnCurve = false; + update(); + } + // Sanity checking... if (ptHighlight == -1) return; @@ -789,13 +843,10 @@ void EditWindow::keyPressEvent(QKeyEvent * event) pts.SetXY(ptHighlight, pts.GetX(ptHighlight) + 1, pts.GetY(ptHighlight)); else if (event->key() == Qt::Key_Left) pts.SetXY(ptHighlight, pts.GetX(ptHighlight) - 1, pts.GetY(ptHighlight)); - else if ((event->key() == Qt::Key_Shift) || (event->key() == Qt::Key_Control)) - { - addPointOnCurve = false; - } else return; +//Not need but you need to call the base class for some reason?? // event->accept(); update(); ((TTEdit *)qApp)->charWnd->MakePathFromPoints(&pts); diff --git a/src/mathconstants.h b/src/mathconstants.h index 42f4940..b0e516e 100644 --- a/src/mathconstants.h +++ b/src/mathconstants.h @@ -1,7 +1,7 @@ // Mathematical Constants used by Architektonas // // Part of the Architektonas Project -// (C) 2011 Underground Software +// (C) 2016 Underground Software // See the README and GPLv3 files for licensing and warranty information // // NOTE: Since this has no code associated with it, there is no corresponding @@ -10,14 +10,20 @@ // JLH = James Hammons // // WHO WHEN WHAT -// --- ---------- ------------------------------------------------------------ +// --- ---------- ----------------------------------------------------------- // JLH 04/01/2011 Created this file +// JLH 03/15/2016 Added Tau constants, removed Pi constants // -#define PI 3.14159265358979323846264338327 -#define PI_OVER_2 (PI / 2.0) -#define PI3_OVER_2 ((3.0 * PI) / 2.0) -#define PI_TIMES_2 (PI * 2.0) -#define RADIANS_TO_DEGREES (180.0 / PI) -#define DEGREES_TO_RADIANS (PI / 180.0) +#define TAU 6.28318530717958647692528676655 +#define TAU_1QTR (TAU * 0.25) +#define TAU_2QTR (TAU * 0.50) +#define TAU_3QTR (TAU * 0.75) +#define RADIANS_TO_DEGREES (360.0 / TAU) +#define DEGREES_TO_RADIANS (TAU / 360.0) + +// Convenience definitions +#define HALF_TAU (TAU_2QTR) +#define QTR_TAU (TAU_1QTR) +#define THREE_QTR_TAU (TAU_3QTR) diff --git a/src/painter.cpp b/src/painter.cpp index e2a457a..8698439 100644 --- a/src/painter.cpp +++ b/src/painter.cpp @@ -8,7 +8,7 @@ // JLH = James Hammons // // WHO WHEN WHAT -// --- ---------- ------------------------------------------------------------ +// --- ---------- ----------------------------------------------------------- // JLH 09/20/2011 Created this file // @@ -148,11 +148,19 @@ void Painter::DrawAngledText(Vector center, double angle, QString text, double s float yOffset = -12.0 * Global::zoom * size; // Fix text so it isn't upside down... +#if 0 if ((angle > PI * 0.5) && (angle < PI * 1.5)) { angle += PI; yOffset = 12.0 * Global::zoom * size; } +#else + if ((angle > QTR_TAU) && (angle < THREE_QTR_TAU)) + { + angle += HALF_TAU; + yOffset = 12.0 * Global::zoom * size; + } +#endif textBox.translate(0, yOffset); painter->save(); @@ -230,7 +238,11 @@ void Painter::DrawArrowHandle(Vector center, double angle) // Since we're drawing directly on the screen, the Y is inverted. So we use // the mirror of the angle. +#if 0 double orthoAngle = -angle + (PI / 2.0); +#else + double orthoAngle = -angle + QTR_TAU; +#endif Vector orthogonal = Vector(cos(orthoAngle), sin(orthoAngle)); Vector unit = Vector(cos(-angle), sin(-angle)); @@ -256,7 +268,11 @@ void Painter::DrawArrowToLineHandle(Vector center, double angle) // Since we're drawing directly on the screen, the Y is inverted. So we use // the mirror of the angle. +#if 0 double orthoAngle = -angle + (PI / 2.0); +#else + double orthoAngle = -angle + QTR_TAU; +#endif Vector orthogonal = Vector(cos(orthoAngle), sin(orthoAngle)); Vector unit = Vector(cos(-angle), sin(-angle)); @@ -366,7 +382,11 @@ void Painter::DrawArrowhead(Vector head, Vector tail, double size) // We draw the arrowhead aligned along the line from tail to head double angle = Vector(head - tail).Angle(); +#if 0 double orthoAngle = angle + (PI / 2.0); +#else + double orthoAngle = angle + QTR_TAU; +#endif Vector orthogonal = Vector(cos(orthoAngle), sin(orthoAngle)); Vector unit = Vector(head - tail).Unit(); diff --git a/src/vector.cpp b/src/vector.cpp index fe627cd..baa0422 100644 --- a/src/vector.cpp +++ b/src/vector.cpp @@ -162,11 +162,7 @@ void vector::zero(const double epsilon/*= 1.0e-6*/) #include "vector.h" #include // For sqrt() -//#include "mathconstants.h" - -#define PI 3.14159265358979323846264338327 -#define RADIANS_TO_DEGREES (180.0 / PI) -#define DEGREES_TO_RADIANS (PI / 180.0) +#include "mathconstants.h" // Vector implementation @@ -354,11 +350,11 @@ double Vector::Magnitude(void) double Vector::Angle(void) { - // acos returns a value between zero and PI, which means we don't know which - // quadrant the angle is in... Though, if the y-coordinate of the vector is - // negative, that means that the angle is in quadrants III - IV. + // acos returns a value between zero and PI, which means we don't know + // which quadrant the angle is in... Though, if the y-coordinate of the + // vector is negative, that means that the angle is in quadrants III - IV. double rawAngle = acos(Unit().x); - double correctedAngle = (y < 0 ? (2.0 * PI) - rawAngle : rawAngle); + double correctedAngle = (y < 0 ? TAU - rawAngle : rawAngle); return correctedAngle; } -- 2.37.2