Hi Curtis,

Le 14/06/2011 19:38, Curtis Jensen a écrit :
In the commons math 3.0 Geometry package, How can get the intersection
of two SubLines?  I see that the Line class has an intersection
method, but not the SubLine class.  I can create Lines from SubLines
and call the intersection method, but I'm not sure how to tell if the
resultant Vector is on the SubLines.

There is not (yet) any convenient method to get such a point. However, it would be interesting to add one. Feel free to open a Jira issue to ask for it ig you want.

In the mean time, the proper way to compute this point is as follows:

  // retrieve the underlying lines (it does not recreate them)
  Line line1 = (Line) subLine1.getHyperplane();
  Line line2 = (Line) subLine2.getHyperplane();

  // compute the intersection on infinite line
  Vector2D v2D = line1.intersection(line2);

  // check location of point with respect to first sub-line
  Location loc1 =
    sub1.getRemainingRegion().checkPoint(l1.toSubSpace(v2D));

  // check location of point with respect to second sub-line
  Location loc2 =
    sub2.getRemainingRegion().checkPoint(l2.toSubSpace(v2D));

You can the compare loc1 and loc2 as you want. If you want strict inclusion (i.e. without endpoints) you should simply do

  if ((loc1 == INSIDE) && (loc2 == INSIDE)) {
     return v2D;
  } else {
     return null; // or throw an exception
  }

and if you want to large inclusion (i.e. with endpoints) you should do

  if ((loc1 != OUTSIDE) && (loc2 != OUTSIDE)) {
     return v2D;
  } else {
     return null; // or throw an exception
  }

There are three possible values for Location: INSIDE, OUTSIDE and BOUNDARY.


Also, How do I get the end points of the SubLine.

Here again, there is no convenience function. If you are sure you subline is only one segment and not several disjoints segments, you can do:

  IntervalSet is = (IntervalsSet) sub1.getRemainingRegion();
  Vector2D start = line1.toSpace(new Vector1D(is.getInf()));
  Vector2D end   = line1.toSpace(new Vector1D(is.getSup()));

If there may be several disjoint segments, use the asList method from IntervalSet to retrieve all segments, and perform a loop to convert the 1D abscissa into a 2D point, using line.toSpace.

Here again, if you think it would be interesting, open a Jira issue to ask for a convenience function for that. In the same spirit, I guess a constructor with the two endpoints may be interesting.

Hope this helps
Luc


Thanks,
Curtis

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org

Reply via email to