#include <QtGui>
#include "container.h"
#include "dimension.h"
+#include "geometry.h"
#include "mathconstants.h"
#include "painter.h"
/*virtual*/ bool Line::Collided(Vector point)
{
+/*
+what we can do here is set ignoreClicks to true to keep other objects that are
+selected from deselecting themselves. Will that fuck up something else? Not sure
+yet... :-/
+*/
+ // Someone told us to fuck off, so we'll fuck off. :-)
+ if (ignoreClicks)
+ return false;
+
// We can assume this, since this is a mouse down event here.
objectWasDragged = false;
HitTest(point);
Vector lineSegment = endpoint - position;
Vector v1 = point - position;
Vector v2 = point - endpoint;
- double t = Vector::Parameter(position, endpoint, point);
+// double t = Vector::Parameter(position, endpoint, point);
+ double t = Geometry::ParameterOfLineAndPoint(position, endpoint, point);
double distance;
// Geometric interpretation:
}
-/*virtual*/ void Line::Rotate(Vector point, double angle)
+/*virtual*/ void Line::Rotate(Point point, double angle)
{
+ Point l1 = Geometry::RotatePointAroundPoint(position, point, angle);
+ Point l2 = Geometry::RotatePointAroundPoint(endpoint, point, angle);
+ position = l1;
+ endpoint = l2;
}
-/*virtual*/ void Line::Scale(Vector point, double amount)
+/*virtual*/ void Line::Scale(Point point, double amount)
{
}
-/*virtual*/ Object * Line::Mirror(Vector p1, Vector p2)
+/*virtual*/ void Line::Mirror(Point p1, Point p2)
{
-#if 0
- return NULL;
-
-double Vector::Parameter(Vector v1, Vector v2, Vector p)
-{
- // Geometric interpretation:
- // The parameterized point on the vector lineSegment is where the normal of
- // the lineSegment to the point intersects lineSegment. If the pp < 0, then
- // the perpendicular lies beyond the 1st endpoint. If pp > 1, then the
- // perpendicular lies beyond the 2nd endpoint.
-
- Vector lineSegment = v2 - v1;
- double magnitude = lineSegment.Magnitude();
- Vector pointSegment = p - v1;
- double t = lineSegment.Dot(pointSegment) / (magnitude * magnitude);
- return t;
+ Point l1 = Geometry::MirrorPointAroundLine(position, p1, p2);
+ Point l2 = Geometry::MirrorPointAroundLine(endpoint, p1, p2);
+ position = l1;
+ endpoint = l2;
}
-// Return the normal to the linesegment formed by the passed in points.
-// (Not sure which is head or tail, or which hand the normal lies)
-/*static*/ Vector Vector::Normal(Vector v1, Vector v2)
-#endif
-
- double t1 = Vector::Parameter(p1, p2, position);
- double t2 = Vector::Parameter(p1, p2, endpoint);
-
- Vector unit = Vector(p1, p2).Unit();
- Vector v1 = unit * t1;
- Vector v2 = unit * t2;
-
-// Vector normal = Vector::Normal(p1, p2);
- // Get the points normal to position & endpoint to the line passed in
- // (these are tails)
- Vector v3 = p1 + v1;
- Vector v4 = p1 + v2;
-
- // Make our mirrored vectors
- Vector v5 = -(position - v3);
- Vector v6 = -(endpoint - v4);
+/*virtual*/ void Line::Save(void)
+{
+ Object::Save();
+ oldEndpoint = endpoint;
+}
- // Find the points
- Vector v7 = v3 + v5;
- Vector v8 = v4 + v6;
- return new Line(v7, v8);
+/*virtual*/ void Line::Restore(void)
+{
+ Object::Restore();
+ endpoint = oldEndpoint;
}