2013-10-07 3 views
1

У меня есть немного кода, который принимает несколько точек и создает несколько LineSegments для создания Path.Преобразование Path & StrokeWidth в геометрию

System.Windows.Shapes.Path pathSegment = new System.Windows.Shapes.Path(); 
PathFigure pathFig = new PathFigure(); 
PathGeometry pathGeo = new PathGeometry(); 
pathFig.StartPoint = new Point(pointData[0].X, pointData[0].Y); 
for (int loop = 1; loop < pointData.Count; loop++) 
{ 
    LineSegment ls = new LineSegment();   
    ls.Point = new Point(pointData[loop].X, pointData[loop].Y); 
    pathFig.Segments.Add(ls); 
} 

pathGeo.Figures.Add(pathFig); 
pathSegment.Data = pathGeo; 
pathSegment.Stroke = brush; 
pathSegment.StrokeThickness = 22; 

Это создает мою линию шириной 22px (приблизительно). Теперь, если вы посмотрите на фактические данные для этого, вы можете видеть только элементы LineSegement, которые, по сути, дают вам такой вывод, где реальная строка черная, а фактическая отображаемая строка - серая (извините за изворотливый эскиз mspaint):

enter image description here

Теперь я хочу, чтобы выполнить StrokeContains на геометрии, чтобы увидеть, если указанная точка находится в пределах всей PathSegment выше (серая зона). То, что он на самом деле делает, это проверка на LineSegments (черная линия).

Есть ли лучший способ создать Путь? или есть способ преобразования пути Segment, включая StrokeWidth в новый Path?

ответ

0

Он должен работать, если вы используете правильную толщину пера в StrokeContains называют:

Point point = ... 
Pen pen = new Pen { Thickness = pathSegment.StrokeThickness }; 
bool contains = pathSegment.Data.StrokeContains(pen, point); 

В качестве альтернативы вы можете просто сделать тест хит на пути:

bool contains = pathSegment.InputHitTest(point) != null; 
+0

Спасибо, я нашел StrokeContains вскоре после того, как я опубликовал, что работает. Я только что попробовал InputHitTest и тот же код, который работает с StrokeContains, и он почему-то не обнаруживает. – MikeyTT

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