Как нарисовать часть круга с помощью System.Windows.Shapes.Path?

У меня есть приложение Silverlight, в котором я рисую линии на изображении, создавая экземпляр System.Windows.Shapes.Line, а затем добавляя его в MainCanvas.Children.

Я хотел бы аналогичным образом добавить несколько сегментов круга. Если я правильно понимаю, я хочу использовать класс Path.

У меня есть следующее требование. У меня есть (x, y) координаты центра круга. У меня есть радиус r. Мне нужно нарисовать дугу, которая является подмножеством круга с центром (x, y) и радиусом r. У меня есть два угла a1 и a2, между которыми мне нужно провести дугу.

Как я могу это сделать?


person Vivian River    schedule 03.11.2011    source источник


Ответы (2)


Вам нужно будет создать строку, идентифицирующую путь, используя дугу, которая поддерживается WPF. Строка соответствует синтаксису на этой странице.

Однако параметры сначала должны быть преобразованы в формат дуги, указанный в синтаксисе, поскольку используемые значения немного отличаются:

Сначала преобразуйте углы a1 и a2 в радианы, если это еще не сделано.

a1=a1*Math.PI/180;
a2=a2*Math.PI/180;

Затем вычислите начальную и конечную точки дуги:

double startX = centerX+Math.Cos(a1)*r;
double startY = centerY+Math.Sin(a1)*r;
double endX = centerX+Math.Cos(a2)*r;
double endY = centerY+Math.Sin(a2)*r;

Затем вычислите, равна ли разница между углами PI или больше, а затем вычислите, меньше ли a1, чем a2.

bool largeArc = Math.Abs(a2-a1)>=Math.PI;
bool sweep = (a1<a2);

Наконец, постройте путь.

string path=String.Format(System.Globalization.CultureInfo.InvariantCulture,
     "M {0},{1} A {2},{3} 0 {4} {5} {6},{7}",startX,startY,r,r,
     largeArc ? 1 : 0, sweep ? 1 : 0,endX,endY);

Это строка пути, а не объект Path, который вы будете использовать при определении пути.

person Peter O.    schedule 03.11.2011

Вам следует использовать синтаксис PathGeometry.

Рассмотрим что-то вроде:

<Path Stroke="Black" Fill="Transparent">
  <Path.Data>
    <PathGeometry Figures="M 0,0 A 15,15 90 0 1 15,15" />
  </Path.Data>
</Path>

Это нарисует дугу окружности под углом 90 градусов, начиная с 0,0 и заканчивая 15,15 по часовой стрелке.

person FMM    schedule 03.11.2011