1
votes

I need to calculate the intersection between two geometries to check if one is fully inside the other or not.

The Geometry "container", based on a System.Windows.Shapes.Polygon, is created as follows:

List<PathSegment> basePolygonSegments = new List<PathSegment> {  
           new PolyLineSegment(basePolygon.Points, true) };
PathGeometry baseGeometry = new PathGeometry();
   baseGeometry.Figures.Add(
       new PathFigure(basePolygon.Points[0], basePolygonSegments, true));

The Geometry "contained" can be:

  • another System.Windows.Shapes.Polygon
  • a System.Windows.Shapes.Polyline, that can have only one line or three lines (the shape is a |_|, or U)

The Polyline is created as follows:

Polyline bracketDrawingPolyline = new Polyline();
foreach(Point p in listOfPoints)
bracketDrawingPolyline.Points.Add(p);

LineGeometry lineGeometry = 
     new LineGeometry(
      bracketDrawingPolyline.Points[0],
      bracketDrawingPolyline.Points[bracketDrawingPolyline.Points.Count - 1]);
PathGeometry bracketGeometry = new PathGeometry();
bracketGeometry = lineGeometry.GetWidenedPathGeometry(
         new Pen(Brushes.Black, 1.0));

To understand if the "contained" Geometry is contained in the "container", I do the following:

CombinedGeometry intersectionGeometry = 
  new CombinedGeometry(GeometryCombineMode.Intersect, 
     baseGeometry, bracketGeometry);

double intersectionArea = 
     intersectionGeometry.GetArea(0.0001, ToleranceType.Absolute);
double bracketArea = bracketGeometry.GetArea(0.0001, ToleranceType.Absolute);


if (intersectionArea < bracketArea)
{
   //the second Geometry is not fully contained in the "container" Geometry
}

else
//it is fully contained
....

In case of Polygon or Polyline with only one line everything works as expected. But with Polyline U, intersectionArea and bracketArea are always the same.

I've also tried to perform the following checks:

bool result = baseGeometry.FillContains(bracketGeometry);
IntersectionDetail idtl =  
         baseGeometry.FillContainsWithDetail(bracketGeometry);

but I have the same results.

1

1 Answers

0
votes

I've found a solution on my own, but I don't know if it is the best one. Considered that with a single line everything works well, I just do the check for each line of the polyline, that is:

for (int i = 1; i < bracketDrawingPolyline.Points.Count; i++)
{
     LineGeometry lineGeometry = 
       new LineGeometry(bracketDrawingPolyline.Points[i - 1],
       bracketDrawingPolyline.Points[i]);
     ...//continue with the check of the line as described in the post...
}