Quantcast
Channel: Windows Presentation Foundation (WPF) forum
Viewing all articles
Browse latest Browse all 18858

Why Geometry intersection does not give the expected result with polylines with more than one line?

$
0
0
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.

Viewing all articles
Browse latest Browse all 18858

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>