У меня есть простой прямоугольник 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)
FillContains работает для меня ваши тестовые данные. Как вы на самом деле создаете PathGeometry из данных вашего региона? В XAML он будет создавать StreamGeometry, а не PathGeometry. – Clemens
@Clemens, глупая ошибка, есть «Transform», примененная к геометрии, посмотрите на мое редактирование. –
Возможно, более эффективно: 'region.FillContains (region.Transform.Transform (pt))'. – Clemens