-bool Line::HitTest(Point point)
-{
- SaveState();
-
- hitPoint1 = hitPoint2 = hitLine = false;
- Vector lineSegment = endpoint - position;
- Vector v1 = point - position;
- Vector v2 = point - endpoint;
- double parameterizedPoint = lineSegment.Dot(v1) / lineSegment.Magnitude(), distance;
-
- // Geometric interpretation:
- // The parameterized point on the vector lineSegment is where the perpendicular
- // intersects lineSegment. If pp < 0, then the perpendicular lies beyond the 1st
- // endpoint. If pp > length of ls, then the perpendicular lies beyond the 2nd endpoint.
-
- if (parameterizedPoint < 0.0)
- distance = v1.Magnitude();
- else if (parameterizedPoint > lineSegment.Magnitude())
- distance = v2.Magnitude();
- else
- // distance = ?Det?(ls, v1) / |ls|
- distance = fabs((lineSegment.x * v1.y - v1.x * lineSegment.y) / lineSegment.Magnitude());
-
- // Geometric interpretation of the above:
- // 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
- // that the two dot products {s-e}.{s-p} and {e-s}.{e-p} are both non-negative.
- // Perpendicular distance from the point to the segment is computed by first
- // computing the area of the triangle the three points form, then dividing by
- // the length of the segment. Distances are done just by the Pythagorean
- // theorem. Twice the area of the triangle formed by three points is the
- // determinant of the following matrix:
- //
- // sx sy 1 0 0 1 0 0 0
- // ex ey 1 ==> ex ey 1 ==> ex ey 0
- // px py 1 px py 1 px py 0
- //
- // By translating the start point to the origin, and subtracting row 1 from
- // all other rows, we end up with the matrix on the right which greatly
- // simplifies the calculation of the determinant.
-
-//How do we determine distance here? Especially if zoomed in or out???
-//#warning "!!! Distances tested for may not be valid if zoomed in or out !!!"
-// [FIXED]
- if ((v1.Magnitude() * Painter::zoom) < 8.0)
- hitPoint1 = true;
- else if ((v2.Magnitude() * Painter::zoom) < 8.0)
- hitPoint2 = true;
- else if ((distance * Painter::zoom) < 5.0)
- hitLine = true;
-
- return StateChanged();
-}
-
-void Line::SaveState(void)