Допустим, у вас есть сплайн Безье, нарисованный на холсте следующим образом:

<Canvas x:Name="SomeCanvas" Width="50" Height="50" Background="Black">
    <Path x:Name="SomePath" Data="M0,0C10,10 10,50 50,10" Stroke="Yellow" StrokeThickness="1"/>
</Canvas>

Как бы вы определяли, какие пиксели на холсте пересекаются центром пути (то есть толщина штриха не учитывается)?

4
johnildergleidisson 20 Авг 2014 в 19:06

1 ответ

Лучший ответ

Если вы имеете в виду, что хотите найти центральную точку вдоль пути. Я думаю, нам нужно что-то сделать с данными пути, которые на самом деле являются Geometry. Geometry имеет метод под названием GetFlattenedGeometryPath, возвращающий PathGeometry, который имеет метод под названием GetPointAtFractionLength. Итак, вы можете попробовать что-то вроде этого:

 Point centerPoint;
 Point tg;
 SomePath.Data.GetFlattenedGeometryPath()
              .GetPointAtFractionLength(0.5, out centerPoint, out tg);

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

Point p;
Point tg;
var points = new List<Point>();
for(var i = 0; i < 1000; i++){
  SomePath.Data.GetFlattenedGeometryPath()
               .GetPointAtFractionLength(i / 1000f, out p, out tg);
  points.Add(p);
}
4
King King 20 Авг 2014 в 23:31
1
Я действительно имел в виду найти все точки, и я действительно понимаю, что в векторном рисовании есть (технически) бесконечные точки на пути. Должен быть способ сделать это, переместив все точки холста и найдя те, по которым проходит путь - хотя я бы подумал, что на холсте большего размера это было бы намного неэффективнее. Однако ваше решение уже очень, и я повторяю, очень много того, что я искал! : D
 – 
johnildergleidisson
20 Авг 2014 в 23:28