0

我有一个简单的矩形PathGeometry,想测试点是否在PathGeometry. 显而易见的方法是打电话FillContains,但它没有按预期工作。还有一个重载函数,它有一个tolerance参数,虽然通过调整tolerance到高值FillContains可能会返回true,但由于给定的公差,FillContains对其他几何图形的调用也可能会返回true

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

    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)
4

1 回答 1

0

你有没有尝试过

VisualTreeHelper.HitTest(Visual reference,  Point point)

VisualTreeHelper.HitTest

使用几何进行命中测试

于 2015-03-02T20:06:24.633 回答