}
}
+ // 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));
update();
}
+// Moved to mouse up routine, so we can slide the point around
+#if 0
else if (tool == TOOLAddPoly) // "Add Poly" tool
{
#ifdef DEBUGFOO
WriteLogMsg(" --> [# polys: %u, # points: %u]\n", pts.GetNumPolys(), pts.GetNumPoints());
#endif
}
+#endif
else if (tool == TOOLSelect || tool == TOOLPolySelect)
{
if (pts.GetNumPoints() > 0)
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);
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);
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)
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();
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;
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);
// 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
// JLH = James Hammons <jlhamm@acm.org>
//
// 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)
// JLH = James Hammons <jlhamm@acm.org>
//
// WHO WHEN WHAT
-// --- ---------- ------------------------------------------------------------
+// --- ---------- -----------------------------------------------------------
// JLH 09/20/2011 Created this file
//
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();
// 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));
// 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));
// 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();
#include "vector.h"
#include <math.h> // 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
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;
}