@@ -261,44 +261,62 @@ private static Point GetPoint(Rect rect, double a, double r)
261261 /// <param name="aligned">Флаг выравнивания</param>
262262 private static void DrawGeometry ( StreamGeometryContext g , Rect rect , double R , double r , double start , double stop , bool aligned )
263263 {
264+ // Получаем ширину и высоту прямоугольника
264265 var w = rect . Width ;
265266 var h = rect . Height ;
266267 if ( w <= 0 || h <= 0 ) return ;
268+
269+ // Вычисляем центральную точку прямоугольника
267270 var p0 = new Point ( 0.5 * rect . Width + rect . Left , 0.5 * rect . Height + rect . Top ) ;
268271
269- Func < double , double , double > min = Math . Min ;
270- var a = min ( start , stop ) ;
272+ // Нормализуем углы: a - меньший угол, b - больший угол
273+ var a = Math . Min ( start , stop ) ;
271274 var b = Math . Max ( start , stop ) ;
272- var d = b - a ;
275+ var d = b - a ; // Разница углов (угол раствора сектора)
273276 if ( d is 0d ) return ;
274277
278+ // Если включено выравнивание, приводим к квадрату по меньшей стороне
275279 if ( aligned )
276280 {
277- w = min ( w , h ) ;
278- h = min ( w , h ) ;
281+ w = Math . Min ( w , h ) ;
282+ h = Math . Min ( w , h ) ;
279283 }
280284
281- var in_arc_stop = GetPoint ( rect , a , r ) ;
282- var out_arc_start = GetPoint ( rect , a , R ) ;
283- var out_arc_stop = GetPoint ( rect , b , R ) ;
284- var in_arc_start = GetPoint ( rect , b , r ) ;
285-
285+ // Вычисляем ключевые точки для построения сектора:
286+ var in_arc_stop = GetPoint ( rect , a , r ) ; // конечная точка внутренней дуги (начальный угол)
287+ var out_arc_start = GetPoint ( rect , a , R ) ; // начальная точка внешней дуги (начальный угол)
288+ var out_arc_stop = GetPoint ( rect , b , R ) ; // конечная точка внешней дуги (конечный угол)
289+ var in_arc_start = GetPoint ( rect , b , r ) ; // начальная точка внутренней дуги (конечный угол)
286290
291+ // Определяем тип дуги (большая дуга если угол > 180°)
287292 var arc_isout = d > 180.0 ;
293+
294+ // Вычисляем размеры эллипсов для внутренней и внешней дуг
288295 var in_arc_size = new Size ( r * w / 2 , r * h / 2 ) ;
289296 var out_arc_size = new Size ( R * w / 2 , R * h / 2 ) ;
290297
298+ // Проверяем, является ли сектор просто линией (внутренний и внешний радиусы почти равны)
291299 var line_only = Math . Abs ( R - r ) < 0.001 ;
300+
301+ // Начинаем построение фигуры
292302 if ( line_only )
293- g . BeginFigure ( out_arc_start , false , true ) ;
303+ g . BeginFigure ( out_arc_start , false , true ) ; // Только дуга, без заливки
294304 else
295305 {
306+ // Начинаем с центра (если r = 0) или с точки на внутренней дуге
296307 g . BeginFigure ( r is 0d ? p0 : in_arc_stop , true , true ) ;
297- g . LineTo ( out_arc_start , true , true ) ;
308+ g . LineTo ( out_arc_start , true , true ) ; // Линия к началу внешней дуги
298309 }
310+
311+ // Рисуем внешнюю дугу от начального до конечного угла по часовой стрелке
299312 g . ArcTo ( out_arc_stop , out_arc_size , 0 , arc_isout , SweepDirection . Clockwise , true , true ) ;
300- if ( r is 0d || line_only ) return ;
313+
314+ if ( r is 0d || line_only ) return ; // Если внутренний радиус 0 или это линия, завершаем
315+
316+ // Рисуем линию к началу внутренней дуги
301317 g . LineTo ( in_arc_start , true , true ) ;
318+
319+ // Рисуем внутреннюю дугу от конечного до начального угла против часовой стрелки
302320 g . ArcTo ( in_arc_stop , in_arc_size , 0 , arc_isout , SweepDirection . Counterclockwise , true , true ) ;
303321 }
304322}
0 commit comments