+
+/*virtual*/ void Line::Scale(Vector point, double amount)
+{
+}
+
+
+/*virtual*/ Object * Line::Mirror(Vector p1, Vector 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;
+}
+
+
+// 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);
+
+ // Find the points
+ Vector v7 = v3 + v5;
+ Vector v8 = v4 + v6;
+
+ return new Line(v7, v8);
+}
+
+
+void Line::SetDimensionOnLine(Dimension * dimension/*=NULL*/)
+{
+ // If they don't pass one in, create it for the caller.
+ if (dimension == NULL)
+ {
+//printf("Line::SetDimensionOnLine(): Creating new dimension...\n");
+// dimension = new Dimension(position, endpoint, DTLinear, this);
+ dimension = new Dimension(Connection(this, 0), Connection(this, 1.0), DTLinear, this);
+
+ if (parent)
+//{
+//printf("Line::SetDimensionOnLine(): Adding to parent...\n");
+ parent->Add(dimension);
+//}
+ }
+ else
+ {
+ dimension->Connect(this, 0);
+ dimension->Connect(this, 1.0);
+ }
+
+ // Make sure the Dimension is connected to us...
+ Connect(dimension, 0);
+ Connect(dimension, 1.0);
+}
+
+
+Object * Line::FindAttachedDimension(void)
+{
+ // Is there anything connected to this line? If not, return NULL
+ if (connected.size() < 2)
+ return NULL;
+
+ // Otherwise, we have to search our objects to see if there's a likely
+ // candidate. In this case, we're looking for a pointer to the same object
+ // with a parameter of 0 and 1 respectively. This is O((n^2)/2).
+ for(uint i=0; i<connected.size(); i++)
+ {
+ for(uint j=i+1; j<connected.size(); j++)
+ {
+//printf("Line: connected[i]=%X, connected[j]=%X, connected[i].t=%lf, connected[j].t=%lf\n", connected[i].object, connected[j].object, connected[i].t, connected[j].t);
+ if ((connected[i].object == connected[j].object)
+ && ((connected[i].t == 0 && connected[j].t == 1.0)
+ || (connected[i].t == 1.0 && connected[j].t == 0)))
+ return connected[i].object;
+ }
+ }
+
+ // Didn't find anything, so return NULL
+ return NULL;
+}
+
+
+void Line::SaveHitState(void)