2015-03-02 4 views
0

У меня есть простой прямоугольник PathGeometry и вы хотите проверить, находится ли точка внутри PathGeometry. Очевидным способом является вызов FillContains, но он не работает должным образом. Существует также функция перегрузки, которая имеет параметр tolerance, хотя, отрегулировав tolerance на высокие значения FillContains, может возвращаться true, но из-за данного допуска, вызываемого FillContains, на других геометриях также может возвращаться true.PathGeometry FillContains не работает как ожидалось

Так что я написал этот метод расширения, чтобы иметь правильный 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 применяется к нему, которые приводят к точке, не уместиться.

Я установил его с помощью этого обойти Transform в хит-тестирования:

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

FillContains работает для меня ваши тестовые данные. Как вы на самом деле создаете PathGeometry из данных вашего региона? В XAML он будет создавать StreamGeometry, а не PathGeometry. – Clemens

+0

@Clemens, глупая ошибка, есть «Transform», примененная к геометрии, посмотрите на мое редактирование. –

+1

Возможно, более эффективно: 'region.FillContains (region.Transform.Transform (pt))'. – Clemens

ответ

 Смежные вопросы

  • Нет связанных вопросов^_^