PathGeometry FillContains不能按预期工作

问题描述:

我有一个简单的长方形PathGeometry并且想要测试点是否在PathGeometry之内。显而易见的方法是拨打FillContains,但不能按预期工作。虽然通过将tolerance调整为高值,FillContains可能会返回true,但由于给定的容差,在其他几何图形上调用FillContains也可能会返回true,但也有一个具有参数tolerance的过载函数。PathGeometry FillContains不能按预期工作

所以我写了这个扩展方法来为这个特定的矩形PathGemoetry正确FillContains

public static bool Contains(this PathGeometry geo, Point pt) 
    { 
     var match = System.Text.RegularExpressions.Regex.Match(geo.Figures.ToString(), @"M(\d*.\d*),(\d*.\d*)L(\d*.\d*),(\d*.\d*) (\d*.\d*),(\d*.\d*) (\d*.\d*),(\d*.\d*)z"); 

     float ulx = float.Parse(match.Groups[1].Value); 
     float uly = float.Parse(match.Groups[2].Value); 

     float urx = float.Parse(match.Groups[3].Value); 
     float ury = float.Parse(match.Groups[4].Value); 

     float lrx = float.Parse(match.Groups[5].Value); 
     float lry = float.Parse(match.Groups[6].Value); 

     float llx = float.Parse(match.Groups[7].Value); 
     float lly = float.Parse(match.Groups[8].Value); 

     Rect rect = new Rect(ulx, uly, urx - ulx, lly - uly); 

     return rect.Contains(pt); 
    } 

而结果的样本:

// Point: {188.981887817383,507.910125732422} 
// Region: M188.759994506836,501.910003662109L216.580001831055,501.910003662109 216.580001831055,511.910003662109 188.759994506836,511.910003662109z 

// returns false 
var test1 = region.FillContains(pt); 

// returns true 
var test2 = region.Contains(pt); 

因为我有很多这样的PathGemoetry对象那么是否有更好的执行我的快速命中测试或有什么我错过了,而使用FillContains导致意想不到的结果?

编辑

只注意到我PathGeometry有一个转换应用到它这导致点并不配合。

我用这个来绕过命中测试的Transform固定它:

PathGeometry.Parse(region.Figures.ToString()).FillContains(pt) 
+0

FillContains对我的作品有您的测试数据。您如何从地区数据中实际创建PathGeometry?在XAML中,它会产生一个StreamGeometry,而不是PathGeometry。 – Clemens 2015-03-02 20:16:50

+0

@Clemens,愚蠢的错误,有一个应用于几何的'Transform',看看我的编辑 – 2015-03-02 20:29:36

+1

也许更高效:'region.FillContains(region.Transform.Transform(pt))'。 – Clemens 2015-03-02 20:31:43

你试过

VisualTreeHelper.HitTest(Visual reference, Point point) 

VisualTreeHelper.HitTest

Hit Testing Using Geometry