]> Shamusworld >> Repos - architektonas/blobdiff - src/line.cpp
Misc. fixes & additions
[architektonas] / src / line.cpp
index 90b5dc21e96485391fcaad161d1147d54c98912c..060868562a8299c3d335bb849f3657d4a0d7417c 100644 (file)
@@ -172,6 +172,13 @@ key to make it draw/show on the other side...
 
 TODO: Make Dimension preview with modifier keys for showing on other side
 */
+/*
+
+N.B.: This no longer works, as the DrawDimension object takes precedence over this code.
+      THIS DOES NOTHING ANYMORE!!!
+
+*/
+#if 0
        // Is the dimension tool active? Let's use it:
        if (dimensionActive)
        {
@@ -223,6 +230,7 @@ a dimension only) Draw() function... :-/
                        return true;
                }
        }
+#endif
 
        if (state == OSInactive)
        {
@@ -335,6 +343,18 @@ a dimension only) Draw() function... :-/
                needUpdate = true;
 
 //doesn't work         QMainWindow::statusBar()->setText("You are manipulating a line");
+
+               // Tell connected objects to move themselves...
+               if (draggingLine)
+               {
+                       std::vector<Connection>::iterator i;
+
+                       for(i=connected.begin(); i!=connected.end(); i++)
+                       {
+                               if ((*i).object->type == OTLine)
+                                       ((Line *)((*i).object))->MovePointAtParameter((*i).t, delta);
+                       }
+               }
        }
 
 /*
@@ -449,23 +469,13 @@ the horizontal line or vertical line that intersects from the current mouse posi
 
 /*virtual*/ bool Line::HitTest(Point point)
 {
-//     SaveHitState();
-
        hitPoint1 = hitPoint2 = hitLine = false;
        Vector lineSegment = endpoint - position;
        Vector v1 = point - position;
        Vector v2 = point - endpoint;
-//     double t = Vector::Parameter(position, endpoint, point);
        double t = Geometry::ParameterOfLineAndPoint(position, endpoint, point);
        double distance;
 
-       // Geometric interpretation:
-       // The parameter "t" on the vector lineSegment is where the normal of
-       // lineSegment coincides with point. If t < 0, the normal lies beyond the
-       // 1st endpoint. If t > 1, then the normal lies beyond the 2nd endpoint. We
-       // only calculate the length of the normal between the point and the
-       // lineSegment when the parameter is between 0 and 1.
-
        // Geometric interpretation of "distance = ?Det?(ls, v1) / |ls|":
        // If the segment endpoints are s and e, and the point is p, then the test
        // for the perpendicular intercepting the segment is equivalent to insisting
@@ -501,7 +511,6 @@ the horizontal line or vertical line that intersects from the current mouse posi
                hitLine = true;
 
        return (hitPoint1 || hitPoint2 || hitLine ? true : false);
-//     return HitStateChanged();
 }
 
 
@@ -542,23 +551,29 @@ same reference number.
 
 /*virtual*/ Vector Line::GetPointAtParameter(double parameter)
 {
+// Is there any real reason to clamp this to the endpoints?
+// (hey, whaddya know? this was masking a bug!)
+#if 0
        if (parameter <= 0)
                return position;
        else if (parameter >= 1.0)
                return endpoint;
+#endif
 
-       // Our parameter lies between zero and one, so calculate it!
-       Vector v(endpoint, position);
-       double length = v.Magnitude();
-       // We scale the magnitude of v so that it lies between 0 and 1...
-       // By multiplying the parameter by the magnitude, we obtain the point we
-       // want. No scaling necessary as it's inherent in the approach!
-       double spotOnLength = length * parameter;
-
-       // To get our point, we use the initial point of the line and add in our
-       // scaled point.
-       Vector result = position + (v * spotOnLength);
-       return result;
+       // The parameter is a percentage of the length of the vector, so all we
+       // have to do is scale the vector by it to find the point.
+       return position + (Vector(position, endpoint) * parameter);
+}
+
+
+/*virtual*/ void Line::MovePointAtParameter(double parameter, Vector v)
+{
+       if (parameter == 0)
+               position += v;
+       else if (parameter == 1.0)
+               endpoint += v;
+       else
+               {} // Not sure how to handle this case :-P
 }
 
 
@@ -613,7 +628,7 @@ same reference number.
 }
 
 
-void Line::SetDimensionOnLine(Dimension * dimension/*=NULL*/)
+void Line::SetDimensionOnLine(Dimension * dimension/*= NULL*/)
 {
        // If they don't pass one in, create it for the caller.
        if (dimension == NULL)