2010-04-07 3 views
2

Учитывая этот путь один:Точка пересечения в SilverLight/МОФ

<Path Stretch="Fill" Stroke="#FFD69436" Data="M 0,20 L 22.3,20 L 34,0 L 44.7,20 L 68,20 L 55.8,40 L 68,60 L 44.7,60 L 34,80 L 22.3,60 L 0,60 L 11.16,40 L 0,20 Z"> 
      <Path.Fill> 
       <LinearGradientBrush StartPoint="0,0" EndPoint="0,1"> 
        <LinearGradientBrush.GradientStops> 
         <GradientStop Color="#FFFFFF" Offset="0" /> 
         <GradientStop Color="Orange" Offset="1" /> 
        </LinearGradientBrush.GradientStops> 
       </LinearGradientBrush> 
      </Path.Fill> 
     </Path> 

Как я могу получить точку, на краю этой фигуры под любым углом? Предположим, что мне нужна точка пересечения между краем этого рисунка и линией, проходящей через центр этой фигуры, под углом 30 градусов с топором OX?

спасибо.

ответ

5

Существует множество различных способов сделать это, в зависимости от производительности и точности, которые вам нужны, и от того, какой геометрический код вы хотите написать.

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».

+0

спасибо ... Я это сделаю. –

1

Вы, ребята, знаете, что эквивалентно этому в Silverlight 3? Я пытаюсь сделать это для WP7, и похоже, что это Paths.Data - это простой объект Geometry, который не показывает фигуры или методы, которые вы упомянули.

Великий ответ, кстати, это действительно помогло мне, я пытаюсь получить коллекцию точки из пути, и это он, он просто doesnn't работу для мобильного :)

+0

То же самое, это не помогает, хотя, поскольку на WP7 эти методы недоступны. Я хочу, чтобы они были там. :( – Marc

+0

Однако это http://stringtopathgeometry.codeplex.com/, и это может помочь http://www.codeproject.com/KB/silverlight/PathAnimation.aspx – Marc

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