Нарисовать необычную фигуру - 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);
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.5 из 5
Похожие ответы