Нарисовать необычную фигуру - C#
Формулировка задачи:
Необходимо нарисовать вот это. Для этого нужно знать все линии каждого сегмента т.е. массив линий образующих это сегмент, затем рисовать закрашивая данный сегмент, а затем контур этого сегмента. Но как получить линии каждого из сегмента не приходит в голову, не могу придумать алгоритм.
Решение задачи: «Нарисовать необычную фигуру»
textual
Листинг программы
- class MainForm: Form
- {
- public MainForm()
- {
- Size = new Size(400, 400);
- int totalSectors = 7;
- int totalNumbers = 10;
- float smallRadius = 10;
- float bigRadius = 135;
- float centerX = 200;
- float centerY = 200;
- Paint += (s, a) =>
- {
- a.Graphics.TranslateTransform(centerX, centerY);
- a.Graphics.RotateTransform(-90);
- a.Graphics.SmoothingMode = SmoothingMode.HighQuality;
- a.Graphics.DrawLine(Pens.Blue, -0.1f, -0.1f, 0.1f, 0.1f);
- for (int sector = 0; sector < totalSectors; sector++)
- for (int fromCenter = 0; fromCenter < totalNumbers; fromCenter++)
- {
- var gp = GetArea(sector, totalSectors, fromCenter, totalNumbers, smallRadius, bigRadius);
- //a.Graphics.DrawPath(Pens.Red, gp);
- a.Graphics.FillPath(Guid.NewGuid().GetHashCode() % 2 == 0 ? Brushes.Blue : Brushes.Green, gp);
- }
- };
- }
- private GraphicsPath GetArea(
- int sectorNumber, int totalSectors,
- int fromCenterNumber, int totalNumbers,
- float smallRadius, float bigRadius)
- {
- double deltaAngle = 2 * Math.PI / totalSectors;
- double directionAngle = deltaAngle * sectorNumber;
- double deltaRadius = (bigRadius - smallRadius) / totalNumbers;
- double minorRadius = deltaRadius * fromCenterNumber + smallRadius;
- double majorRadius = minorRadius + deltaRadius;
- var minorRectangle = new RectangleF(-(float)minorRadius, -(float)minorRadius,
- (float) (2 * minorRadius), (float) (2 * minorRadius));
- var majorRectangle = minorRectangle;
- majorRectangle.Inflate((float)deltaRadius, (float)deltaRadius);
- var g = new GraphicsPath();
- g.AddArc(minorRectangle, ToDegrees(directionAngle + deltaAngle), ToDegrees(-deltaAngle));
- g.AddLine((float)(Math.Cos(directionAngle) * minorRadius), (float)(Math.Sin(directionAngle) * minorRadius),
- (float)(Math.Cos(directionAngle) * majorRadius), (float)(Math.Sin(directionAngle) * majorRadius));
- g.AddArc(majorRectangle, ToDegrees(directionAngle), ToDegrees(deltaAngle));
- g.CloseFigure();
- return g;
- }
- private float ToDegrees(double angle)
- {
- return (float)(angle * 360 / 2 / Math.PI);
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д