return Vector((v.x - origin.x) * zoom, screenSize.y - ((v.y - origin.y) * zoom));
}
-Vector Painter::QtCoordsToCartesian(Vector v)
+Vector Painter::QtToCartesianCoords(Vector v)
{
// Convert screen location, with inverted Y-axis coordinates, to regular
// Cartesian coordinates at the current zoom level.
void Painter::DrawAngledText(Vector center, double angle, QString text)
{
+ // Strategy: Since Qt doesn't have any rotated text drawing functions,
+ // we instead translate the origin to the center of the text to be drawn and
+ // then rotate the frame to the desired angle.
center = CartesianToQtCoords(center);
// We may need this stuff... If dimension text is large enough.
// int textHeight = QFontMetrics(painter->font()).height();
QRectF textBox(-100, -100, 200, 200); // x, y, w, h; x/y = upper left corner
- // Some things to note here: if angle > 90 degrees, then we need to take the negative
- // of the angle for our text.
- painter->save();
- painter->translate(center.x, center.y);
// This is in pixels. Might not render correctly at all zoom levels.
// Need to figure out if dimensions are always rendered at one size regardless of zoom,
// or if they have a definite size, and are thus zoomable.
// If zoomable, this is incorrect:
int yOffset = -12;
- //Fix text so it isn't upside down...
+ // Fix text so it isn't upside down...
if ((angle > PI * 0.5) && (angle < PI * 1.5))
{
angle += PI;
}
textBox.translate(0, yOffset);
- // Angles are backwards in the Qt coord system...
+ painter->save();
+ painter->translate(center.x, center.y);
+ // Angles are backwards in the Qt coord system, so we flip ours...
painter->rotate(-angle * RADIANS_TO_DEGREES);
painter->drawText(textBox, Qt::AlignCenter, text);
painter->restore();
void Painter::DrawArc(Vector center, double radius, double startAngle, double span)
{
center = CartesianToQtCoords(center);
+ // Need to multiply scalar quantities by the zoom factor as well...
+ radius *= zoom;
QRectF rectangle(QPointF(center.x - radius, center.y - radius),
QPointF(center.x + radius, center.y + radius));
int angle1 = (int)(startAngle * RADIANS_TO_DEGREES * 16.0);
void Painter::DrawEllipse(Vector center, double axis1, double axis2)
{
+ // Need to multiply scalar quantities by the zoom factor as well...
center = CartesianToQtCoords(center);
- painter->drawEllipse(QPointF(center.x, center.y), axis1, axis2);
+ painter->drawEllipse(QPointF(center.x, center.y), axis1 * zoom, axis2 * zoom);
+}
+
+// This function is for drawing object handles without regard for zoom level;
+// we don't want our object handle size to depend on the zoom level!
+void Painter::DrawHandle(Vector center)
+{
+ center = CartesianToQtCoords(center);
+ painter->drawEllipse(QPointF(center.x, center.y), 4.0, 4.0);
}
void Painter::DrawLine(int x1, int y1, int x2, int y2)
painter->drawText(rect, (Qt::AlignmentFlag)type, text);
}
-