Skip to content

Commit 91d8689

Browse files
committed
Улучшена читаемость и комментирование DrawGeometry
Добавлены подробные комментарии к этапам построения сектора в методе DrawGeometry класса Pie. Удалена лишняя функция min, вместо неё используется Math.Min. Добавлены проверки на граничные случаи, улучшена структура и понятность кода.
1 parent 88f8358 commit 91d8689

1 file changed

Lines changed: 31 additions & 13 deletions

File tree

MathCore.WPF/Shapes/Pie.cs

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)