Raphael,

It's been a while since I was doing this kind of math, mind telling me
why that would be advantageous here?

Thanks!
Hamy

On May 14, 7:02 pm, Raphael <[email protected]> wrote:
> On Thu, May 14, 2009 at 4:42 PM, Hamilton Turner <[email protected]>wrote:
>
>
>
> > Hi all,
> > I have been searching for something like this for a while, finally made
> > what I think is a decent solution on my own, and wanted to share it with the
> > community. Comments would be appreciated, I think I may have some small bugs
> > in the equality checking if the lines are parallel (I might need a <= where
> > I have a < in case the last point is the overlap). Hopefully there are no
> > glaring errors.
>
> > Also, please note that this is a solution for line segments, not for lines!
> > There are a bunch of easily found, really similar solutions for lines.
>
> > Thanks,
> > Hamy
>
> > Problem: Given 4 points, that define 2 *line segments*, return true/false
> > based on if they intersect. Could be easily modified to return the point of
> > intersection.
>
> > Note that a precision point is simply a point that stores the x/y values as
> > floats or doubles. I made it because I needed it for other stuff, you can
> > just cast all of the int's to doubles yourself and it should work just as
> > well.
>
> > private boolean intersects(PrecisionPoint start1,
> >  PrecisionPoint end1, PrecisionPoint start2, PrecisionPoint end2) {
>
> >  // First find Ax+By=C values for the two lines
> > double A1 = end1.y - start1.y;
> >  double B1 = start1.x - end1.x;
> >  double C1 = A1 * start1.x + B1 * start1.y;
>
> > double A2 = end2.y - start2.y;
> >  double B2 = start2.x - end2.x;
> >  double C2 = A2 * start2.x + B2 * start2.y;
>
> > double det = (A1 * B2) - (A2 * B1);
>
> > if (det == 0) {
>
> You might want to check |det| < epsilon rather than strick equality to 0.
> R/
>
> >  // Lines are either parallel, are collinear (the exact same
> >  // segment), or are overlapping partially, but not fully
> > // To see what the case is, check if the endpoints of one line
> >  // correctly satisfy the equation of the other (meaning the two
> >  // lines have the same y-intercept).
> > // If no endpoints on 2nd line can be found on 1st, they are
> >  // parallel.
> > // If any can be found, they are either the same segment,
> >  // overlapping, or two segments of the same line, separated by some
> >  // distance.
> > // Remember that we know they share a slope, so there are no other
> >  // possibilities
>
> >  // Check if the segments lie on the same line
> > // (No need to check both points)
> >  if ((A1 * start2.x) + (B1 * start2.y) == C1) {
> >  // They are on the same line, check if they are in the same
> >  // space
> > // We only need to check one axis - the other will follow
> >  if ((Math.min(start1.x, end1.x) < start2.x)
> >  && (Math.max(start1.x, end1.x) > start2.x))
> >  return true;
>
> > // One end point is ok, now check the other
> >  if ((Math.min(start1.x, end1.x) < end2.x)
> >  && (Math.max(start1.x, end1.x) > end2.x))
> >  return true;
>
> > // They are on the same line, but there is distance between them
> >  return false;
> >  }
>
> > // They are simply parallel
> >  return false;
> >  } else {
> > // Lines DO intersect somewhere, but do the line segments intersect?
> >  double x = (B2 * C1 - B1 * C2) / det;
> > double y = (A1 * C2 - A2 * C1) / det;
>
> > // Make sure that the intersection is within the bounding box of
> >  // both segments
> > if ((x > Math.min(start1.x, end1.x) && x < Math.max(start1.x,
> >  end1.x))
> > && (y > Math.min(start1.y, end1.y) && y < Math.max(
> >  start1.y, end1.y))) {
> >  // We are within the bounding box of the first line segment,
> > // so now check second line segment
> >  if ((x > Math.min(start2.x, end2.x) && x < Math.max(start2.x,
> >  end2.x))
> > && (y > Math.min(start2.y, end2.y) && y < Math.max(
> >  start2.y, end2.y))) {
> >  // The line segments do intersect
> > return true;
> >  }
> > }
>
> >  // The lines do intersect, but the line segments do not
> > return false;
> >  }
> > }
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to