Как нарисовать сечение круга, используя System.Windows.Shapes.Path? - PullRequest
3 голосов
/ 03 ноября 2011

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

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

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

Ответы [ 2 ]

4 голосов
/ 03 ноября 2011

Вам нужно будет построить строку, которая идентифицирует путь, используя дугу, которая поддерживается 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, который вы будете использовать при определении пути.

3 голосов
/ 03 ноября 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 по часовой стрелке.

...