Нарисовать круг из центра - 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); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д