]> Shamusworld >> Repos - architektonas/blobdiff - src/line.cpp
Fixed Line rendering to keep attached Dimensions correct length with 'Fix Len'
[architektonas] / src / line.cpp
index b78a9dc6cd4f578a4e8d02cfe82adfe588797168..b7a11fb2cb300fa0c2c6cddd8220f712cb0ccedc 100644 (file)
@@ -9,11 +9,14 @@
 // WHO  WHEN        WHAT
 // ---  ----------  ------------------------------------------------------------
 // JLH  03/22/2011  Created this file
+// JLH  04/11/2011  Fixed attached dimensions to stay at correct length when
+//                  "Fixed Length" button is down
 //
 
 #include "line.h"
 
 #include <QtGui>
+#include "dimension.h"
 
 Line::Line(Vector p1, Vector p2, Object * p/*= NULL*/): Object(p1, p), endpoint(p2),
        dragging(false), draggingHandle1(false), draggingHandle2(false), //needUpdate(false),
@@ -203,6 +206,23 @@ Like so:
        }
        else
                needUpdate = false;
+
+       if (needUpdate)
+       {
+// should only do this if "Fixed Length" is set... !!! FIX !!!
+               Vector point1 = (draggingHandle1 ? endpoint : position);
+               Vector point2 = (draggingHandle1 ? position : endpoint);
+
+               Vector current(point2 - point1);
+               Vector v = current.Unit() * length;
+               Vector v2 = point1 + v;
+
+               if (dimPoint1)
+                       dimPoint1->SetPoint1(draggingHandle1 ? v2 : position);
+               
+               if (dimPoint2)
+                       dimPoint2->SetPoint2(draggingHandle2 ? v2 : endpoint);
+       }
 }
 
 /*virtual*/ void Line::PointerReleased(void)
@@ -247,9 +267,96 @@ about keeping track of old states...
                state = oldState;
 }
 
-#if 0
-/*virtual*/ bool Line::NeedsUpdate(void)
+void Line::SetDimensionOnPoint1(Dimension * dimension)
+{
+       dimPoint1 = dimension;
+
+       if (dimension)
+               dimension->SetPoint1(position);
+}
+
+void Line::SetDimensionOnPoint2(Dimension * dimension)
 {
-       return needUpdate;
+       dimPoint2 = dimension;
+
+       if (dimension)
+               dimension->SetPoint2(endpoint);
 }
-#endif
+
+/*
+Intersection of two lines:
+
+Find where the lines with equations r = i + j + t (3i - j) and r = -i + s (j) intersect.
+
+When they intersect, we can set the equations equal to one another:
+
+i + j + t (3i - j) = -i + s (j)
+
+Equating coefficients:
+1 + 3t = -1 and 1 - t = s
+So t = -2/3 and s = 5/3
+
+The position vector of the intersection point is therefore given by putting t = -2/3 or s = 5/3 into one of the above equations. This gives -i +5j/3 .
+
+
+so, let's say we have two lines, l1 and l2. Points are v0(p0x, p0y), v1(p1x, p1y) for l1
+and v2(p2x, p2y), v3(p3x, p3y) for l2.
+
+d1 = v1 - v0, d2 = v3 - v2
+
+Our parametric equations for the line then are:
+
+r1 = v0 + t(d1)
+r2 = v2 + s(d2)
+
+Set r1 = r2, thus we have:
+
+v0 + t(d1) = v2 + s(d2)
+
+Taking coefficients, we have:
+
+p0x + t(d1x) = p2x + s(d2x)
+p0y + t(d1y) = p2y + s(d2y)
+
+rearranging we get:
+
+t(d1x) - s(d2x) = p2x - p0x
+t(d1y) - s(d2y) = p2y - p0y
+
+Determinant D is ad - bc where the matrix look like:
+
+a b
+c d
+
+so D = (d1x)(d2y) - (d2x)(d1y)
+if D = 0, the lines are parallel.
+Dx = (p2x - p0x)(d2y) - (d2x)(p2y - p0y)
+Dy = (d1x)(p2y - p0y) - (p2x - p0x)(d1y)
+t = Dx/D, s = Dy/D
+
+We only need to calculate t, as we can then multiply it by d1 to get the intersection point.
+
+---------------------------------------------------------------------------------------------------
+
+The first and most preferred method for intersection calculation is the perp-product calculation. There are two vectors, v1 and v2. Create a third vector vector between the starting points of these vectors, and calculate the perp product of v2 and the two other vectors. These two scalars have to be divided to get the mulitplication ratio of v1 to reach intersection point. So:
+
+v1 ( bx1 , by1 );
+v2 ( bx2 , by2 );
+v3 ( bx3 , by3 );
+
+Perp product is equal with dot product of normal of first vector and the second vector, so we need normals:
+
+n1 ( -by1 , bx1 );
+n3 ( -by3 , bx3 );
+
+Dot products:
+
+dp1 = n3.v2 = -by3*bx2 + bx3*by2;
+dp2 = n1.v2 = -by1*bx2 + bx1*by2;
+
+ratio = dp1/dp2;
+crossing vector = v1*rat;
+
+And that's it.
+*/
+