Существует множество различных способов сделать это, в зависимости от производительности и точности, которые вам нужны, и от того, какой геометрический код вы хотите написать.
1. Использование FillContains
Один из способов состоит в построении последовательной линии геометрии и использовать path.Data.FillContains (геометрия), чтобы определить, пересекаются ли они фигуру. Что-то вдоль этих линий:
Transform rotation = new RotateTransform { Angle = 30 };
double max = path.Width + path.Height;
double current = 0;
for(double delta = max/2; delta > 0.25; delta = delta/2)
{
var line = new LineGeometry(
new Point(centerX + current, centerY),
new Point(centerX + max, centerY),
rotation);
if(path.Data.FillContains(line))
current += delta;
}
var intersectPoint = rotation.Transform(new Point(current, 0));
2. Использование GetFlattenedPathGeometry
Другой способ заключается в использовании GetFlattenedPathGeometry:
var flattened = path.Data.GetFlattenedPathGeometry();
var segment = pg.Figures[0].Segments[0] as PolyLineSegment;
Point[] points = segment.Points;
for(int i=0; i<points.Count-1; i++)
{
... check for intersection with the line from points[i] to points[i+1] ...
}
Это может быть быстрее, потому что геометрия обрабатывается только один раз, но требует для кодирования собственного алгоритма пересечения линий (что очень просто).
3. Использование PathGeometry.CreateFromGeometry
Наиболее эффективным способом из всех является, чтобы преобразовать заданную геометрию в PathGeometry, а затем вручную перебирать на чертежах и сегменты в геометрии:
вар гео = PathGeometry.CreateFromGeometry (путь.Data); Еогеасп (вар фигура в geo.Figures) Еогеасп (вар сегмент в figure.Segments) если (сегмент LineSegment) ... еще если (сегмент ArcSegment) ... еще если (сегмент BezierSegment) ... еще если (сегмент QuadraticBezierSegment) ... еще если (сегмент PolyLineSegment) ... еще если (сегмент PolyBezierSegment) ... еще если (сегмент PolyQuadraticBezierSegment) ...
Этот подход требует довольно большого количества кода геометрического анализа, но очень быстро, потому что WPF не должен создавать сплющенную геометрию или выполнять повторяющиеся пересечения. Это метод, который я обычно использую, когда мне нужно, чтобы мой код работал очень быстро.
Обратите внимание на GetWidenedPathGeometry
Все, что я говорил до сих пор даст вам пересечения между геометрическими данными пути и вашего пересечения линии: Она не учитывает ширину линии счета, торцевые крышки и т.д.Для того, чтобы принять это во внимание, а вам нужно будет использовать GetWidenedPathGeometry
следующим образом:
var widenedData = path.Data.GetWidenedPathGeometry(new Pen { ... });
Где параметры пера устанавливаются из path.Stroke, path.StrokeWidth и т.д.
После этого, используйте один из вышеупомянутых методов, заменяя «путь.Data» на «расширенныйData».
спасибо ... Я это сделаю. –