// 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),
}
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)
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.
+*/
+