Нарисовать круг из центра - C#

Узнай цену своей работы

Формулировка задачи:

Нужно заполнить две матрицы из центра, квадратом и кругом (далее для простоты буду использовать попиксельное рисование текстуры). С квадратом разобрался
        Texture2D textrure = new Texture2D(256,256);
        int posX = 100;
        int posY = 100;
        int radius = 25;
        int step = 1;
 
        while(step < radius)
        {
            for(int x = 0; x < step; x++)
            {
                textrure.SetPixel(posX,posY);
                posX--;
            }
 
            for(int x = 0; x < step; x++)
            {
                textrure.SetPixel(posX,posY);
                posY--;
            }
 
            for(int x = 0; x < step; x++)
            {
                textrure.SetPixel(posX,posY);
                posX++;
            }
 
            for(int x = 0; x < step; x++)
            {
                textrure.SetPixel(posX,posY);
                posY++;
            }
 
            posY++;
            posX++;
            step += 2;
        }
    }
круг рисуется так
        int xi = 100, 
        int yi = 100, 
        int radius = 20;
 
        for (int x = xi - radius + 1; x < xi + radius; x++)
        {
            for (int y = yi - radius + 1; y < yi + radius; y++)
            {
                if ((x - xi) * (x - xi) + (y - yi) * (y - yi) <= radius * radius)
                {
                    texture.SetPixel(x, y);
                }
            }
        }
но не из центра, а с угла, и я никак не могу совместить эти два метода без корявых костылей, подскажите как правильно сделать.

Решение задачи: «Нарисовать круг из центра»

textual
Листинг программы
        private static void DrawStrangeCircle(int raduisInPixels,int onePointWidth,int fontsize,Point center,Graphics g)
        {
            bool drawedSomething = true;
            int currentnumber = 1;
            List< Point> corners = new List<Point> {
            new Point(center.X+onePointWidth/2, center.Y-onePointWidth/2),
            new Point(center.X-onePointWidth/2, center.Y-onePointWidth/2),
            new Point(center.X-onePointWidth/2, center.Y+onePointWidth/2),
            new Point(center.X+onePointWidth/2, center.Y+onePointWidth/2),
            };
 
            for (int i=1;drawedSomething;i++)
            {
                drawedSomething = false;
                if(currentnumber>1)
              corners = new List<Point> {
            new Point(corners[0].X+onePointWidth, corners[0].Y-onePointWidth),
            new Point(corners[1].X-onePointWidth, corners[1].Y-onePointWidth),
            new Point(corners[2].X-onePointWidth, corners[2].Y+onePointWidth),
            new Point(corners[3].X+onePointWidth, corners[3].Y+onePointWidth),
            };
                int direction = 0;
                Point current = corners[0];
                bool first = true;
                bool end = false;
                while(!end)
                {
                    switch (direction)
                    {
                        case 0:
                            if (current.X > corners[1].X)
                            {
                                if (first) { first = false; }
                                else current = new Point(current.X - onePointWidth, current.Y);
                            }
                            else
                            {
                                direction++;  continue;
                            }
                            break;
                        case 1:
                            if (current.Y < corners[2].Y)
                            {
                                current = new Point(current.X , current.Y + onePointWidth);
                            }
                            else
                            {
                                direction++; continue;
                            }
                            break;
                        case 2:
                            if (current.X < corners[3].X)
                            {
                                current = new Point(current.X + onePointWidth, current.Y);
                            }
                            else
                            {
                                direction++;  continue;
                            }
                            break;
                        case 3:
                            if (current.Y > corners[0].Y + onePointWidth)
                            {
                                current = new Point(current.X , current.Y - onePointWidth);
                            }
                            else
                            {
                                end = true; continue;
                            }
                            break;
                    }
                    if (CircleContains(center, raduisInPixels, current))
                    { 
                        drawedSomething = true;
                        g.DrawString(currentnumber.ToString(), new Font(FontFamily.GenericSerif, fontsize), Brushes.Black,current);
                        g.DrawRectangle(Pens.Red, new Rectangle(current, new Size(onePointWidth, onePointWidth)));
                        currentnumber++;
                    }
                }
            }
        }
 
        public static bool CircleContains(Point center, float radius, Point point)
        {
            var f = Math.Pow(center.X - point.X, 2) + Math.Pow(center.Y - point.Y, 2);
            return f <= Math.Pow(radius, 2);
        }
 
        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            DrawStrangeCircle(120, 30, 15, new Point(150, 150), e.Graphics);
        }

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


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

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

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