/// <summary>
///
/// </summary>
/// <param name="rgn"></param>
/// <param name="pt1"></param>
/// <param name="pt2"></param>
/// <param name="ptIntercept"></param>
/// <returns></returns>
public static bool GetBoundaryIntercept(System.Drawing.Region rgn, PointF pt1, PointF pt2, out PointF ptIntercept)
{
bool hasIntercept = false;
ptIntercept = new PointF(0, 0);
bool pt1InRegion = rgn.IsVisible(pt1);
bool pt2InRegion = rgn.IsVisible(pt2);
if ((pt1InRegion && !pt2InRegion) || (pt2InRegion && !pt1InRegion))
{
PointF ptInside;
PointF ptOutside;
if (pt1InRegion)
{
ptInside = pt1;
ptOutside = pt2;
}
else
{
ptInside = pt2;
ptOutside = pt1;
}
RectangleF[] rcScans = rgn.GetRegionScans(new Matrix());
RectangleF rcCur;
PointF[] ptsIntersect;
int numIntersects;
double minDist = double.MaxValue;
double curDist;
PointF curPt;
int rcIdx;
int ptIdx;
for (rcIdx = 0; rcIdx < rcScans.Length; rcIdx++)
{
rcCur = rcScans[rcIdx];
numIntersects = Geometry.GetLineIntersect(ptOutside, ptInside, rcCur, out ptsIntersect);
for (ptIdx = 0; ptIdx < numIntersects; ptIdx++)
{
curPt = ptsIntersect[ptIdx];
curDist = Geometry.PointDistance(ptOutside, curPt);
if (curDist < minDist)
{
ptIntercept = curPt;
minDist = curDist;
hasIntercept = true;
}
}
}
}
return(hasIntercept);
}