简体   繁体   中英

Strange behavior of FillContains method

I'm trying to use fillContains method from Geometry class to detect if geometry1 is inside geometry2 but I have a problem when the geometry1 is placed on the right or bottom edge of first geometry. Here is a result which is quite strange:

var rect = new Rect(new Point(0, 0), new Point(100, 100));
RectangleGeometry geometry1 = new RectangleGeometry(rect);

var rect2 = new Rect(new Point(0, 0), new Size(10, 10));
RectangleGeometry geometry2 = new RectangleGeometry(rect2);

var rect3 = new Rect(new Point(90, 90), new Size(10, 10));
RectangleGeometry geometry3 = new RectangleGeometry(rect3);

var rect4 = new Rect(new Point(90, 80), new Size(10, 10));
RectangleGeometry geometry4 = new RectangleGeometry(rect4);

Assert.True(geometry1.FillContains(geometry2));
Assert.True(geometry1.FillContains(geometry3));
Assert.True(geometry1.FillContains(geometry4)); // Assertion failed

Could you help me how I should do that correctly?

It may be something to do with the tolerance...or something internal to the Geometry intersecting algorithm....maybe they are scaling the values in some way...and it depends on the values you use that can cause the intersection check to come out with an unexpected result (eg when point is 90, 80).

I've expanded your code a little to show some more detail about how the 2 geometries intersect, and hopefully allow things to be played with to determine the cause.

    var rect = new Rect(new Point(0, 0), new Point(100, 100));
    RectangleGeometry geometry1 = new RectangleGeometry(rect);

    var rect2 = new Rect(new Point(0, 0), new Size(10, 10));
    RectangleGeometry geometry2 = new RectangleGeometry(rect2);

    var rect3 = new Rect(new Point(90, 90), new Size(10, 10));
    RectangleGeometry geometry3 = new RectangleGeometry(rect3);

    var rect4 = new Rect(new Point(90, 80), new Size(10, 10));
    RectangleGeometry geometry4 = new RectangleGeometry(rect4);

    var rect4fits = new Rect(new Point(90, 80), new Size(9, 10));
    RectangleGeometry geometry4fits = new RectangleGeometry(rect4fits);

    double tolerance = 0.25; // same as standard flattening tolerance
    ToleranceType tolerancetype = ToleranceType.Relative;

    var bcontains2 = geometry1.FillContains(geometry2);
    var bcontainsdetail2 = geometry1.FillContains(geometry2, tolerance, tolerancetype);
    var detail2 = geometry1.FillContainsWithDetail(geometry2);
    var detailtolerance2 = geometry1.FillContainsWithDetail(geometry2, tolerance, tolerancetype);

    var bcontains3 = geometry1.FillContains(geometry3);
    var bcontainsdetail3 = geometry1.FillContains(geometry3, tolerance, tolerancetype);
    var detail3 = geometry1.FillContainsWithDetail(geometry3);
    var detailtolerance3 = geometry1.FillContainsWithDetail(geometry3, tolerance, tolerancetype);

    var bcontains4 = geometry1.FillContains(geometry4);
    var bcontainsdetail4 = geometry1.FillContains(geometry4, tolerance, tolerancetype);
    var detail4 = geometry1.FillContainsWithDetail(geometry4);
    var detailtolerance4 = geometry1.FillContainsWithDetail(geometry4, tolerance, tolerancetype);

    var bcontains4fits = geometry1.FillContains(geometry4fits);
    var bcontainsdetail4fits = geometry1.FillContains(geometry4fits, tolerance, tolerancetype);
    var detail4fits = geometry1.FillContainsWithDetail(geometry4fits);
    var detailtolerance4fits = geometry1.FillContainsWithDetail(geometry4fits, tolerance, tolerancetype);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM