Нарисовать круг из центра - 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);
}